Skip to content

Commit

Permalink
Canvas: add clipping path support.
Browse files Browse the repository at this point in the history
  • Loading branch information
mmatyas committed Apr 22, 2015
1 parent 3a1bf45 commit 6fd6eef
Show file tree
Hide file tree
Showing 29 changed files with 16 additions and 134 deletions.
3 changes: 2 additions & 1 deletion components/canvas/canvas_msg.rs
Expand Up @@ -24,8 +24,9 @@ pub enum Canvas2dMsg {
DrawImageSelf(Size2D<f64>, Rect<f64>, Rect<f64>, bool),
BeginPath,
BezierCurveTo(Point2D<f32>, Point2D<f32>, Point2D<f32>),
ClosePath,
ClearRect(Rect<f32>),
Clip,
ClosePath,
Fill,
FillRect(Rect<f32>),
GetImageData(Rect<f64>, Size2D<f64>, Sender<Vec<u8>>),
Expand Down
6 changes: 6 additions & 0 deletions components/canvas/canvas_paint_task.rs
Expand Up @@ -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)
}
Expand Down Expand Up @@ -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();
}
}

Expand Down Expand Up @@ -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<u8>, image_size: Size2D<f64>,
dest_rect: Rect<f64>, source_rect: Rect<f64>, smoothing_enabled: bool) {
// We round up the floating pixel values to draw the pixels
Expand Down
7 changes: 7 additions & 0 deletions components/script/dom/canvasrenderingcontext2d.rs
Expand Up @@ -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();
}

Expand All @@ -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<()> {
Expand Down
Expand Up @@ -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");
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

This file was deleted.

12 changes: 0 additions & 12 deletions tests/wpt/metadata/html/dom/interfaces.html.ini
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

This file was deleted.

0 comments on commit 6fd6eef

Please sign in to comment.