diff options
author | David Zbarsky <dzbarsky@gmail.com> | 2015-08-03 20:09:18 -0400 |
---|---|---|
committer | David Zbarsky <dzbarsky@gmail.com> | 2015-08-06 05:14:53 -0400 |
commit | fee8abe5a2b5f942646b381890d03c5661ab496e (patch) | |
tree | 977226741737d8c6bad32f8ec18e9cc21c6581e2 /components/script/dom/canvasrenderingcontext2d.rs | |
parent | 1b54e9c30c12b42d2a6eaf5b81b88a0f4e02ebb9 (diff) | |
download | servo-fee8abe5a2b5f942646b381890d03c5661ab496e.tar.gz servo-fee8abe5a2b5f942646b381890d03c5661ab496e.zip |
GetImageData should return un-premultiplied alpha values
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 502f632cecc..c9f8da05bff 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -901,7 +901,18 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D { self.ipc_renderer .send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(dest_rect, canvas_size, sender))) .unwrap(); - let data = receiver.recv().unwrap(); + let mut data = receiver.recv().unwrap(); + + // Un-premultiply alpha + // TODO: may want a precomputed un-premultiply table to make this fast. + // https://github.com/servo/servo/issues/6969 + for chunk in data.chunks_mut(4) { + let alpha = chunk[3] as f32 / 255.; + chunk[0] = (chunk[0] as f32 / alpha) as u8; + chunk[1] = (chunk[1] as f32 / alpha) as u8; + chunk[2] = (chunk[2] as f32 / alpha) as u8; + } + Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), Some(data))) } |