diff options
author | Rasmus Viitanen <rasviitanen@gmail.com> | 2019-10-16 20:18:14 +0200 |
---|---|---|
committer | Rasmus Viitanen <rasviitanen@gmail.com> | 2019-10-16 21:20:46 +0200 |
commit | 328809aebef8ee2d9346159c365d7ae0d46db644 (patch) | |
tree | ee24a3b84f6041918641be0c9690686380036f92 /components/script | |
parent | 6d488f1be24c1b679931d6d02703f4a10759eb49 (diff) | |
download | servo-328809aebef8ee2d9346159c365d7ae0d46db644.tar.gz servo-328809aebef8ee2d9346159c365d7ae0d46db644.zip |
fix getimagedata returns empty pixels
Diffstat (limited to 'components/script')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 49 | ||||
-rw-r--r-- | components/script/dom/offscreencanvasrenderingcontext2d.rs | 10 |
2 files changed, 28 insertions, 31 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index c964422c27c..999aab5320c 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -298,12 +298,9 @@ impl CanvasState { } } - pub fn get_rect(&self, canvas: Option<&HTMLCanvasElement>, rect: Rect<u32>) -> Vec<u8> { + pub fn get_rect(&self, canvas_size: Size2D<u32>, rect: Rect<u32>) -> Vec<u8> { assert!(self.origin_is_clean()); - // FIXME(nox): This is probably wrong when this is a context for an - // offscreen canvas. - let canvas_size = canvas.as_ref().map_or(Size2D::zero(), |c| c.get_size()); assert!(Rect::from_size(canvas_size).contains_rect(&rect)); let (sender, receiver) = ipc::bytes_channel().unwrap(); @@ -1020,7 +1017,7 @@ impl CanvasState { // https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata pub fn GetImageData( &self, - canvas: Option<&HTMLCanvasElement>, + canvas_size: Size2D<u32>, global: &GlobalScope, sx: i32, sy: i32, @@ -1039,9 +1036,6 @@ impl CanvasState { } let (origin, size) = adjust_size_sign(Point2D::new(sx, sy), Size2D::new(sw, sh)); - // FIXME(nox): This is probably wrong when this is a context for an - // offscreen canvas. - let canvas_size = canvas.as_ref().map_or(Size2D::zero(), |c| c.get_size()); let read_rect = match pixels::clip(origin, size, canvas_size) { Some(rect) => rect, None => { @@ -1054,20 +1048,14 @@ impl CanvasState { global, size.width, size.height, - Some(self.get_rect(canvas, read_rect)), + Some(self.get_rect(canvas_size, read_rect)), ) } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata - pub fn PutImageData( - &self, - canvas: Option<&HTMLCanvasElement>, - imagedata: &ImageData, - dx: i32, - dy: i32, - ) { + pub fn PutImageData(&self, canvas_size: Size2D<u32>, imagedata: &ImageData, dx: i32, dy: i32) { self.PutImageData_( - canvas, + canvas_size, imagedata, dx, dy, @@ -1082,7 +1070,7 @@ impl CanvasState { #[allow(unsafe_code)] pub fn PutImageData_( &self, - canvas: Option<&HTMLCanvasElement>, + canvas_size: Size2D<u32>, imagedata: &ImageData, dx: i32, dy: i32, @@ -1105,10 +1093,6 @@ impl CanvasState { // Step 2. // TODO: throw InvalidState if buffer is detached. - // FIXME(nox): This is probably wrong when this is a context for an - // offscreen canvas. - let canvas_size = canvas.as_ref().map_or(Size2D::zero(), |c| c.get_size()); - // Steps 3-6. let (src_origin, src_size) = adjust_size_sign( Point2D::new(dirty_x, dirty_y), @@ -1553,9 +1537,12 @@ impl CanvasRenderingContext2D { } pub fn get_rect(&self, rect: Rect<u32>) -> Vec<u8> { - self.canvas_state - .borrow() - .get_rect(self.canvas.as_ref().map(|c| &**c), rect) + self.canvas_state.borrow().get_rect( + self.canvas + .as_ref() + .map_or(Size2D::zero(), |c| c.get_size()), + rect, + ) } } @@ -1886,7 +1873,9 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata fn GetImageData(&self, sx: i32, sy: i32, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> { self.canvas_state.borrow().GetImageData( - self.canvas.as_ref().map(|c| &**c), + self.canvas + .as_ref() + .map_or(Size2D::zero(), |c| c.get_size()), &self.global(), sx, sy, @@ -1898,7 +1887,9 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata fn PutImageData(&self, imagedata: &ImageData, dx: i32, dy: i32) { self.canvas_state.borrow().PutImageData( - self.canvas.as_ref().map(|c| &**c), + self.canvas + .as_ref() + .map_or(Size2D::zero(), |c| c.get_size()), imagedata, dx, dy, @@ -1918,7 +1909,9 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { dirty_height: i32, ) { self.canvas_state.borrow().PutImageData_( - self.canvas.as_ref().map(|c| &**c), + self.canvas + .as_ref() + .map_or(Size2D::zero(), |c| c.get_size()), imagedata, dx, dy, diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs index d18cd00df54..bb2d1e73e96 100644 --- a/components/script/dom/offscreencanvasrenderingcontext2d.rs +++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs @@ -33,6 +33,8 @@ pub struct OffscreenCanvasRenderingContext2D { canvas: Option<Dom<OffscreenCanvas>>, canvas_state: DomRefCell<CanvasState>, htmlcanvas: Option<Dom<HTMLCanvasElement>>, + width: u32, + height: u32, } impl OffscreenCanvasRenderingContext2D { @@ -50,6 +52,8 @@ impl OffscreenCanvasRenderingContext2D { global, Size2D::new(size.width as u64, size.height as u64), )), + width: size.width as u32, + height: size.height as u32, } } @@ -307,7 +311,7 @@ impl OffscreenCanvasRenderingContext2DMethods for OffscreenCanvasRenderingContex // https://html.spec.whatwg.org/multipage/#dom-context-2d-getimagedata fn GetImageData(&self, sx: i32, sy: i32, sw: i32, sh: i32) -> Fallible<DomRoot<ImageData>> { self.canvas_state.borrow().GetImageData( - self.htmlcanvas.as_ref().map(|c| &**c), + Size2D::new(self.width, self.height), &self.global(), sx, sy, @@ -319,7 +323,7 @@ impl OffscreenCanvasRenderingContext2DMethods for OffscreenCanvasRenderingContex // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata fn PutImageData(&self, imagedata: &ImageData, dx: i32, dy: i32) { self.canvas_state.borrow().PutImageData( - self.htmlcanvas.as_ref().map(|c| &**c), + Size2D::new(self.width, self.height), imagedata, dx, dy, @@ -339,7 +343,7 @@ impl OffscreenCanvasRenderingContext2DMethods for OffscreenCanvasRenderingContex dirty_height: i32, ) { self.canvas_state.borrow().PutImageData_( - self.htmlcanvas.as_ref().map(|c| &**c), + Size2D::new(self.width, self.height), imagedata, dx, dy, |