| Index: LayoutTests/fast/canvas/script-tests/canvas-currentTransform.js
|
| diff --git a/LayoutTests/fast/canvas/script-tests/canvas-currentTransform.js b/LayoutTests/fast/canvas/script-tests/canvas-currentTransform.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..71b294cf71f650bb17b2861cdc682b26be35f0fb
|
| --- /dev/null
|
| +++ b/LayoutTests/fast/canvas/script-tests/canvas-currentTransform.js
|
| @@ -0,0 +1,305 @@
|
| +description("Series of tests to ensure correct behaviour of canvas.currentTransform");
|
| +var ctx = document.createElement('canvas').getContext('2d');
|
| +
|
| +var matrix = ctx.currentTransform;
|
| +
|
| +debug("Check initial currentTransform values");
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +
|
| +function setCurrentTransform(ctx, a, b, c, d, e, f)
|
| +{
|
| + matrix.a = a;
|
| + matrix.b = b;
|
| + matrix.c = c;
|
| + matrix.d = d;
|
| + matrix.e = e;
|
| + matrix.f = f;
|
| + ctx.currentTransform = matrix;
|
| + matrix.a = NaN;
|
| + matrix.b = NaN;
|
| + matrix.c = NaN;
|
| + matrix.d = NaN;
|
| + matrix.e = NaN;
|
| + matrix.f = NaN;
|
| + matrix = ctx.currentTransform;
|
| + shouldBe("matrix.a", "" + a);
|
| + shouldBe("matrix.b", "" + b);
|
| + shouldBe("matrix.c", "" + c);
|
| + shouldBe("matrix.d", "" + d);
|
| + shouldBe("matrix.e", "" + e);
|
| + shouldBe("matrix.f", "" + f);
|
| +}
|
| +
|
| +matrix.a = 2;
|
| +debug("Changing matrix should not affect the CTM");
|
| +shouldBe("ctx.currentTransform.a", "1");
|
| +shouldBe("ctx.currentTransform.b", "0");
|
| +shouldBe("ctx.currentTransform.c", "0");
|
| +shouldBe("ctx.currentTransform.d", "1");
|
| +shouldBe("ctx.currentTransform.e", "0");
|
| +shouldBe("ctx.currentTransform.f", "0");
|
| +
|
| +debug("Reset the CTM to the initial matrix");
|
| +ctx.beginPath();
|
| +ctx.scale(0.5, 0.5);
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "0.5");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "0.5");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +setCurrentTransform(ctx, 1, 0, 0, 1, 0, 0);
|
| +ctx.fillStyle = 'green';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +var imageData = ctx.getImageData(1, 1, 98, 98);
|
| +var imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "128");
|
| +shouldBe("imgdata[6]", "0");
|
| +
|
| +debug("currentTransform should not affect the current path");
|
| +ctx.beginPath();
|
| +ctx.rect(0,0,100,100);
|
| +ctx.save();
|
| +setCurrentTransform(ctx, 0.5, 0, 0, 0.5, 10, 10);
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +ctx.restore();
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +ctx.fillStyle = 'green';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "128");
|
| +shouldBe("imgdata[6]", "0");
|
| +
|
| +debug("currentTransform should not affect the CTM outside of save() and restore()");
|
| +ctx.beginPath();
|
| +ctx.fillStyle = 'green';
|
| +ctx.save();
|
| +setCurrentTransform(ctx, 0.5, 0, 0, 0.5, 0, 0);
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +ctx.restore();
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "128");
|
| +shouldBe("imgdata[6]", "0");
|
| +
|
| +debug("stop drawing on not-invertible CTM");
|
| +ctx.beginPath();
|
| +ctx.fillStyle = 'green';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +setCurrentTransform(ctx, 0, 0, 0, 0, 0, 0);
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "128");
|
| +shouldBe("imgdata[6]", "0");
|
| +
|
| +debug("currentTransform with a not-invertible matrix should only stop the drawing up to the next restore()");
|
| +ctx.beginPath();
|
| +ctx.resetTransform();
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +ctx.save();
|
| +setCurrentTransform(ctx, 0, 0, 0, 0, 0, 0);
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +ctx.restore();
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "0");
|
| +shouldBe("matrix.f", "0");
|
| +ctx.fillStyle = 'blue';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "0");
|
| +shouldBe("imgdata[6]", "255");
|
| +
|
| +debug("currentTransform should set transform although CTM is not-invertible");
|
| +ctx.beginPath();
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +setCurrentTransform(ctx, 0, 0, 0, 0, 0, 0);
|
| +ctx.fillStyle = 'green';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +setCurrentTransform(ctx, 1, 0, 0, 1, 0, 0);
|
| +ctx.fillStyle = 'blue';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "0");
|
| +shouldBe("imgdata[6]", "255");
|
| +
|
| +debug("Check assigning an invalid object throws exception as expected");
|
| +shouldThrow("ctx.currentTransform = ctx", "'TypeError: Type error'");
|
| +
|
| +debug("Check handling non-finite values. see 2d.transformation.setTransform.nonfinite.html");
|
| +ctx.fillStyle = 'red';
|
| +ctx.fillRect(0, 0, 100, 100);
|
| +
|
| +function setCurrentTransformToNonfinite(ctx, a, b, c, d, e, f)
|
| +{
|
| + matrix.a = a;
|
| + matrix.b = b;
|
| + matrix.c = c;
|
| + matrix.d = d;
|
| + matrix.e = e;
|
| + matrix.f = f;
|
| + ctx.currentTransform = matrix;
|
| + matrix.a = NaN;
|
| + matrix.b = NaN;
|
| + matrix.c = NaN;
|
| + matrix.d = NaN;
|
| + matrix.e = NaN;
|
| + matrix.f = NaN;
|
| + matrix = ctx.currentTransform;
|
| + shouldBe("matrix.a", "1");
|
| + shouldBe("matrix.b", "0");
|
| + shouldBe("matrix.c", "0");
|
| + shouldBe("matrix.d", "1");
|
| + shouldBe("matrix.e", "100");
|
| + shouldBe("matrix.f", "10");
|
| +}
|
| +
|
| +ctx.translate(100, 10);
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "100");
|
| +shouldBe("matrix.f", "10");
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, -Infinity, 0, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, NaN, 0, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, -Infinity, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, NaN, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, -Infinity, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, NaN, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, -Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, NaN, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, -Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, NaN, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, 0, -Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, 0, NaN);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, Infinity, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, Infinity, 0, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, Infinity, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, Infinity, 0, 0, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, 0, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, Infinity, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, Infinity, 0, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, Infinity, 0, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, 0, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, 0, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, Infinity, 0, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, Infinity, Infinity, 0);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, Infinity, Infinity, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, Infinity, 0, Infinity);
|
| +setCurrentTransformToNonfinite(ctx, 0, 0, 0, 0, Infinity, Infinity);
|
| +matrix = ctx.currentTransform;
|
| +shouldBe("matrix.a", "1");
|
| +shouldBe("matrix.b", "0");
|
| +shouldBe("matrix.c", "0");
|
| +shouldBe("matrix.d", "1");
|
| +shouldBe("matrix.e", "100");
|
| +shouldBe("matrix.f", "10");
|
| +
|
| +ctx.fillStyle = 'green';
|
| +ctx.fillRect(-100, -10, 100, 100);
|
| +
|
| +imageData = ctx.getImageData(1, 1, 98, 98);
|
| +imgdata = imageData.data;
|
| +shouldBe("imgdata[4]", "0");
|
| +shouldBe("imgdata[5]", "128");
|
| +shouldBe("imgdata[6]", "0");
|
|
|