mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
parent
ab42ca4296
commit
b649246fe2
9 changed files with 209 additions and 53 deletions
|
@ -3,9 +3,9 @@
|
|||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use ipc_channel::ipc::IpcSharedMemory;
|
||||
use png;
|
||||
use piston_image::{self, DynamicImage, GenericImage};
|
||||
use stb_image::image as stb_image2;
|
||||
use std::mem;
|
||||
use std::error::Error;
|
||||
use util::mem::HeapSizeOf;
|
||||
use util::vec::byte_swap;
|
||||
|
||||
|
@ -48,41 +48,10 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> {
|
|||
return None;
|
||||
}
|
||||
|
||||
if png::is_png(buffer) {
|
||||
match png::load_png_from_memory(buffer) {
|
||||
Ok(mut png_image) => {
|
||||
let (bytes, format) = match png_image.pixels {
|
||||
png::PixelsByColorType::K8(ref mut data) => {
|
||||
(data, PixelFormat::K8)
|
||||
}
|
||||
png::PixelsByColorType::KA8(ref mut data) => {
|
||||
(data, PixelFormat::KA8)
|
||||
}
|
||||
png::PixelsByColorType::RGB8(ref mut data) => {
|
||||
byte_swap(data);
|
||||
(data, PixelFormat::RGB8)
|
||||
}
|
||||
png::PixelsByColorType::RGBA8(ref mut data) => {
|
||||
byte_swap_and_premultiply(data);
|
||||
(data, PixelFormat::RGBA8)
|
||||
}
|
||||
};
|
||||
if is_jpeg(buffer) {
|
||||
// For JPEG images, we use stb_image because piston_image does not yet support progressive
|
||||
// JPEG.
|
||||
|
||||
let bytes = mem::replace(bytes, Vec::new());
|
||||
let bytes = IpcSharedMemory::from_bytes(&bytes[..]);
|
||||
let image = Image {
|
||||
width: png_image.width,
|
||||
height: png_image.height,
|
||||
format: format,
|
||||
bytes: bytes,
|
||||
};
|
||||
|
||||
Some(image)
|
||||
}
|
||||
Err(_err) => None,
|
||||
}
|
||||
} else {
|
||||
// For non-png images, we use stb_image
|
||||
// Can't remember why we do this. Maybe it's what cairo wants
|
||||
static FORCE_DEPTH: usize = 4;
|
||||
|
||||
|
@ -111,6 +80,26 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> {
|
|||
None
|
||||
}
|
||||
}
|
||||
} else {
|
||||
match piston_image::load_from_memory(buffer) {
|
||||
Ok(image) => {
|
||||
let mut rgba = match image {
|
||||
DynamicImage::ImageRgba8(rgba) => rgba,
|
||||
image => image.to_rgba()
|
||||
};
|
||||
byte_swap_and_premultiply(&mut *rgba);
|
||||
Some(Image {
|
||||
width: rgba.width(),
|
||||
height: rgba.height(),
|
||||
format: PixelFormat::RGBA8,
|
||||
bytes: IpcSharedMemory::from_bytes(&*rgba),
|
||||
})
|
||||
}
|
||||
Err(e) => {
|
||||
debug!("Image decoding error: {:?}", e);
|
||||
None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -120,3 +109,7 @@ fn is_gif(buffer: &[u8]) -> bool {
|
|||
_ => false
|
||||
}
|
||||
}
|
||||
|
||||
fn is_jpeg(buffer: &[u8]) -> bool {
|
||||
buffer.starts_with(&[0xff, 0xd8, 0xff])
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue