auto merge of #5194 : hirschenberger/servo/gif_alpha_background, r=larsbergstrom

This is GIF specific. It's also done when the image is PNG but PNG is
handled separately with the PNG crate, whereas GIFs are handled by the
stb-image crate and the distinction between alpha and non-alpha-supporting
images was missing.
This commit is contained in:
bors-servo 2015-03-12 05:51:48 -06:00
commit 6593cf9ec4
6 changed files with 40 additions and 1 deletions

View file

@ -59,7 +59,12 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> {
match stb_image::load_from_memory_with_depth(buffer, FORCE_DEPTH, true) {
stb_image::LoadResult::ImageU8(mut image) => {
assert!(image.depth == 4);
byte_swap(image.data.as_mut_slice());
// handle gif separately because the alpha-channel has to be premultiplied
if is_gif(buffer) {
byte_swap_and_premultiply(image.data.as_mut_slice());
} else {
byte_swap(image.data.as_mut_slice());
}
Some(png::Image {
width: image.width as u32,
height: image.height as u32,
@ -77,3 +82,10 @@ pub fn load_from_memory(buffer: &[u8]) -> Option<Image> {
}
}
}
fn is_gif(buffer: &[u8]) -> bool {
match buffer {
[b'G',b'I',b'F',b'8', n, b'a', ..] if n == b'7' || n == b'9' => true,
_ => false
}
}