diff options
author | David Zbarsky <dzbarsky@gmail.com> | 2015-08-04 17:14:15 -0400 |
---|---|---|
committer | David Zbarsky <dzbarsky@gmail.com> | 2015-08-08 15:43:22 -0400 |
commit | 2f47bdff4b9e2181426742231f2a45f340bf1ca1 (patch) | |
tree | 50b7cace16e3af0e5ee6a692db01e50364f8dfb8 /components/script/dom/canvasrenderingcontext2d.rs | |
parent | 0a8ea98183ec813e490096b20e2c04db425d7b0b (diff) | |
download | servo-2f47bdff4b9e2181426742231f2a45f340bf1ca1.tar.gz servo-2f47bdff4b9e2181426742231f2a45f340bf1ca1.zip |
Fix getImageData with sizes < 1 pixel
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index c9f8da05bff..4e25cceb4c0 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -32,6 +32,7 @@ use euclid::size::Size2D; use canvas_traits::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg}; use canvas_traits::{FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle, RepetitionStyle}; use canvas_traits::{LineCapStyle, LineJoinStyle, CompositionOrBlending}; +use canvas::canvas_paint_task::RectToi32; use msg::constellation_msg::Msg as ConstellationMsg; use net_traits::image_cache_task::{ImageCacheChan, ImageResponse}; @@ -298,7 +299,7 @@ impl CanvasRenderingContext2D { let renderer = context.r().get_ipc_renderer(); let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap(); // Reads pixels from source image - renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect, + renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect.to_i32(), image_size, sender))).unwrap(); let imagedata = receiver.recv().unwrap(); @@ -377,7 +378,8 @@ impl CanvasRenderingContext2D { let renderer = context.r().get_ipc_renderer(); let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap(); // Reads pixels from source canvas - renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect, image_size, sender))).unwrap(); + renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::GetImageData(source_rect.to_i32(), + image_size, sender))).unwrap(); return Some((receiver.recv().unwrap(), image_size)); } @@ -884,18 +886,30 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D { sy: Finite<f64>, sw: Finite<f64>, sh: Finite<f64>) -> Fallible<Root<ImageData>> { - let sx = *sx; - let sy = *sy; - let sw = *sw; - let sh = *sh; + let mut sx = *sx; + let mut sy = *sy; + let mut sw = *sw; + let mut sh = *sh; if sw == 0.0 || sh == 0.0 { return Err(IndexSize) } + if sw < 0.0 { + sw = -sw; + sx -= sw; + } + if sh < 0.0 { + sh = -sh; + sy -= sh; + } + + let sh = cmp::max(1, sh.to_u32().unwrap()); + let sw = cmp::max(1, sw.to_u32().unwrap()); + let (sender, receiver) = ipc::channel::<Vec<u8>>().unwrap(); - let dest_rect = Rect::new(Point2D::new(sx as f64, sy as f64), - Size2D::new(sw as f64, sh as f64)); + let dest_rect = Rect::new(Point2D::new(sx.to_i32().unwrap(), sy.to_i32().unwrap()), + Size2D::new(sw as i32, sh as i32)); let canvas_size = self.canvas.root().r().get_size(); let canvas_size = Size2D::new(canvas_size.width as f64, canvas_size.height as f64); self.ipc_renderer @@ -913,7 +927,7 @@ impl<'a> CanvasRenderingContext2DMethods for &'a CanvasRenderingContext2D { 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))) + Ok(ImageData::new(self.global.root().r(), sw, sh, Some(data))) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata |