diff options
-rw-r--r-- | components/net/image/base.rs | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/components/net/image/base.rs b/components/net/image/base.rs index 4acbd35cb75..46436ef8406 100644 --- a/components/net/image/base.rs +++ b/components/net/image/base.rs @@ -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 + } +} |