diff options
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 2984a60c270..4b2232ee2f5 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -4,19 +4,24 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods; +use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; +use dom::bindings::error::Error::IndexSize; +use dom::bindings::error::Fallible; use dom::bindings::global::{GlobalRef, GlobalField}; use dom::bindings::js::{JS, JSRef, LayoutJS, Temporary}; use dom::bindings::utils::{Reflector, reflect_dom_object}; -use dom::htmlcanvaselement::HTMLCanvasElement; +use dom::htmlcanvaselement::{HTMLCanvasElement, HTMLCanvasElementHelpers}; +use dom::imagedata::{ImageData, ImageDataHelpers}; use geom::point::Point2D; use geom::rect::Rect; use geom::size::Size2D; use canvas::canvas_paint_task::{CanvasMsg, CanvasPaintTask}; -use canvas::canvas_paint_task::CanvasMsg::{ClearRect, Close, FillRect, Recreate, StrokeRect}; +use canvas::canvas_paint_task::CanvasMsg::{ClearRect, Close, FillRect, Recreate, StrokeRect, GetImageData, PutImageData}; -use std::sync::mpsc::Sender; +use std::num::{Float, ToPrimitive}; +use std::sync::mpsc::{channel, Sender}; #[dom_struct] pub struct CanvasRenderingContext2D { @@ -75,6 +80,52 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> let rect = Rect(Point2D(x as f32, y as f32), Size2D(width as f32, height as f32)); self.renderer.send(StrokeRect(rect)).unwrap(); } + + fn CreateImageData(self, sw: f64, sh: f64) -> Fallible<Temporary<ImageData>> { + if sw == 0.0 || sh == 0.0 { + return Err(IndexSize) + } + + Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), None)) + } + + fn CreateImageData_(self, imagedata: JSRef<ImageData>) -> Fallible<Temporary<ImageData>> { + Ok(ImageData::new(self.global.root().r(), imagedata.Width(), imagedata.Height(), None)) + } + + fn GetImageData(self, sx: f64, sy: f64, sw: f64, sh: f64) -> Fallible<Temporary<ImageData>> { + if sw == 0.0 || sh == 0.0 { + return Err(IndexSize) + } + + let (sender, receiver) = channel::<Vec<u8>>(); + let dest_rect = Rect(Point2D(sx.to_i32().unwrap(), sy.to_i32().unwrap()), Size2D(sw.to_i32().unwrap(), sh.to_i32().unwrap())); + let canvas_size = self.canvas.root().r().get_size(); + self.renderer.send(GetImageData(dest_rect, canvas_size, sender)).unwrap(); + let data = receiver.recv().unwrap(); + Ok(ImageData::new(self.global.root().r(), sw.abs().to_u32().unwrap(), sh.abs().to_u32().unwrap(), Some(data))) + } + + fn PutImageData(self, imagedata: JSRef<ImageData>, dx: f64, dy: f64) { + let data = imagedata.get_data_array(&self.global.root().r()); + let image_data_rect = Rect(Point2D(dx.to_i32().unwrap(), dy.to_i32().unwrap()), imagedata.get_size()); + let dirty_rect = None; + let canvas_size = self.canvas.root().r().get_size(); + self.renderer.send(PutImageData(data, image_data_rect, dirty_rect, canvas_size)).unwrap() + } + + fn PutImageData_(self, imagedata: JSRef<ImageData>, dx: f64, dy: f64, + dirtyX: f64, dirtyY: f64, dirtyWidth: f64, dirtyHeight: f64) { + let data = imagedata.get_data_array(&self.global.root().r()); + let image_data_rect = Rect(Point2D(dx.to_i32().unwrap(), dy.to_i32().unwrap()), + Size2D(imagedata.Width().to_i32().unwrap(), + imagedata.Height().to_i32().unwrap())); + let dirty_rect = Some(Rect(Point2D(dirtyX.to_i32().unwrap(), dirtyY.to_i32().unwrap()), + Size2D(dirtyWidth.to_i32().unwrap(), + dirtyHeight.to_i32().unwrap()))); + let canvas_size = self.canvas.root().r().get_size(); + self.renderer.send(PutImageData(data, image_data_rect, dirty_rect, canvas_size)).unwrap() + } } #[unsafe_destructor] |