<!DOCTYPE html>
<html lang="en">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <title>Canvas Incremental Repaint</title>
  <style type="text/css" media="screen">
    canvas {
      width: 200px;
      height: 150px;
      border: 20px solid black;
    }
  </style>
  <script type="text/javascript" charset="utf-8">

    if (window.testRunner) {
      testRunner.dumpAsText(true);
      testRunner.waitUntilDone();
    }

    var appleImage;
    function runRepaintTest()
    {
        if (window.testRunner) {
            document.body.offsetTop;
            testRunner.display();
            repaintTest();
            testRunner.notifyDone();
        } else {
            setTimeout(repaintTest, 0);
        }
    }
    
    function initializeCanvas()
    {
      var canvas = document.getElementById('canvas1');
      canvas.width = 170; // deliberately different from element size, for scaling
      canvas.height = 125;

      // prep for clearRect test
      canvas = document.getElementById('canvas2');
      var ctx = canvas.getContext('2d');
      ctx.fillStyle = '#888888'; 
      ctx.fillRect(0, 0, canvas.width, canvas.height);
    }

    function repaintTest()
    {
      var canvas = document.getElementById('canvas1');
      var ctx = canvas.getContext('2d');

      // Test with default CTM
      ctx.fillStyle = 'black'; 
      ctx.strokeStyle = 'green'; 
      ctx.lineWidth = 12; 
      
      ctx.save();
      ctx.scale(1.5, 0.8);
      ctx.fillRect(30, 40, 70, 80);
      ctx.strokeRect(30, 40, 70, 80);
      ctx.restore();

      // Test clearRect
      canvas = document.getElementById('canvas2');
      ctx = canvas.getContext('2d');
      // clearRect is affected by the transform, and does shadows
      ctx.shadowOffsetX = 20;
      ctx.shadowOffsetY = 20;
      ctx.shadowBlur = 40;
      ctx.shadowColor = '#0000AA';
      ctx.translate(50, 10);
      ctx.clearRect(10, 10, 80, 80);

      // Test with stroke
      canvas = document.getElementById('canvas3');
      ctx = canvas.getContext('2d');
      
      ctx.beginPath();
      ctx.moveTo(100, 20);
      ctx.bezierCurveTo(150, 20, 150, 120, 100, 120);
      ctx.bezierCurveTo(50, 120, 50, 20, 100, 20);
      ctx.closePath();
      ctx.lineWidth = 20;
      ctx.strokeStyle = 'black'; 
      ctx.stroke();

      // Test with thick stroke and transform, and shadow
      canvas = document.getElementById('canvas4');
      ctx = canvas.getContext('2d');
      ctx.shadowOffsetX = 20;
      ctx.shadowOffsetY = 20;
      ctx.shadowBlur = 40;
      ctx.shadowColor = 'blue'
      ctx.lineWidth = 50;
      ctx.rotate(Math.PI / 5);
      ctx.scale(1.2, 1.2);
      ctx.strokeRect(100, 0, 1, 1);

      // Mitre test
      canvas = document.getElementById('canvas5');
      ctx = canvas.getContext('2d');
      ctx.moveTo(15, 40);
      ctx.lineTo(190, 60);
      ctx.lineTo(15, 80);

      ctx.lineWidth = 20;
      ctx.strokeStyle = '#222222'; 
      ctx.stroke();

      // Text test
      canvas = document.getElementById('canvas6');
      ctx = canvas.getContext('2d');
      ctx.font = "80px 'Times New Roman'";
      ctx.lineWidth = 40;
      ctx.scale(1, 0.9);
      ctx.strokeStyle = 'black';
      ctx.strokeText("WebKit", 20, 100);
      ctx.fillStyle = 'green'; 
      ctx.fillText("WebKit", 20, 100);

      // drawImage test
      canvas = document.getElementById('canvas7');
      ctx = canvas.getContext('2d');
      ctx.shadowOffsetX = 20;
      ctx.shadowOffsetY = 20;
      ctx.shadowBlur = 40;
      ctx.shadowColor = 'blue';
      ctx.translate(60, 0);
      ctx.drawImage(appleImage, 10, 10, 100, 100);
      
      // clip test
      canvas = document.getElementById('canvas8');
      ctx = canvas.getContext('2d');
      ctx.shadowOffsetX = 20;
      ctx.shadowOffsetY = 20;
      ctx.shadowBlur = 40;
      ctx.shadowColor = 'blue';
      
      ctx.beginPath();
      ctx.rect(50, 30, 80, 80);
      ctx.closePath();
      ctx.clip();
      
      ctx.translate(40, 0);
      ctx.drawImage(appleImage, 10, 10, 100, 100);
      
      // ImageData test
      canvas = document.getElementById('canvas9');
      ctx = canvas.getContext('2d');
      ctx.drawImage(appleImage, 10, 10, 100, 100);
      
      var imageData = ctx.getImageData(15, 15, 90, 90);

      // putImageData ignores shadow, transform and clip, but set the to test
      ctx.shadowOffsetX = 20;
      ctx.shadowOffsetY = 20;
      ctx.shadowBlur = 40;
      ctx.translate(160, 50);
      ctx.beginPath();
      ctx.rect(50, 30, 80, 80);
      ctx.closePath();
      ctx.clip();

      ctx.putImageData(imageData, 150, 20);
    }
    
    function pageLoaded()
    {
      initializeCanvas();

      appleImage = new Image();
      appleImage.onload = function() {
        runRepaintTest();
      }
      appleImage.src = "resources/apple.gif";
    }
  </script>
</head>
<body onload="pageLoaded()">

<canvas id="canvas1"></canvas>
<canvas id="canvas2"></canvas>
<canvas id="canvas3"></canvas><br>
<canvas id="canvas4"></canvas>
<canvas id="canvas5"></canvas>
<canvas id="canvas6"></canvas><br>
<canvas id="canvas7"></canvas>
<canvas id="canvas8"></canvas>
<canvas id="canvas9"></canvas>

</body>
</html>
