diff options
author | bors-servo <metajack+bors@gmail.com> | 2015-05-07 07:09:41 -0500 |
---|---|---|
committer | bors-servo <metajack+bors@gmail.com> | 2015-05-07 07:09:41 -0500 |
commit | 5f2a8494be44d57b74bda24f2fa6b6976f71531b (patch) | |
tree | 2c2410ec694249550ed156fdbaf1daa9925f0323 /components/script/dom | |
parent | 63ba1cb69b80d70c1d893ba80edd802cd326316d (diff) | |
parent | 53af4e4cb5c4bb5541cd67b582ff69406a42cdff (diff) | |
download | servo-5f2a8494be44d57b74bda24f2fa6b6976f71531b.tar.gz servo-5f2a8494be44d57b74bda24f2fa6b6976f71531b.zip |
Auto merge of #5949 - mmatyas:canvas_dirty, r=jdm
With this patch, it is now possible to create nice animations using the canvas.
<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/5949)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script/dom')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index c712c7920a8..6353479b116 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -6,6 +6,7 @@ use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasWindingRule; use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; +use dom::bindings::codegen::InheritTypes::NodeCast; use dom::bindings::codegen::UnionTypes::HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D; use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern; use dom::bindings::error::Error::{IndexSize, NotSupported, Type, InvalidState}; @@ -18,7 +19,7 @@ use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeSty use dom::htmlcanvaselement::{HTMLCanvasElement, HTMLCanvasElementHelpers}; use dom::htmlimageelement::{HTMLImageElement, HTMLImageElementHelpers}; use dom::imagedata::{ImageData, ImageDataHelpers}; -use dom::node::{window_from_node}; +use dom::node::{window_from_node, NodeHelpers, NodeDamage}; use cssparser::Color as CSSColor; use cssparser::{Parser, RGBA, ToCss}; @@ -118,6 +119,12 @@ impl CanvasRenderingContext2D { self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap(); } + fn mark_as_dirty(&self) { + let canvas = self.canvas.root(); + let node = NodeCast::from_ref(canvas.r()); + node.dirty(NodeDamage::OtherNodeDamage); + } + fn update_transform(&self) { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetTransform(self.state.borrow().transform))).unwrap() } @@ -220,6 +227,7 @@ impl CanvasRenderingContext2D { }; self.renderer.send(msg).unwrap(); + self.mark_as_dirty(); Ok(()) } @@ -239,6 +247,7 @@ impl CanvasRenderingContext2D { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::DrawImage( image_data, image_size, dest_rect, source_rect, smoothing_enabled))).unwrap(); + self.mark_as_dirty(); Ok(()) } @@ -456,6 +465,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> fn FillRect(self, x: f64, y: f64, width: f64, height: f64) { if let Some(rect) = self.create_drawable_rect(x, y, width, height) { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::FillRect(rect))).unwrap(); + self.mark_as_dirty(); } } @@ -463,6 +473,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> fn ClearRect(self, x: f64, y: f64, width: f64, height: f64) { if let Some(rect) = self.create_drawable_rect(x, y, width, height) { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::ClearRect(rect))).unwrap(); + self.mark_as_dirty(); } } @@ -470,6 +481,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> fn StrokeRect(self, x: f64, y: f64, width: f64, height: f64) { if let Some(rect) = self.create_drawable_rect(x, y, width, height) { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::StrokeRect(rect))).unwrap(); + self.mark_as_dirty(); } } @@ -487,11 +499,13 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> fn Fill(self, _: CanvasWindingRule) { // TODO: Process winding rule self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap(); + self.mark_as_dirty(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-stroke fn Stroke(self) { self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap(); + self.mark_as_dirty(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-clip @@ -868,7 +882,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> let image_data_size = Size2D(image_data_size.width as f64, image_data_size.height as f64); let image_data_rect = Rect(Point2D(dx, dy), image_data_size); let dirty_rect = None; - self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap() + self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap(); + self.mark_as_dirty(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-putimagedata @@ -893,7 +908,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> imagedata.Height() as f64)); let dirty_rect = Some(Rect(Point2D(dirtyX, dirtyY), Size2D(dirtyWidth, dirtyHeight))); - self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap() + self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::PutImageData(data, image_data_rect, dirty_rect))).unwrap(); + self.mark_as_dirty(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-createlineargradient |