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) { @@ -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, diff --git a/components/net/lib.rs b/components/net/lib.rs index b2a1ff97764..90999cfcf62 100644 --- a/components/net/lib.rs +++ b/components/net/lib.rs @@ -5,6 +5,7 @@ #![deny(unsafe_code)] #![feature(box_syntax)] #![feature(mpsc_select)] +#![feature(step_by)] extern crate brotli; extern crate cookie as cookie_rs; diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_mipmap.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_mipmap.html index 5391417795d..09ca0fba7ee 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_mipmap.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_mipmap.html @@ -106,6 +106,7 @@ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_NEAREST); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.generateMipmap(gl.TEXTURE_2D); diff --git a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html index f3bba7d4f2d..3defd7a5f96 100644 --- a/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html +++ b/tests/wpt/mozilla/tests/mozilla/webgl/tex_image_2d_simple.html @@ -106,6 +106,7 @@ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST); + gl.pixelStorei(gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, true); gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image); gl.drawArrays(gl.TRIANGLES, 0, 6);