From 6fd6eefb352ebb4926b86b47509d7a3bcbc0821b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ty=C3=A1s=20Mustoha?= Date: Tue, 21 Apr 2015 12:45:28 +0200 Subject: [PATCH] Canvas: add clipping path support. --- components/canvas/canvas_msg.rs | 3 ++- components/canvas/canvas_paint_task.rs | 6 ++++++ components/script/dom/canvasrenderingcontext2d.rs | 7 +++++++ .../dom/webidls/CanvasRenderingContext2D.webidl | 2 +- .../compositing/2d.composite.clip.copy.html.ini | 5 ----- .../2d.composite.clip.destination-atop.html.ini | 5 ----- .../2d.composite.clip.destination-in.html.ini | 5 ----- .../2d.composite.clip.destination-out.html.ini | 5 ----- .../2d.composite.clip.destination-over.html.ini | 5 ----- .../compositing/2d.composite.clip.lighter.html.ini | 5 ----- .../2d.composite.clip.source-atop.html.ini | 5 ----- .../compositing/2d.composite.clip.source-in.html.ini | 5 ----- .../2d.composite.clip.source-out.html.ini | 5 ----- .../2d.composite.clip.source-over.html.ini | 5 ----- .../compositing/2d.composite.clip.xor.html.ini | 5 ----- .../2d.drawImage.clip.html.ini | 5 ----- .../2d.clearRect.clip.html.ini | 5 ----- .../2d.fillRect.clip.html.ini | 5 ----- .../2d.strokeRect.clip.html.ini | 5 ----- .../path-objects/2d.path.clip.basic.1.html.ini | 5 ----- .../path-objects/2d.path.clip.basic.2.html.ini | 5 ----- .../path-objects/2d.path.clip.empty.html.ini | 5 ----- .../path-objects/2d.path.clip.intersect.html.ini | 5 ----- .../path-objects/2d.path.clip.winding.1.html.ini | 5 ----- .../path-objects/2d.path.clip.winding.2.html.ini | 5 ----- .../2dcontext/shadows/2d.shadow.clip.2.html.ini | 5 ----- .../2d.state.saverestore.clip.html.ini | 5 ----- tests/wpt/metadata/html/dom/interfaces.html.ini | 12 ------------ .../the-canvas-element/initial.reset.clip.html.ini | 5 ----- 29 files changed, 16 insertions(+), 134 deletions(-) delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.copy.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-atop.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-in.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-out.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-over.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.lighter.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-atop.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-in.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-out.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-over.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.xor.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.clip.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.1.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.2.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.empty.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.intersect.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.1.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.2.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/shadows/2d.shadow.clip.2.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.clip.html.ini delete mode 100644 tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html.ini diff --git a/components/canvas/canvas_msg.rs b/components/canvas/canvas_msg.rs index 86e1dcc6f81..cfdea3c2af2 100644 --- a/components/canvas/canvas_msg.rs +++ b/components/canvas/canvas_msg.rs @@ -24,8 +24,9 @@ pub enum Canvas2dMsg { DrawImageSelf(Size2D, Rect, Rect, bool), BeginPath, BezierCurveTo(Point2D, Point2D, Point2D), - ClosePath, ClearRect(Rect), + Clip, + ClosePath, Fill, FillRect(Rect), GetImageData(Rect, Size2D, Sender>), diff --git a/components/canvas/canvas_paint_task.rs b/components/canvas/canvas_paint_task.rs index 2eceb25331f..eefc55e8d91 100644 --- a/components/canvas/canvas_paint_task.rs +++ b/components/canvas/canvas_paint_task.rs @@ -212,6 +212,7 @@ impl<'a> CanvasPaintTask<'a> { Canvas2dMsg::ClosePath => painter.close_path(), Canvas2dMsg::Fill => painter.fill(), Canvas2dMsg::Stroke => painter.stroke(), + Canvas2dMsg::Clip => painter.clip(), Canvas2dMsg::DrawImage(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) => { painter.draw_image(imagedata, image_size, dest_rect, source_rect, smoothing_enabled) } @@ -271,6 +272,7 @@ impl<'a> CanvasPaintTask<'a> { if let Some(state) = self.saved_states.pop() { mem::replace(&mut self.state, state); self.drawtarget.set_transform(&self.state.transform); + self.drawtarget.pop_clip(); } } @@ -325,6 +327,10 @@ impl<'a> CanvasPaintTask<'a> { }; } + fn clip(&self) { + self.drawtarget.push_clip(&self.path_builder.finish()); + } + fn draw_image(&self, image_data: Vec, image_size: Size2D, dest_rect: Rect, source_rect: Rect, smoothing_enabled: bool) { // We round up the floating pixel values to draw the pixels diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 5c89b58f276..9f3ae840060 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -454,6 +454,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> // https://html.spec.whatwg.org/multipage/#dom-context-2d-fill fn Fill(self, _: CanvasWindingRule) { + // TODO: Process winding rule self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Fill)).unwrap(); } @@ -462,6 +463,12 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D> self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Stroke)).unwrap(); } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-clip + fn Clip(self, _: CanvasWindingRule) { + // TODO: Process winding rule + self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::Clip)).unwrap(); + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-drawimage fn DrawImage(self, image: HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D, dx: f64, dy: f64) -> Fallible<()> { diff --git a/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/components/script/dom/webidls/CanvasRenderingContext2D.webidl index 44f9c707600..268a129003d 100644 --- a/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -90,7 +90,7 @@ interface CanvasRenderingContext2D { //boolean drawCustomFocusRing(Path2D path, Element element); //void scrollPathIntoView(); //void scrollPathIntoView(Path2D path); - //void clip(optional CanvasWindingRule fillRule = "nonzero"); + void clip(optional CanvasWindingRule fillRule = "nonzero"); //void clip(Path2D path, optional CanvasWindingRule fillRule = "nonzero"); //void resetClip(); //boolean isPointInPath(unrestricted double x, unrestricted double y, optional CanvasWindingRule fillRule = "nonzero"); diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.copy.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.copy.html.ini deleted file mode 100644 index 23f9b8fd121..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.copy.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.copy.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-atop.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-atop.html.ini deleted file mode 100644 index d7af32419ea..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-atop.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.destination-atop.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-in.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-in.html.ini deleted file mode 100644 index 911f5811a29..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-in.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.destination-in.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-out.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-out.html.ini deleted file mode 100644 index dccdf5223c9..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-out.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.destination-out.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-over.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-over.html.ini deleted file mode 100644 index feed3e92b44..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.destination-over.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.destination-over.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.lighter.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.lighter.html.ini deleted file mode 100644 index ed0c008a047..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.lighter.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.lighter.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-atop.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-atop.html.ini deleted file mode 100644 index da2471b44ca..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-atop.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.source-atop.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-in.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-in.html.ini deleted file mode 100644 index de301459ba3..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-in.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.source-in.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-out.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-out.html.ini deleted file mode 100644 index 69939989f46..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-out.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.source-out.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-over.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-over.html.ini deleted file mode 100644 index 77fbfd70264..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.source-over.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.source-over.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.xor.html.ini b/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.xor.html.ini deleted file mode 100644 index bfd93df0fe4..00000000000 --- a/tests/wpt/metadata/2dcontext/compositing/2d.composite.clip.xor.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.composite.clip.xor.html] - type: testharness - [fill() does not affect pixels outside the clip region.] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.clip.html.ini b/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.clip.html.ini deleted file mode 100644 index 1dd6e3a9019..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-images-to-the-canvas/2d.drawImage.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.drawImage.clip.html] - type: testharness - [Canvas test: 2d.drawImage.clip] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html.ini b/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html.ini deleted file mode 100644 index b866307aca1..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.clearRect.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.clearRect.clip.html] - type: testharness - [clearRect is affected by clipping regions] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html.ini b/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html.ini deleted file mode 100644 index a4515096beb..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.fillRect.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.fillRect.clip.html] - type: testharness - [fillRect is affected by clipping regions] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html.ini b/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html.ini deleted file mode 100644 index 00208229e45..00000000000 --- a/tests/wpt/metadata/2dcontext/drawing-rectangles-to-the-canvas/2d.strokeRect.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.strokeRect.clip.html] - type: testharness - [strokeRect is affected by clipping regions] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.1.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.1.html.ini deleted file mode 100644 index c831b3ffb3e..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.basic.1.html] - type: testharness - [Canvas test: 2d.path.clip.basic.1] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.2.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.2.html.ini deleted file mode 100644 index 8aa80f7fe73..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.basic.2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.basic.2.html] - type: testharness - [Canvas test: 2d.path.clip.basic.2] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.empty.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.empty.html.ini deleted file mode 100644 index b9f51bde836..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.empty.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.empty.html] - type: testharness - [Canvas test: 2d.path.clip.empty] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.intersect.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.intersect.html.ini deleted file mode 100644 index 786916e63f3..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.intersect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.intersect.html] - type: testharness - [Canvas test: 2d.path.clip.intersect] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.1.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.1.html.ini deleted file mode 100644 index 9727f314b4f..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.1.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.winding.1.html] - type: testharness - [Canvas test: 2d.path.clip.winding.1] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.2.html.ini b/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.2.html.ini deleted file mode 100644 index 340a096ce70..00000000000 --- a/tests/wpt/metadata/2dcontext/path-objects/2d.path.clip.winding.2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.path.clip.winding.2.html] - type: testharness - [Canvas test: 2d.path.clip.winding.2] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.clip.2.html.ini b/tests/wpt/metadata/2dcontext/shadows/2d.shadow.clip.2.html.ini deleted file mode 100644 index 5a5707158f3..00000000000 --- a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.clip.2.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.shadow.clip.2.html] - type: testharness - [Shadows are not drawn outside the clipping region] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.clip.html.ini b/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.clip.html.ini deleted file mode 100644 index 15d95322852..00000000000 --- a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.state.saverestore.clip.html] - type: testharness - [save()/restore() affects the clipping path] - expected: FAIL - diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index 62800c0b7e8..f05f34dc130 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -6924,9 +6924,6 @@ [CanvasRenderingContext2D interface: operation clip(CanvasFillRule)] expected: FAIL - [CanvasRenderingContext2D interface: operation clip(Path2D,CanvasFillRule)] - expected: FAIL - [CanvasRenderingContext2D interface: operation resetClip()] expected: FAIL @@ -7086,15 +7083,6 @@ [CanvasRenderingContext2D interface: calling scrollPathIntoView(Path2D) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] expected: FAIL - [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (39)] - expected: FAIL - - [CanvasRenderingContext2D interface: calling clip(CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] - expected: FAIL - - [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "clip" with the proper type (40)] - expected: FAIL - [CanvasRenderingContext2D interface: calling clip(Path2D,CanvasFillRule) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html.ini deleted file mode 100644 index 14b44d71f73..00000000000 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-canvas-element/initial.reset.clip.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[initial.reset.clip.html] - type: testharness - [Resetting the canvas state resets the current clip region] - expected: FAIL -