aboutsummaryrefslogtreecommitdiffstats
path: root/components/net/image_cache_thread.rs
diff options
context:
space:
mode:
authorJamie Nicol <jnicol@mozilla.com>2017-02-28 13:04:20 +0000
committerGlenn Watson <github@intuitionlibrary.com>2017-03-10 11:06:44 +1000
commitec3142e81178c45bb678cd78ef0518384acc535d (patch)
tree420439b42b6603f483c99b8bc96b872fc57b0734 /components/net/image_cache_thread.rs
parentee223798cc72bf81a4b2bb6849697de617c5f028 (diff)
downloadservo-ec3142e81178c45bb678cd78ef0518384acc535d.tar.gz
servo-ec3142e81178c45bb678cd78ef0518384acc535d.zip
Premultiply RGBA image data before sending to webrender
Diffstat (limited to 'components/net/image_cache_thread.rs')
-rw-r--r--components/net/image_cache_thread.rs18
1 files changed, 18 insertions, 0 deletions
diff --git a/components/net/image_cache_thread.rs b/components/net/image_cache_thread.rs
index 2ead7e06db6..a9cdca099d7 100644
--- a/components/net/image_cache_thread.rs
+++ b/components/net/image_cache_thread.rs
@@ -336,6 +336,21 @@ fn get_placeholder_image(webrender_api: &webrender_traits::RenderApi) -> io::Res
Ok(Arc::new(image))
}
+fn premultiply(data: &mut [u8]) {
+ let length = data.len();
+
+ for i in (0..length).step_by(4) {
+ let b = data[i + 0] as u32;
+ let g = data[i + 1] as u32;
+ let r = data[i + 2] as u32;
+ let a = data[i + 3] as u32;
+
+ data[i + 0] = (b * a / 255) as u8;
+ data[i + 1] = (g * a / 255) as u8;
+ data[i + 2] = (r * a / 255) as u8;
+ }
+}
+
impl ImageCache {
fn run(webrender_api: webrender_traits::RenderApi,
ipc_command_receiver: IpcReceiver<ImageCacheCommand>) {
@@ -484,6 +499,9 @@ impl ImageCache {
let format = convert_format(image.format);
let mut bytes = Vec::new();
bytes.extend_from_slice(&*image.bytes);
+ if format == webrender_traits::ImageFormat::RGBA8 {
+ premultiply(bytes.as_mut_slice());
+ }
let descriptor = webrender_traits::ImageDescriptor {
width: image.width,
height: image.height,