Log Message
Add CanvasRenderingContext2D::getTransform https://bugs.webkit.org/show_bug.cgi?id=174278
Reviewed by Dean Jackson.
Source/WebCore:
Tests: fast/canvas/2d.getTransform.modification.html
fast/canvas/2d.getTransform.newobject.html
fast/canvas/2d.setTransform.matrix.html
* css/DOMMatrixReadOnly.h:
Make DOMMatrixReadOnly::validateAndFixup public so that values of DOMMatrixInit are still
usable without having to construct a DOMMatrixReadOnly. This is beneficial in the case that
an exception is thrown, as the validateAndFixup check can happen without any allocations.
* html/canvas/CanvasRenderingContext2D.idl:
* html/canvas/CanvasRenderingContext2D.h:
* html/canvas/CanvasRenderingContext2D.cpp:
(WebCore::CanvasRenderingContext2D::getTransform):
(WebCore::CanvasRenderingContext2D::setTransform):
LayoutTests:
* canvas/philip/tests/2d.missingargs.html:
CanvasRenderingContext2D.prototype.setTransform no longer throws an error with no arguments.
* fast/canvas/2d.getTransform.modification-expected.txt: Added.
* fast/canvas/2d.getTransform.modification.html: Added.
* fast/canvas/2d.getTransform.newobject-expected.txt: Added.
* fast/canvas/2d.getTransform.newobject.html: Added.
* fast/canvas/2d.setTransform.matrix-expected.txt: Added.
* fast/canvas/2d.setTransform.matrix.html: Added.
Modified Paths
- trunk/LayoutTests/ChangeLog
- trunk/LayoutTests/canvas/philip/tests/2d.missingargs.html
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/css/DOMMatrixReadOnly.h
- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp
- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h
- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl
Added Paths
- trunk/LayoutTests/fast/canvas/2d.getTransform.modification-expected.txt
- trunk/LayoutTests/fast/canvas/2d.getTransform.modification.html
- trunk/LayoutTests/fast/canvas/2d.getTransform.newobject-expected.txt
- trunk/LayoutTests/fast/canvas/2d.getTransform.newobject.html
- trunk/LayoutTests/fast/canvas/2d.setTransform.matrix-expected.txt
- trunk/LayoutTests/fast/canvas/2d.setTransform.matrix.html
Diff
Modified: trunk/LayoutTests/ChangeLog (219618 => 219619)
--- trunk/LayoutTests/ChangeLog 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/LayoutTests/ChangeLog 2017-07-18 18:54:32 UTC (rev 219619)
@@ -1,3 +1,20 @@
+2017-07-18 Devin Rousso <[email protected]>
+
+ Add CanvasRenderingContext2D::getTransform
+ https://bugs.webkit.org/show_bug.cgi?id=174278
+
+ Reviewed by Dean Jackson.
+
+ * canvas/philip/tests/2d.missingargs.html:
+ CanvasRenderingContext2D.prototype.setTransform no longer throws an error with no arguments.
+
+ * fast/canvas/2d.getTransform.modification-expected.txt: Added.
+ * fast/canvas/2d.getTransform.modification.html: Added.
+ * fast/canvas/2d.getTransform.newobject-expected.txt: Added.
+ * fast/canvas/2d.getTransform.newobject.html: Added.
+ * fast/canvas/2d.setTransform.matrix-expected.txt: Added.
+ * fast/canvas/2d.setTransform.matrix.html: Added.
+
2017-07-18 Matt Lewis <[email protected]>
Rebaseline inspector/model/remote-object.html.
Modified: trunk/LayoutTests/canvas/philip/tests/2d.missingargs.html (219618 => 219619)
--- trunk/LayoutTests/canvas/philip/tests/2d.missingargs.html 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/LayoutTests/canvas/philip/tests/2d.missingargs.html 2017-07-18 18:54:32 UTC (rev 219619)
@@ -49,9 +49,6 @@
}
if (ctx.setTransform) {
try { var _thrown = false;
- ctx.setTransform();
-} catch (e) { if (!(e instanceof TypeError)) _fail("Failed assertion: expected exception of type TypeError, got: "+e); _thrown = true; } finally { _assert(_thrown, "should throw exception of type TypeError: ctx.setTransform()"); }
- try { var _thrown = false;
ctx.setTransform(1);
} catch (e) { if (!(e instanceof TypeError)) _fail("Failed assertion: expected exception of type TypeError, got: "+e); _thrown = true; } finally { _assert(_thrown, "should throw exception of type TypeError: ctx.setTransform(1)"); }
try { var _thrown = false;
Added: trunk/LayoutTests/fast/canvas/2d.getTransform.modification-expected.txt (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.getTransform.modification-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.getTransform.modification-expected.txt 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,33 @@
+The test to ensure that modifying the result of getTransform doesn't affect the context.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS copiedTransform.a is 1
+PASS copiedTransform.b is 0
+PASS copiedTransform.c is 0
+PASS copiedTransform.d is 1
+PASS copiedTransform.e is 0
+PASS copiedTransform.f is 0
+PASS newTransform.a is 1
+PASS newTransform.b is 2
+PASS newTransform.c is 3
+PASS newTransform.d is 4
+PASS newTransform.e is 5
+PASS newTransform.f is 6
+PASS modifiedTransform.a is 1
+PASS modifiedTransform.b is 0
+PASS modifiedTransform.c is 0
+PASS modifiedTransform.d is 1
+PASS modifiedTransform.e is 5
+PASS modifiedTransform.f is 6
+PASS ctx1Transform.a is ctx2Transform.a
+PASS ctx1Transform.b is ctx2Transform.b
+PASS ctx1Transform.c is ctx2Transform.c
+PASS ctx1Transform.d is ctx2Transform.d
+PASS ctx1Transform.e is ctx2Transform.e
+PASS ctx1Transform.f is ctx2Transform.f
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/canvas/2d.getTransform.modification.html (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.getTransform.modification.html (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.getTransform.modification.html 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,49 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("The test to ensure that modifying the result of getTransform doesn't affect the context.");
+
+function shouldHaveMatrixEquality(matrixName, expected) {
+ shouldEvaluateTo(matrixName + ".a", expected[0]);
+ shouldEvaluateTo(matrixName + ".b", expected[1]);
+ shouldEvaluateTo(matrixName + ".c", expected[2]);
+ shouldEvaluateTo(matrixName + ".d", expected[3]);
+ shouldEvaluateTo(matrixName + ".e", expected[4]);
+ shouldEvaluateTo(matrixName + ".f", expected[5]);
+}
+
+var ctx1 = document.createElement("canvas").getContext("2d");
+var copiedTransform = ctx1.getTransform();
+
+ctx1.setTransform(1, 2, 3, 4, 5, 6);
+shouldHaveMatrixEquality("copiedTransform", [1, 0, 0, 1, 0, 0]);
+
+copiedTransform = copiedTransform.translate(5, 6);
+var newTransform = ctx1.getTransform();
+shouldHaveMatrixEquality("newTransform", [1, 2, 3, 4, 5, 6]);
+
+ctx1.setTransform(copiedTransform);
+var modifiedTransform = ctx1.getTransform();
+shouldHaveMatrixEquality("modifiedTransform", [1, 0, 0, 1, 5, 6]);
+
+var ctx2 = document.createElement("canvas").getContext("2d");
+ctx2.setTransform(1, 0, 0, 1, 5, 6);
+
+var ctx1Transform = ctx1.getTransform();
+var ctx2Transform = ctx2.getTransform();
+shouldBe("ctx1Transform.a", "ctx2Transform.a");
+shouldBe("ctx1Transform.b", "ctx2Transform.b");
+shouldBe("ctx1Transform.c", "ctx2Transform.c");
+shouldBe("ctx1Transform.d", "ctx2Transform.d");
+shouldBe("ctx1Transform.e", "ctx2Transform.e");
+shouldBe("ctx1Transform.f", "ctx2Transform.f");
+
+</script>
+<script src=""
+</body>
+</html>
+
Added: trunk/LayoutTests/fast/canvas/2d.getTransform.newobject-expected.txt (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.getTransform.newobject-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.getTransform.newobject-expected.txt 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,16 @@
+The test to ensure that each call to getTransform returns a new object.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS transform1 is not transform2
+PASS transform1.a is transform2.a
+PASS transform1.b is transform2.b
+PASS transform1.c is transform2.c
+PASS transform1.d is transform2.d
+PASS transform1.e is transform2.e
+PASS transform1.f is transform2.f
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/canvas/2d.getTransform.newobject.html (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.getTransform.newobject.html (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.getTransform.newobject.html 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("The test to ensure that each call to getTransform returns a new object.");
+
+var ctx = document.createElement("canvas").getContext("2d");
+var transform1 = ctx.getTransform();
+var transform2 = ctx.getTransform();
+
+shouldNotBe("transform1", "transform2");
+shouldBe("transform1.a", "transform2.a");
+shouldBe("transform1.b", "transform2.b");
+shouldBe("transform1.c", "transform2.c");
+shouldBe("transform1.d", "transform2.d");
+shouldBe("transform1.e", "transform2.e");
+shouldBe("transform1.f", "transform2.f");
+
+</script>
+<script src=""
+</body>
+</html>
+
Added: trunk/LayoutTests/fast/canvas/2d.setTransform.matrix-expected.txt (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.setTransform.matrix-expected.txt (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.setTransform.matrix-expected.txt 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,133 @@
+The test to ensure that calling setTransform with a DOMMatrix works as expected.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS originalTransform.a is 1
+PASS originalTransform.b is 0
+PASS originalTransform.c is 0
+PASS originalTransform.d is 1
+PASS originalTransform.e is 0
+PASS originalTransform.f is 0
+PASS newTransformFromDOMMatrix.a is 1
+PASS newTransformFromDOMMatrix.b is 2
+PASS newTransformFromDOMMatrix.c is 3
+PASS newTransformFromDOMMatrix.d is 4
+PASS newTransformFromDOMMatrix.e is 5
+PASS newTransformFromDOMMatrix.f is 6
+PASS newTransformFromEmptyDOMMatrix.a is 1
+PASS newTransformFromEmptyDOMMatrix.b is 0
+PASS newTransformFromEmptyDOMMatrix.c is 0
+PASS newTransformFromEmptyDOMMatrix.d is 1
+PASS newTransformFromEmptyDOMMatrix.e is 0
+PASS newTransformFromEmptyDOMMatrix.f is 0
+PASS newTransformFrom3dDOMMatrix.m11 is 1
+PASS newTransformFrom3dDOMMatrix.m12 is 2
+PASS newTransformFrom3dDOMMatrix.m13 is 0
+PASS newTransformFrom3dDOMMatrix.m14 is 0
+PASS newTransformFrom3dDOMMatrix.m21 is 5
+PASS newTransformFrom3dDOMMatrix.m22 is 6
+PASS newTransformFrom3dDOMMatrix.m23 is 0
+PASS newTransformFrom3dDOMMatrix.m24 is 0
+PASS newTransformFrom3dDOMMatrix.m31 is 0
+PASS newTransformFrom3dDOMMatrix.m32 is 0
+PASS newTransformFrom3dDOMMatrix.m33 is 1
+PASS newTransformFrom3dDOMMatrix.m34 is 0
+PASS newTransformFrom3dDOMMatrix.m41 is 13
+PASS newTransformFrom3dDOMMatrix.m42 is 14
+PASS newTransformFrom3dDOMMatrix.m43 is 0
+PASS newTransformFrom3dDOMMatrix.m44 is 1
+PASS newTransformFromEmptyObject.a is 1
+PASS newTransformFromEmptyObject.b is 0
+PASS newTransformFromEmptyObject.c is 0
+PASS newTransformFromEmptyObject.d is 1
+PASS newTransformFromEmptyObject.e is 0
+PASS newTransformFromEmptyObject.f is 0
+PASS newTransformFromObject.a is 1
+PASS newTransformFromObject.b is 2
+PASS newTransformFromObject.c is 3
+PASS newTransformFromObject.d is 4
+PASS newTransformFromObject.e is 5
+PASS newTransformFromObject.f is 6
+PASS function () {
+ ctx.setTransform({a: 1, m11: 11, b: 2, m12: 12, c: 3, m21: 21, d: 4, m22: 22, e: 5, m41: 41, f: 6, m42: 42});
+} threw exception TypeError: init.a and init.m11 do not match.
+PASS newTransformFromInvalidMatrixObject.a is 1
+PASS newTransformFromInvalidMatrixObject.b is 2
+PASS newTransformFromInvalidMatrixObject.c is 3
+PASS newTransformFromInvalidMatrixObject.d is 4
+PASS newTransformFromInvalidMatrixObject.e is 5
+PASS newTransformFromInvalidMatrixObject.f is 6
+PASS function () {
+ ctx.setTransform(1);
+} threw exception TypeError: Type error.
+PASS newTransformFromNonObjectNumber.a is 1
+PASS newTransformFromNonObjectNumber.b is 2
+PASS newTransformFromNonObjectNumber.c is 3
+PASS newTransformFromNonObjectNumber.d is 4
+PASS newTransformFromNonObjectNumber.e is 5
+PASS newTransformFromNonObjectNumber.f is 6
+PASS function () {
+ ctx.setTransform("test");
+} threw exception TypeError: Type error.
+PASS newTransformFromNonObjectString.a is 1
+PASS newTransformFromNonObjectString.b is 2
+PASS newTransformFromNonObjectString.c is 3
+PASS newTransformFromNonObjectString.d is 4
+PASS newTransformFromNonObjectString.e is 5
+PASS newTransformFromNonObjectString.f is 6
+PASS function () {
+ ctx.setTransform(true);
+} threw exception TypeError: Type error.
+PASS newTransformFromNonObjectBoolean.a is 1
+PASS newTransformFromNonObjectBoolean.b is 2
+PASS newTransformFromNonObjectBoolean.c is 3
+PASS newTransformFromNonObjectBoolean.d is 4
+PASS newTransformFromNonObjectBoolean.e is 5
+PASS newTransformFromNonObjectBoolean.f is 6
+PASS newTransformFromInvalidValueObject.a is 1
+PASS newTransformFromInvalidValueObject.b is 2
+PASS newTransformFromInvalidValueObject.c is 3
+PASS newTransformFromInvalidValueObject.d is 4
+PASS newTransformFromInvalidValueObject.e is 5
+PASS newTransformFromInvalidValueObject.f is 6
+PASS newTransformFromInvalidKeyObject.a is 1
+PASS newTransformFromInvalidKeyObject.b is 0
+PASS newTransformFromInvalidKeyObject.c is 0
+PASS newTransformFromInvalidKeyObject.d is 1
+PASS newTransformFromInvalidKeyObject.e is 0
+PASS newTransformFromInvalidKeyObject.f is 0
+PASS newTransformFromNull.a is 1
+PASS newTransformFromNull.b is 0
+PASS newTransformFromNull.c is 0
+PASS newTransformFromNull.d is 1
+PASS newTransformFromNull.e is 0
+PASS newTransformFromNull.f is 0
+PASS newTransformFromEmptyArray.a is 1
+PASS newTransformFromEmptyArray.b is 0
+PASS newTransformFromEmptyArray.c is 0
+PASS newTransformFromEmptyArray.d is 1
+PASS newTransformFromEmptyArray.e is 0
+PASS newTransformFromEmptyArray.f is 0
+PASS newTransformFromArray.a is 1
+PASS newTransformFromArray.b is 0
+PASS newTransformFromArray.c is 0
+PASS newTransformFromArray.d is 1
+PASS newTransformFromArray.e is 0
+PASS newTransformFromArray.f is 0
+PASS newTransformFromInvalidArray.a is 1
+PASS newTransformFromInvalidArray.b is 0
+PASS newTransformFromInvalidArray.c is 0
+PASS newTransformFromInvalidArray.d is 1
+PASS newTransformFromInvalidArray.e is 0
+PASS newTransformFromInvalidArray.f is 0
+PASS newTransformFromNoArgument.a is 1
+PASS newTransformFromNoArgument.b is 0
+PASS newTransformFromNoArgument.c is 0
+PASS newTransformFromNoArgument.d is 1
+PASS newTransformFromNoArgument.e is 0
+PASS newTransformFromNoArgument.f is 0
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
Added: trunk/LayoutTests/fast/canvas/2d.setTransform.matrix.html (0 => 219619)
--- trunk/LayoutTests/fast/canvas/2d.setTransform.matrix.html (rev 0)
+++ trunk/LayoutTests/fast/canvas/2d.setTransform.matrix.html 2017-07-18 18:54:32 UTC (rev 219619)
@@ -0,0 +1,130 @@
+<!DOCTYPE html>
+<html>
+<head>
+<script src=""
+</head>
+<body>
+<script>
+description("The test to ensure that calling setTransform with a DOMMatrix works as expected.");
+
+function shouldHaveMatrixEquality(matrixName, expected) {
+ shouldEvaluateTo(matrixName + ".a", expected[0]);
+ shouldEvaluateTo(matrixName + ".b", expected[1]);
+ shouldEvaluateTo(matrixName + ".c", expected[2]);
+ shouldEvaluateTo(matrixName + ".d", expected[3]);
+ shouldEvaluateTo(matrixName + ".e", expected[4]);
+ shouldEvaluateTo(matrixName + ".f", expected[5]);
+}
+
+var ctx = document.createElement("canvas").getContext("2d");
+var originalTransform = ctx.getTransform();
+shouldHaveMatrixEquality("originalTransform", [1, 0, 0, 1, 0, 0]);
+
+ctx.resetTransform();
+ctx.setTransform(new DOMMatrix([1, 2, 3, 4, 5, 6]));
+var newTransformFromDOMMatrix = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromDOMMatrix", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform(new DOMMatrix);
+var newTransformFromEmptyDOMMatrix = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromEmptyDOMMatrix", [1, 0, 0, 1, 0, 0]);
+
+ctx.resetTransform();
+ctx.setTransform(new DOMMatrix([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]));
+var newTransformFrom3dDOMMatrix = ctx.getTransform();
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m11", 1);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m12", 2);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m13", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m14", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m21", 5);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m22", 6);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m23", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m24", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m31", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m32", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m33", 1);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m34", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m41", 13);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m42", 14);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m43", 0);
+shouldEvaluateTo("newTransformFrom3dDOMMatrix.m44", 1);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform({});
+var newTransformFromEmptyObject = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromEmptyObject", [1, 0, 0, 1, 0, 0]);
+
+ctx.resetTransform();
+ctx.setTransform({a: 1, b: 2, c: 3, d: 4, e: 5, f: 6});
+var newTransformFromObject = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromObject", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+shouldThrowErrorName(function() {
+ ctx.setTransform({a: 1, m11: 11, b: 2, m12: 12, c: 3, m21: 21, d: 4, m22: 22, e: 5, m41: 41, f: 6, m42: 42});
+}, "TypeError");
+var newTransformFromInvalidMatrixObject = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromInvalidMatrixObject", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+shouldThrowErrorName(function() {
+ ctx.setTransform(1);
+}, "TypeError");
+var newTransformFromNonObjectNumber = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromNonObjectNumber", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+shouldThrowErrorName(function() {
+ ctx.setTransform("test");
+}, "TypeError");
+var newTransformFromNonObjectString = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromNonObjectString", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+shouldThrowErrorName(function() {
+ ctx.setTransform(true);
+}, "TypeError");
+var newTransformFromNonObjectBoolean = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromNonObjectBoolean", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform({a: {}});
+var newTransformFromInvalidValueObject = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromInvalidValueObject", [1, 2, 3, 4, 5, 6]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform({test: 1});
+var newTransformFromInvalidKeyObject = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromInvalidKeyObject", [1, 0, 0, 1, 0, 0]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform(null);
+var newTransformFromNull = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromNull", [1, 0, 0, 1, 0, 0]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform([]);
+var newTransformFromEmptyArray = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromEmptyArray", [1, 0, 0, 1, 0, 0]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform([1, 2, 3, 4, 5, 6]);
+var newTransformFromArray = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromArray", [1, 0, 0, 1, 0, 0]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform(["test"]);
+var newTransformFromInvalidArray = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromInvalidArray", [1, 0, 0, 1, 0, 0]);
+
+ctx.setTransform(1, 2, 3, 4, 5, 6);
+ctx.setTransform();
+var newTransformFromNoArgument = ctx.getTransform();
+shouldHaveMatrixEquality("newTransformFromNoArgument", [1, 0, 0, 1, 0, 0]);
+
+</script>
+<script src=""
+</body>
+</html>
+
Modified: trunk/Source/WebCore/ChangeLog (219618 => 219619)
--- trunk/Source/WebCore/ChangeLog 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/Source/WebCore/ChangeLog 2017-07-18 18:54:32 UTC (rev 219619)
@@ -1,3 +1,25 @@
+2017-07-18 Devin Rousso <[email protected]>
+
+ Add CanvasRenderingContext2D::getTransform
+ https://bugs.webkit.org/show_bug.cgi?id=174278
+
+ Reviewed by Dean Jackson.
+
+ Tests: fast/canvas/2d.getTransform.modification.html
+ fast/canvas/2d.getTransform.newobject.html
+ fast/canvas/2d.setTransform.matrix.html
+
+ * css/DOMMatrixReadOnly.h:
+ Make DOMMatrixReadOnly::validateAndFixup public so that values of DOMMatrixInit are still
+ usable without having to construct a DOMMatrixReadOnly. This is beneficial in the case that
+ an exception is thrown, as the validateAndFixup check can happen without any allocations.
+
+ * html/canvas/CanvasRenderingContext2D.idl:
+ * html/canvas/CanvasRenderingContext2D.h:
+ * html/canvas/CanvasRenderingContext2D.cpp:
+ (WebCore::CanvasRenderingContext2D::getTransform):
+ (WebCore::CanvasRenderingContext2D::setTransform):
+
2017-07-18 Andy Estes <[email protected]>
[Xcode] Enable CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING
Modified: trunk/Source/WebCore/css/DOMMatrixReadOnly.h (219618 => 219619)
--- trunk/Source/WebCore/css/DOMMatrixReadOnly.h 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/Source/WebCore/css/DOMMatrixReadOnly.h 2017-07-18 18:54:32 UTC (rev 219619)
@@ -75,6 +75,8 @@
static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat32Array(Ref<Float32Array>&&);
static ExceptionOr<Ref<DOMMatrixReadOnly>> fromFloat64Array(Ref<Float64Array>&&);
+ static ExceptionOr<void> validateAndFixup(DOMMatrixInit&);
+
double a() const { return m_matrix.a(); }
double b() const { return m_matrix.b(); }
double c() const { return m_matrix.c(); }
@@ -137,8 +139,6 @@
template <typename T>
static ExceptionOr<Ref<T>> fromMatrixHelper(DOMMatrixInit&&);
- static ExceptionOr<void> validateAndFixup(DOMMatrixInit&);
-
TransformationMatrix m_matrix;
bool m_is2D { true };
};
Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp (219618 => 219619)
--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.cpp 2017-07-18 18:54:32 UTC (rev 219619)
@@ -40,6 +40,8 @@
#include "CachedImage.h"
#include "CanvasGradient.h"
#include "CanvasPattern.h"
+#include "DOMMatrix.h"
+#include "DOMMatrixInit.h"
#include "DOMPath.h"
#include "DisplayListRecorder.h"
#include "DisplayListReplayer.h"
@@ -795,6 +797,11 @@
modifiableState().hasInvertibleTransform = false;
}
+Ref<DOMMatrix> CanvasRenderingContext2D::getTransform() const
+{
+ return DOMMatrix::create(state().transform.toTransformationMatrix(), DOMMatrixReadOnly::Is2D::Yes);
+}
+
void CanvasRenderingContext2D::setTransform(float m11, float m12, float m21, float m22, float dx, float dy)
{
GraphicsContext* c = drawingContext();
@@ -808,6 +815,17 @@
transform(m11, m12, m21, m22, dx, dy);
}
+ExceptionOr<void> CanvasRenderingContext2D::setTransform(DOMMatrixInit&& matrixInit)
+{
+ auto checkValid = DOMMatrixReadOnly::validateAndFixup(matrixInit);
+ if (checkValid.hasException())
+ return checkValid.releaseException();
+
+ setTransform(matrixInit.a.value_or(1), matrixInit.b.value_or(0), matrixInit.c.value_or(0), matrixInit.d.value_or(1), matrixInit.e.value_or(0), matrixInit.f.value_or(0));
+
+ return { };
+}
+
void CanvasRenderingContext2D::resetTransform()
{
GraphicsContext* c = drawingContext();
Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h (219618 => 219619)
--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.h 2017-07-18 18:54:32 UTC (rev 219619)
@@ -45,6 +45,7 @@
class CanvasGradient;
class CanvasPattern;
+class DOMMatrix;
class DOMPath;
class FloatRect;
class GraphicsContext;
@@ -54,6 +55,8 @@
class ImageData;
class TextMetrics;
+struct DOMMatrixInit;
+
#if ENABLE(VIDEO)
using CanvasImageSource = Variant<RefPtr<HTMLImageElement>, RefPtr<HTMLVideoElement>, RefPtr<HTMLCanvasElement>>;
#else
@@ -113,7 +116,10 @@
void rotate(float angleInRadians);
void translate(float tx, float ty);
void transform(float m11, float m12, float m21, float m22, float dx, float dy);
+
+ Ref<DOMMatrix> getTransform() const;
void setTransform(float m11, float m12, float m21, float m22, float dx, float dy);
+ ExceptionOr<void> setTransform(DOMMatrixInit&&);
void resetTransform();
void setStrokeColor(const String& color, std::optional<float> alpha = std::nullopt);
Modified: trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl (219618 => 219619)
--- trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl 2017-07-18 18:39:08 UTC (rev 219618)
+++ trunk/Source/WebCore/html/canvas/CanvasRenderingContext2D.idl 2017-07-18 18:54:32 UTC (rev 219619)
@@ -52,8 +52,11 @@
void translate(unrestricted float tx, unrestricted float ty);
void transform(unrestricted float m11, unrestricted float m12, unrestricted float m21, unrestricted float m22,
unrestricted float dx, unrestricted float dy);
+
+ [NewObject] DOMMatrix getTransform();
void setTransform(unrestricted float m11, unrestricted float m12, unrestricted float m21, unrestricted float m22,
unrestricted float dx, unrestricted float dy);
+ [MayThrowException] void setTransform(optional DOMMatrixInit transform);
void resetTransform();
attribute unrestricted float globalAlpha;
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
