aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
authorbors-servo <metajack+bors@gmail.com>2015-08-06 04:34:20 -0600
committerbors-servo <metajack+bors@gmail.com>2015-08-06 04:34:20 -0600
commit4726f58d15a6bfed9614b7ceaaab7765a5c01d03 (patch)
tree80f3e66f47d025cf26dc5cce6c147627a9cb12c8 /components/script/dom/canvasrenderingcontext2d.rs
parent172f046688c600c9f51f8db0380e399f6372fe4d (diff)
parentfee8abe5a2b5f942646b381890d03c5661ab496e (diff)
downloadservo-4726f58d15a6bfed9614b7ceaaab7765a5c01d03.tar.gz
servo-4726f58d15a6bfed9614b7ceaaab7765a5c01d03.zip
Auto merge of #6970 - dzbarsky:getimagedata, r=Ms2ger
GetImageData should return un-premultiplied alpha values <!-- Reviewable:start --> [<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6970) <!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs13
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)))
}