aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
authorDavid Zbarsky <dzbarsky@gmail.com>2015-08-04 17:14:15 -0400
committerDavid Zbarsky <dzbarsky@gmail.com>2015-08-08 15:43:22 -0400
commit2f47bdff4b9e2181426742231f2a45f340bf1ca1 (patch)
tree50b7cace16e3af0e5ee6a692db01e50364f8dfb8 /components/script/dom/canvasrenderingcontext2d.rs
parent0a8ea98183ec813e490096b20e2c04db425d7b0b (diff)
downloadservo-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.rs32
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