From 588c09b5807bd9534aa63cbb11cff5c0227efdab Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Tue, 11 Feb 2020 22:36:50 +0100 Subject: [PATCH] Implement CanvasRenderingContext2D.getTransform() --- components/canvas/canvas_data.rs | 4 ++++ components/canvas/canvas_paint_thread.rs | 4 ++++ components/canvas_traits/canvas.rs | 1 + components/script/canvas_state.rs | 10 ++++++++++ components/script/dom/canvasrenderingcontext2d.rs | 6 ++++++ .../script/dom/offscreencanvasrenderingcontext2d.rs | 6 ++++++ components/script/dom/paintrenderingcontext2d.rs | 6 ++++++ .../script/dom/webidls/CanvasRenderingContext2D.webidl | 2 +- components/script/dom/webidls/DOMMatrix.webidl | 2 +- components/script/dom/webidls/DOMMatrixReadOnly.webidl | 2 +- components/script/dom/webidls/DOMPoint.webidl | 2 +- components/script/dom/webidls/DOMPointReadOnly.webidl | 2 +- .../2d.transformation.getTransform.html.ini | 4 ---- .../geometry/DOMMatrix2DInit-validate-fixup.html.ini | 3 --- tests/wpt/metadata/html/dom/idlharness.https.html.ini | 6 ------ .../2d.transformation.getTransform.html.ini | 4 ---- 16 files changed, 42 insertions(+), 22 deletions(-) delete mode 100644 tests/wpt/metadata/2dcontext/transformations/2d.transformation.getTransform.html.ini delete mode 100644 tests/wpt/metadata/offscreen-canvas/transformations/2d.transformation.getTransform.html.ini diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index f66bd626cda..e31cf4d68ed 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -919,6 +919,10 @@ impl<'a> CanvasData<'a> { self.state.stroke_opts.set_miter_limit(limit); } + pub fn get_transform(&self) -> Transform2D { + self.drawtarget.get_transform() + } + pub fn set_transform(&mut self, transform: &Transform2D) { // If there is an in-progress path, store the existing transformation required // to move between device and user space. diff --git a/components/canvas/canvas_paint_thread.rs b/components/canvas/canvas_paint_thread.rs index 9cc15665919..c68e11f745a 100644 --- a/components/canvas/canvas_paint_thread.rs +++ b/components/canvas/canvas_paint_thread.rs @@ -210,6 +210,10 @@ impl<'a> CanvasPaintThread<'a> { Canvas2dMsg::SetLineCap(cap) => self.canvas(canvas_id).set_line_cap(cap), Canvas2dMsg::SetLineJoin(join) => self.canvas(canvas_id).set_line_join(join), Canvas2dMsg::SetMiterLimit(limit) => self.canvas(canvas_id).set_miter_limit(limit), + Canvas2dMsg::GetTransform(sender) => { + let transform = self.canvas(canvas_id).get_transform(); + sender.send(transform).unwrap(); + }, Canvas2dMsg::SetTransform(ref matrix) => self.canvas(canvas_id).set_transform(matrix), Canvas2dMsg::SetGlobalAlpha(alpha) => self.canvas(canvas_id).set_global_alpha(alpha), Canvas2dMsg::SetGlobalComposition(op) => { diff --git a/components/canvas_traits/canvas.rs b/components/canvas_traits/canvas.rs index 45920674863..13fc6eaa800 100644 --- a/components/canvas_traits/canvas.rs +++ b/components/canvas_traits/canvas.rs @@ -48,6 +48,7 @@ pub enum Canvas2dMsg { FillText(String, f64, f64, Option, FillOrStrokeStyle), FillRect(Rect, FillOrStrokeStyle), GetImageData(Rect, Size2D, IpcBytesSender), + GetTransform(IpcSender>), IsPointInPath(f64, f64, FillRule, IpcSender), LineTo(Point2D), MoveTo(Point2D), diff --git a/components/script/canvas_state.rs b/components/script/canvas_state.rs index d596ff826fa..41c92fc0799 100644 --- a/components/script/canvas_state.rs +++ b/components/script/canvas_state.rs @@ -16,6 +16,7 @@ use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle}; use crate::dom::canvaspattern::CanvasPattern; +use crate::dom::dommatrix::DOMMatrix; use crate::dom::element::cors_setting_for_element; use crate::dom::element::Element; use crate::dom::globalscope::GlobalScope; @@ -1415,6 +1416,15 @@ impl CanvasState { self.update_transform() } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-gettransform + pub fn get_transform(&self, global: &GlobalScope) -> DomRoot { + let (sender, receiver) = ipc::channel::>().unwrap(); + self.send_canvas_2d_msg(Canvas2dMsg::GetTransform(sender)); + let transform = receiver.recv().unwrap(); + + DOMMatrix::new(global, true, transform.cast::().to_3d()) + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform pub fn set_transform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { if !(a.is_finite() && diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 4c36a22f717..5956827d654 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -18,6 +18,7 @@ use crate::dom::bindings::root::{Dom, DomRoot, LayoutDom}; use crate::dom::bindings::str::DOMString; use crate::dom::canvasgradient::CanvasGradient; use crate::dom::canvaspattern::CanvasPattern; +use crate::dom::dommatrix::DOMMatrix; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::imagedata::ImageData; @@ -224,6 +225,11 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { self.canvas_state.borrow().transform(a, b, c, d, e, f) } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-gettransform + fn GetTransform(&self) -> DomRoot { + self.canvas_state.borrow().get_transform(&self.global()) + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform fn SetTransform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { self.canvas_state.borrow().set_transform(a, b, c, d, e, f) diff --git a/components/script/dom/offscreencanvasrenderingcontext2d.rs b/components/script/dom/offscreencanvasrenderingcontext2d.rs index 31dc8b7dec5..228a4dd44d7 100644 --- a/components/script/dom/offscreencanvasrenderingcontext2d.rs +++ b/components/script/dom/offscreencanvasrenderingcontext2d.rs @@ -19,6 +19,7 @@ use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::canvasgradient::CanvasGradient; use crate::dom::canvaspattern::CanvasPattern; +use crate::dom::dommatrix::DOMMatrix; use crate::dom::globalscope::GlobalScope; use crate::dom::htmlcanvaselement::HTMLCanvasElement; use crate::dom::imagedata::ImageData; @@ -470,6 +471,11 @@ impl OffscreenCanvasRenderingContext2DMethods for OffscreenCanvasRenderingContex self.canvas_state.borrow().transform(a, b, c, d, e, f) } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-gettransform + fn GetTransform(&self) -> DomRoot { + self.canvas_state.borrow().get_transform(&self.global()) + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform fn SetTransform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { self.canvas_state.borrow().set_transform(a, b, c, d, e, f) diff --git a/components/script/dom/paintrenderingcontext2d.rs b/components/script/dom/paintrenderingcontext2d.rs index b9adc23e52d..7b44bbc4a71 100644 --- a/components/script/dom/paintrenderingcontext2d.rs +++ b/components/script/dom/paintrenderingcontext2d.rs @@ -20,6 +20,7 @@ use crate::dom::bindings::str::DOMString; use crate::dom::canvasgradient::CanvasGradient; use crate::dom::canvaspattern::CanvasPattern; use crate::dom::canvasrenderingcontext2d::CanvasRenderingContext2D; +use crate::dom::dommatrix::DOMMatrix; use crate::dom::paintworkletglobalscope::PaintWorkletGlobalScope; use crate::euclidext::Size2DExt; use canvas_traits::canvas::CanvasImageData; @@ -119,6 +120,11 @@ impl PaintRenderingContext2DMethods for PaintRenderingContext2D { self.context.Transform(a, b, c, d, e, f) } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-gettransform + fn GetTransform(&self) -> DomRoot { + self.context.GetTransform() + } + // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform fn SetTransform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { self.context.SetTransform(a, b, c, d, e, f); diff --git a/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/components/script/dom/webidls/CanvasRenderingContext2D.webidl index bcc1b56396c..af88cfe9281 100644 --- a/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -59,7 +59,7 @@ interface mixin CanvasTransform { unrestricted double e, unrestricted double f); - // [NewObject] DOMMatrix getTransform(); + [NewObject] DOMMatrix getTransform(); void setTransform(unrestricted double a, unrestricted double b, unrestricted double c, diff --git a/components/script/dom/webidls/DOMMatrix.webidl b/components/script/dom/webidls/DOMMatrix.webidl index 1731116c051..eaef16c3906 100644 --- a/components/script/dom/webidls/DOMMatrix.webidl +++ b/components/script/dom/webidls/DOMMatrix.webidl @@ -10,7 +10,7 @@ * related or neighboring rights to this work. */ -[Exposed=(Window,Worker), +[Exposed=(Window,Worker,PaintWorklet), LegacyWindowAlias=WebKitCSSMatrix] interface DOMMatrix : DOMMatrixReadOnly { [Throws] constructor(optional (DOMString or sequence) init); diff --git a/components/script/dom/webidls/DOMMatrixReadOnly.webidl b/components/script/dom/webidls/DOMMatrixReadOnly.webidl index d86a475c38e..689b83ddc58 100644 --- a/components/script/dom/webidls/DOMMatrixReadOnly.webidl +++ b/components/script/dom/webidls/DOMMatrixReadOnly.webidl @@ -10,7 +10,7 @@ * related or neighboring rights to this work. */ -[Exposed=(Window,Worker)] +[Exposed=(Window,Worker,PaintWorklet)] interface DOMMatrixReadOnly { [Throws] constructor(optional (DOMString or sequence) init); diff --git a/components/script/dom/webidls/DOMPoint.webidl b/components/script/dom/webidls/DOMPoint.webidl index ee25eed0d69..765c62df573 100644 --- a/components/script/dom/webidls/DOMPoint.webidl +++ b/components/script/dom/webidls/DOMPoint.webidl @@ -10,7 +10,7 @@ */ // http://dev.w3.org/fxtf/geometry/Overview.html#dompoint -[Exposed=(Window,Worker)] +[Exposed=(Window,Worker,PaintWorklet)] interface DOMPoint : DOMPointReadOnly { [Throws] constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, optional unrestricted double z = 0, optional unrestricted double w = 1); diff --git a/components/script/dom/webidls/DOMPointReadOnly.webidl b/components/script/dom/webidls/DOMPointReadOnly.webidl index bdd7eba31eb..98940ed3f08 100644 --- a/components/script/dom/webidls/DOMPointReadOnly.webidl +++ b/components/script/dom/webidls/DOMPointReadOnly.webidl @@ -10,7 +10,7 @@ */ // http://dev.w3.org/fxtf/geometry/Overview.html#dompointreadonly -[Exposed=(Window,Worker)] +[Exposed=(Window,Worker,PaintWorklet)] interface DOMPointReadOnly { [Throws] constructor(optional unrestricted double x = 0, optional unrestricted double y = 0, optional unrestricted double z = 0, optional unrestricted double w = 1); diff --git a/tests/wpt/metadata/2dcontext/transformations/2d.transformation.getTransform.html.ini b/tests/wpt/metadata/2dcontext/transformations/2d.transformation.getTransform.html.ini deleted file mode 100644 index d6535d8729e..00000000000 --- a/tests/wpt/metadata/2dcontext/transformations/2d.transformation.getTransform.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[2d.transformation.getTransform.html] - [This test ensures that getTransform works correctly.] - expected: FAIL - diff --git a/tests/wpt/metadata/css/geometry/DOMMatrix2DInit-validate-fixup.html.ini b/tests/wpt/metadata/css/geometry/DOMMatrix2DInit-validate-fixup.html.ini index c89768ddb6c..7ce87f290b7 100644 --- a/tests/wpt/metadata/css/geometry/DOMMatrix2DInit-validate-fixup.html.ini +++ b/tests/wpt/metadata/css/geometry/DOMMatrix2DInit-validate-fixup.html.ini @@ -17,9 +17,6 @@ [addPath({f: 0, m42: 5e-324}) (invalid)] expected: FAIL - [setTransform (Sanity check without dictionary)] - expected: FAIL - [addPath (Sanity check without second parameter)] expected: FAIL diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index 1c094dd479f..2fa02b7628d 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -59,9 +59,6 @@ [ApplicationCache interface: window.applicationCache must inherit property "ondownloading" with the proper type] expected: FAIL - [CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "getTransform()" with the proper type] - expected: FAIL - [OffscreenCanvasRenderingContext2D interface: attribute imageSmoothingEnabled] expected: FAIL @@ -1178,9 +1175,6 @@ [External interface object length] expected: FAIL - [CanvasRenderingContext2D interface: operation getTransform()] - expected: FAIL - [OffscreenCanvasRenderingContext2D interface: operation arc(unrestricted double, unrestricted double, unrestricted double, unrestricted double, unrestricted double, boolean)] expected: FAIL diff --git a/tests/wpt/metadata/offscreen-canvas/transformations/2d.transformation.getTransform.html.ini b/tests/wpt/metadata/offscreen-canvas/transformations/2d.transformation.getTransform.html.ini deleted file mode 100644 index d6535d8729e..00000000000 --- a/tests/wpt/metadata/offscreen-canvas/transformations/2d.transformation.getTransform.html.ini +++ /dev/null @@ -1,4 +0,0 @@ -[2d.transformation.getTransform.html] - [This test ensures that getTransform works correctly.] - expected: FAIL -