<html>
 <head>
 <script type="application/x-javascript">
    function createImage() {
        var image = document.createElement('canvas');
        image.height = 2;
        image.width = 2;
        // We use this to colour the individual pixels
        var dotter = image.getContext('2d').createImageData(1, 1);

        // Colour the black pixesl.
        dotter.data[0] = 0;
        dotter.data[1] = 0;
        dotter.data[2] = 0;
        dotter.data[3] = 255;
        image.getContext('2d').putImageData(dotter, 0, 0);
        image.getContext('2d').putImageData(dotter, 1, 1);

        // Colour the white pixels.
        dotter.data[0] = 255;
        dotter.data[1] = 255;
        dotter.data[2] = 255;
        dotter.data[3] = 255;
        image.getContext('2d').putImageData(dotter, 1, 0);
        image.getContext('2d').putImageData(dotter, 0, 1);
        return image;
    }

    function drawFillRect(canvas, image, smoothing) {
        var ctx = canvas.getContext('2d');
        var pattern = ctx.createPattern(image, "repeat");
        ctx.fillStyle = pattern;
        ctx.imageSmoothingEnabled = smoothing;
        ctx.scale(10, 10);
        ctx.fillRect(0, 0, canvas.width, canvas.height);
    }

    function drawFill(canvas, image, smoothing) {
        var ctx = canvas.getContext('2d');
        var pattern = ctx.createPattern(image, "repeat");
        ctx.fillStyle = pattern;
        ctx.imageSmoothingEnabled = smoothing;
        ctx.scale(10, 10);
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(10, 10);
        ctx.lineTo(0, 10);
        ctx.fill();
    }

    function drawStroke(canvas, image, smoothing) {
        var ctx = canvas.getContext('2d');
        var pattern = ctx.createPattern(image, "repeat");
        ctx.strokeStyle = pattern;
        ctx.lineWidth = 5;
        ctx.imageSmoothingEnabled = smoothing;
        ctx.scale(10, 10);
        ctx.beginPath();
        ctx.moveTo(0,0);
        ctx.lineTo(10, 10);
        ctx.stroke();
    }

    function draw() {
        if (window.testRunner)
            testRunner.dumpAsText(true);

        var image = createImage();
        drawFillRect(document.getElementById('unsmoothedFillRect'), image,
            false);
        drawFillRect(document.getElementById('smoothedFillRect'), image,
            true);
        drawFill(document.getElementById('unsmoothedFill'), image,
            false);
        drawFill(document.getElementById('smoothedFill'), image,
            true);
        drawStroke(document.getElementById('unsmoothedStroke'), image,
            false);
        drawStroke(document.getElementById('smoothedStroke'), image,
            true);
    }

  </script>
 </head>
 <body onload="draw()">
   <div>
     <canvas id="unsmoothedFillRect" width="100" height="100"></canvas>
     <canvas id="smoothedFillRect" width = "100" height="100"></canvas>
   </div>
   <div>
     <canvas id="unsmoothedFill" width="100" height="100"></canvas>
     <canvas id="smoothedFill" width = "100" height="100"></canvas>
   </div>
   <div>
     <canvas id="unsmoothedStroke" width="100" height="100"></canvas>
     <canvas id="smoothedStroke" width = "100" height="100"></canvas>
   </div>
 </body>
</html>
