Index: third_party/WebKit/LayoutTests/paint/invalidation/canvas-composite-repaint-by-all-imagesource.html |
diff --git a/third_party/WebKit/LayoutTests/paint/invalidation/canvas-composite-repaint-by-all-imagesource.html b/third_party/WebKit/LayoutTests/paint/invalidation/canvas-composite-repaint-by-all-imagesource.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a00c00d5192761eec9162a60e966cc73916a045b |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/paint/invalidation/canvas-composite-repaint-by-all-imagesource.html |
@@ -0,0 +1,178 @@ |
+<!doctype html> |
+<html> |
+ <head> |
+ <title>Check repaint region of fillRect() and drawImage() with different composite modes.</title> |
+ <style type="text/css"> |
+ body { margin: 5px; font-family: arial,verdana,helvetica; background: #fff; } |
+ canvas { border: 1px solid #999; } |
+ div { margin: 10px; } |
+ #output h1 { font-size: medium; font-weight: normal; } |
+ #output h2 { font-size: small; font-weight: normal; } |
+ #output div { font-size: small; margin: 0px; } |
+ #output .pass { color: green; } |
+ #output .fail { color: rgb(255, 0, 0); } |
+ #output .error { color: rgb(255, 0, 64); } |
+ td { padding: 2px 5px; } |
+ table { border-collapse: collapse; } |
+ </style> |
+ </head> |
+ <body> |
+ <div>Test Results</div> |
+ <div><table id='outputtable'></table></div> |
+ <div>Test Image</div> |
+ <div><img id = "image" src="data:image/png;base64, |
+ iVBORw0KGgoAAAANSUhEUgAAAJYAAAA8CAIAAAAL5NQ9AAAACXBIWXMAAAsTAAALEwEAmpwY |
+ AAAAB3RJTUUH2woaBQc4oLEFpAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeB |
+ DhcAAACMSURBVHja7dNBEYAgFEVRPhHMYgAzUIsmVnFvB/fsoQb+ObfBmzMvxneW1D1vzz2w |
+ FiEUQiFEKIRCKIQIhVAIhRChEAqhECIUQiEUQoRCKIRCiFAIhVAIEep3xTWTLzzu5oVCKIRC |
+ iFAIhVAIEQqhEAohQiEUQiFEKIRCKIQIhVAIhRChEAqhECLUZi3VEwcBMGr1NgAAAABJRU5E |
+ rkJggg== |
+ "></div> |
+ <div>Test Canvas</div> |
+ <div><canvas id = "source-canvas"></canvas></div> |
+ <div>Test Video</div> |
+ <div><video id="video"> |
+ <source src="../../fast/canvas/resources/canvas_video.mp4" type='video/mp4' /> |
+ <source src="../../fast/canvas/resources/canvas_video.webm" type='video/webm' /> |
+ <source src="../../fast/canvas/resources/canvas_video.ogv" type='video/ogg' /> |
+ </video></div> |
+ <script src="resources/text-based-repaint.js"></script> |
+ <script type="application/x-javascript"> |
+ // These map to the rows of the table |
+ var compositeTypes = [ |
+ 'source-over','source-in','source-out','source-atop', |
+ 'destination-over','destination-in','destination-out','destination-atop', |
+ 'lighter','copy','xor' |
+ ]; |
+ |
+ // These map to the columns of the table |
+ var testNames = [ |
+ 'solid color', 'image', 'canvas', 'video' |
+ ]; |
+ |
+ function createOutputTable() { |
+ var tableEl = document.getElementById('outputtable'); |
+ var row = tableEl.insertRow(-1); |
+ var cell = row.insertCell(-1); |
+ var label; |
+ for (var j = 0; j < testNames.length; j++) { |
+ cell = row.insertCell(-1); |
+ label = document.createTextNode(testNames[j]); |
+ cell.appendChild(label); |
+ } |
+ for (var i = 0; i < compositeTypes.length; i++) { |
+ row = tableEl.insertRow(-1); |
+ cell = row.insertCell(-1); |
+ label = document.createTextNode(compositeTypes[i]); |
+ cell.appendChild(label); |
+ for (var j = 0; j < testNames.length; j++) { |
+ var canvas = document.createElement('canvas'); |
+ canvas.width = 130; |
+ canvas.height = 40; |
+ canvas.id = compositeTypes[i] + testNames[j]; |
+ cell = row.insertCell(-1); |
+ cell.appendChild(canvas); |
+ } |
+ } |
+ } |
+ |
+ function getContext(compositeIndex, testIndex) { |
+ var id = compositeTypes[compositeIndex] + testNames[testIndex]; |
+ var context = document.getElementById(id).getContext('2d'); |
+ return context; |
+ } |
+ |
+ function setupContext(context) { |
+ context.fillStyle = 'blue'; |
+ context.fillRect(5, 5, 120, 30); |
+ context.beginPath(); |
+ context.moveTo(0, 0); |
+ context.lineTo(0, 45); |
+ context.lineTo(80, 45); |
+ context.lineTo(80, 0); |
+ context.clip(); |
+ context.translate(40, -10); |
+ context.scale(0.4, 0.6); |
+ context.rotate(Math.PI / 8); |
+ context.translate(-10, -10); |
+ } |
+ |
+ function prepareRepaintTest() { |
+ if (window.testRunner) |
+ testRunner.dumpAsText(); |
+ createOutputTable(); |
+ for (var i = 0; i < compositeTypes.length; i++) { |
+ for (var j = 0; j < testNames.length; j++) { |
+ var context = getContext(i, j); |
+ context.save(); |
+ setupContext(context); |
+ } |
+ } |
+ } |
+ |
+ function drawRect(context) { |
+ context.fillStyle = 'green'; |
+ context.fillRect(10, 10, 150, 60); |
+ } |
+ |
+ function drawImage(context) { |
+ context.drawImage(document.getElementById('image'), 10, 10); |
+ } |
+ |
+ function drawCanvas(context) { |
+ context.drawImage(document.getElementById('source-canvas'), 10, 10); |
+ } |
+ |
+ function drawVideo(context) { |
+ context.drawImage(document.getElementById('video'), 10, 10); |
+ } |
+ |
+ // callback from text-based-repaint.js |
+ function repaintTest() { |
+ for (var i = 0; i < compositeTypes.length; i++) { |
+ for (var j = 0; j < testNames.length; j++) { |
+ var context = getContext(i, j); |
+ context.globalCompositeOperation = compositeTypes[i]; |
+ switch (testNames[j]) { |
+ case 'solid color': |
+ drawRect(context); |
+ break; |
+ case 'image': |
+ drawImage(context); |
+ break; |
+ case 'canvas': |
+ drawCanvas(context); |
+ break; |
+ case 'video': |
+ drawVideo(context); |
+ } |
+ context.restore(); |
+ } |
+ } |
+ // Because canvas invalidations are processed at the end of the current task, |
+ // the repaint test has to end in a subsequent task in order to capture the repaint. |
+ setTimeout(finishRepaintTest, 0); |
+ } |
+ |
+ // we can start this test after the video can be played. |
+ function startTest() { |
+ video.removeEventListener("playing", startTest, true); |
+ prepareRepaintTest(); |
+ runRepaintTest(); |
+ } |
+ |
+ var video = document.getElementById("video"); |
+ video.addEventListener("playing", startTest, true); |
+ video.play(); |
+ |
+ var imageElement = document.getElementById('image'); |
+ var canvas = document.getElementById('source-canvas'); |
+ canvas.width = imageElement.width; |
+ canvas.height = imageElement.height; |
+ var context = canvas.getContext('2d'); |
+ context.drawImage(imageElement, 0, 0); |
+ |
+ window.testIsAsync = true; |
+ </script> |
+ </body> |
+</html> |