<!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.displayAndTrackRepaints();
            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>
