| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Test that the clip state persists across frame boundaries.</title> |
| </head> |
| <body> |
| <canvas id='canvas1' width='100' height='100'></canvas> |
| <canvas id='canvas2' width='100' height='100'></canvas> |
| <canvas id='canvas3' width='100' height='100'></canvas> |
| <canvas id='canvas4' width='100' height='100'></canvas> |
| <script> |
| var canvas1 = document.getElementById('canvas1'); |
| var canvas2 = document.getElementById('canvas2'); |
| var canvas3 = document.getElementById('canvas3'); |
| var canvas4 = document.getElementById('canvas4'); |
| var ctx1 = canvas1.getContext('2d'); |
| var ctx2 = canvas2.getContext('2d'); |
| var ctx3 = canvas3.getContext('2d'); |
| var ctx4 = canvas4.getContext('2d'); |
| if (window.testRunner) { |
| testRunner.waitUntilDone(); |
| } |
| window.requestAnimationFrame(setupClips); |
| |
| function setupClips() { |
| // ctx1 covers clipPath and unrealized save on the stack |
| ctx1.fillStyle = 'green'; |
| ctx1.fillRect(0, 0, 100, 100); |
| ctx1.save(); |
| ctx1.beginPath(); |
| ctx1.moveTo(10, 10); |
| ctx1.lineTo(90, 50); |
| ctx1.lineTo(10, 90); |
| ctx1.clip(); |
| ctx1.save(); |
| |
| // ctx2 covers accumulation of path and rect in separate layers |
| ctx2.fillStyle = 'green'; |
| ctx2.fillRect(0, 0, 100, 100); |
| ctx2.save(); |
| ctx2.beginPath(); |
| ctx2.moveTo(10, 10); |
| ctx2.lineTo(90, 50); |
| ctx2.lineTo(10, 90); |
| ctx2.clip(); |
| ctx2.save(); |
| ctx2.beginPath(); |
| ctx2.rect(50, 0, 50, 100); |
| ctx2.clip(); |
| |
| // ctx3 identical to ctx2, but will call restore before drawing |
| ctx3.fillStyle = 'green'; |
| ctx3.fillRect(0, 0, 100, 100); |
| ctx3.save(); |
| ctx3.beginPath(); |
| ctx3.moveTo(10, 10); |
| ctx3.lineTo(90, 50); |
| ctx3.lineTo(10, 90); |
| ctx3.clip(); |
| ctx3.save(); |
| ctx3.beginPath(); |
| ctx3.rect(50, 0, 50, 100); |
| ctx3.clip(); |
| |
| // ctx4 transformed clip |
| ctx4.fillStyle = 'green'; |
| ctx4.fillRect(0, 0, 100, 100); |
| ctx4.save(); |
| ctx4.translate(10, 0) |
| ctx4.beginPath(); |
| ctx4.moveTo(10, 10); |
| ctx4.lineTo(90, 50); |
| ctx4.lineTo(10, 90); |
| ctx4.clip(); |
| |
| window.requestAnimationFrame(drawPass) |
| } |
| |
| function drawPass() { |
| ctx1.fillStyle = 'yellow'; |
| ctx1.fillRect(0, 0, 100, 100); |
| |
| ctx2.fillStyle = 'yellow'; |
| ctx2.fillRect(0, 0, 100, 100); |
| |
| ctx3.restore(); |
| ctx3.fillStyle = 'yellow'; |
| ctx3.fillRect(0, 0, 100, 100); |
| |
| ctx4.fillStyle = 'yellow'; |
| ctx4.fillRect(-10, 0, 100, 100); |
| |
| if (window.testRunner) { |
| testRunner.notifyDone(); |
| } |
| } |
| </script> |
| </body> |
| </html> |