<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<body>
<script>
function fillWithColor(context, canvas, color1, color2) {
    context.save();
    context.fillStyle = color1;
    context.fillRect(0, 0, canvas.width / 2, canvas.height);
    context.fillStyle = color2;
    context.fillRect(canvas.width / 2, 0, canvas.width / 2, canvas.height);
    context.restore();
}

test(function(t) {

    var canvas = document.createElement("canvas");
    canvas.height = 100;
    canvas.width = 100;
    canvas.style.height = "100";
    canvas.style.width = "100";
    
    document.body.appendChild(canvas);
    
    var patternImage = document.createElement("canvas");
    patternImage.height = 10;
    patternImage.width = 20;
    var patternImageCtx = patternImage.getContext('2d');
    fillWithColor(patternImageCtx, patternImage, "red", "green");
    var greenPixel = patternImageCtx.getImageData(10, 0, 1, 1).data;
    
    var ctx = canvas.getContext('2d');
    var pattern = ctx.createPattern(patternImage, "repeat-x");
    var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
    var matrix = svgElement.createSVGMatrix();
    matrix = matrix.translate(10, 0);
    pattern.setTransform(matrix);
    
    fillWithColor(ctx, canvas, "blue", "blue");
    
    ctx.fillStyle = pattern;
    ctx.translate(20, 20);
    ctx.fillRect(0, 0, 10, 10);
    assert_array_equals(ctx.getImageData(20, 20, 1, 1).data, greenPixel);
    
}, "Test for supporting setTransform on canvas patterns");
</script>
</body>
