From a3465d2962f9c87d92154061515cc71467c4040a Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Wed, 10 Sep 2014 16:57:14 -0700 Subject: [PATCH] net: Premultiply alpha in PNGs. Closes #2857. --- components/net/image/base.rs | 19 +++++++++++++++++-- tests/ref/acid2_ref_broken.png | Bin 2174 -> 1951 bytes tests/ref/alpha_png_a.html | 13 +++++++++++++ tests/ref/alpha_png_a.png | Bin 0 -> 16430 bytes tests/ref/alpha_png_b.html | 13 +++++++++++++ tests/ref/alpha_png_b.png | Bin 0 -> 16643 bytes tests/ref/basic.list | 1 + 7 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 tests/ref/alpha_png_a.html create mode 100644 tests/ref/alpha_png_a.png create mode 100644 tests/ref/alpha_png_b.html create mode 100644 tests/ref/alpha_png_b.png diff --git a/components/net/image/base.rs b/components/net/image/base.rs index deda4ee8556..37f53f509a4 100644 --- a/components/net/image/base.rs +++ b/components/net/image/base.rs @@ -27,6 +27,20 @@ fn byte_swap(data: &mut [u8]) { } } +// TODO(pcwalton): Speed up with SIMD, or better yet, find some way to not do this. +fn byte_swap_and_premultiply(data: &mut [u8]) { + let length = data.len(); + for i in range_step(0, length, 4) { + let r = data[i + 2]; + let g = data[i + 1]; + let b = data[i + 0]; + let a = data[i + 3]; + data[i + 0] = ((r as u32) * (a as u32) / 255) as u8; + data[i + 1] = ((g as u32) * (a as u32) / 255) as u8; + data[i + 2] = ((b as u32) * (a as u32) / 255) as u8; + } +} + pub fn load_from_memory(buffer: &[u8]) -> Option { if buffer.len() == 0 { return None; @@ -36,8 +50,9 @@ pub fn load_from_memory(buffer: &[u8]) -> Option { match png::load_png_from_memory(buffer) { Ok(mut png_image) => { match png_image.pixels { - png::RGB8(ref mut data) | png::RGBA8(ref mut data) => { - byte_swap(data.as_mut_slice()); + png::RGB8(ref mut data) => byte_swap(data.as_mut_slice()), + png::RGBA8(ref mut data) => { + byte_swap_and_premultiply(data.as_mut_slice()) } _ => {} } diff --git a/tests/ref/acid2_ref_broken.png b/tests/ref/acid2_ref_broken.png index 91c803bdadc33ee0abd2a05d05dc2ef3f6ddb1f7..e46e613846c5012a6d5da7a3135baf3d26da3331 100644 GIT binary patch literal 1951 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 + + +Kaboom + + + + + diff --git a/tests/ref/alpha_png_a.png b/tests/ref/alpha_png_a.png new file mode 100644 index 0000000000000000000000000000000000000000..bfce3165adf53ef6f2ae389300826d145d03ad38 GIT binary patch literal 16430 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 IM6N<$f@ii9CjbBd literal 0 HcmV?d00001 diff --git a/tests/ref/alpha_png_b.html b/tests/ref/alpha_png_b.html new file mode 100644 index 00000000000..d948302cee0 --- /dev/null +++ b/tests/ref/alpha_png_b.html @@ -0,0 +1,13 @@ + + + +Kaboom + + + + + diff --git a/tests/ref/alpha_png_b.png b/tests/ref/alpha_png_b.png new file mode 100644 index 0000000000000000000000000000000000000000..65c0375770ce7997e3469b7b89b0ad46b79a2bb7 GIT binary patch literal 16643 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