4 <title>Check repaint region of fillRect() and drawImage() with different composite modes.
</title>
5 <style type=
"text/css">
6 body
{ margin: 5px; font-family: arial
,verdana
,helvetica
; background: #fff; }
7 canvas
{ border: 1px solid
#999; }
9 #output h1
{ font-size: medium
; font-weight: normal
; }
10 #output h2
{ font-size: small
; font-weight: normal
; }
11 #output div
{ font-size: small
; margin: 0px; }
12 #output .pass
{ color: green
; }
13 #output .fail
{ color: rgb
(255, 0, 0); }
14 #output .error
{ color: rgb
(255, 0, 64); }
15 td
{ padding: 2px 5px; }
16 table
{ border-collapse: collapse
; }
20 <div>Test Results
</div>
21 <div><table id='outputtable'
></table></div>
23 <div><img id =
"image" src=
"data:image/png;base64,
24 iVBORw0KGgoAAAANSUhEUgAAAJYAAAA8CAIAAAAL5NQ9AAAACXBIWXMAAAsTAAALEwEAmpwY
25 AAAAB3RJTUUH2woaBQc4oLEFpAAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeB
26 DhcAAACMSURBVHja7dNBEYAgFEVRPhHMYgAzUIsmVnFvB/fsoQb+ObfBmzMvxneW1D1vzz2w
27 FiEUQiFEKIRCKIQIhVAIhRChEAqhECIUQiEUQoRCKIRCiFAIhVAIEep3xTWTLzzu5oVCKIRC
28 iFAIhVAIEQqhEAohQiEUQiFEKIRCKIQIhVAIhRChEAqhECLUZi3VEwcBMGr1NgAAAABJRU5E
31 <div>Test Canvas
</div>
32 <div><canvas id =
"source-canvas"></canvas></div>
34 <div><video id=
"video">
35 <source src=
"resources/canvas_video.mp4" type='video/mp4'
/>
36 <source src=
"resources/canvas_video.webm" type='video/webm'
/>
37 <source src=
"resources/canvas_video.ogv" type='video/ogg'
/>
39 <script src=
"../repaint/resources/text-based-repaint.js"></script>
40 <script type=
"application/x-javascript">
41 // These map to the rows of the table
42 var compositeTypes = [
43 'source-over','source-in','source-out','source-atop',
44 'destination-over','destination-in','destination-out','destination-atop',
45 'lighter','copy','xor'
48 // These map to the columns of the table
50 'solid color', 'image', 'canvas', 'video'
53 function createOutputTable() {
54 var tableEl = document.getElementById('outputtable');
55 var row = tableEl.insertRow(-
1);
56 var cell = row.insertCell(-
1);
58 for (var j =
0; j < testNames.length; j++) {
59 cell = row.insertCell(-
1);
60 label = document.createTextNode(testNames[j]);
61 cell.appendChild(label);
63 for (var i =
0; i < compositeTypes.length; i++) {
64 row = tableEl.insertRow(-
1);
65 cell = row.insertCell(-
1);
66 label = document.createTextNode(compositeTypes[i]);
67 cell.appendChild(label);
68 for (var j =
0; j < testNames.length; j++) {
69 var canvas = document.createElement('canvas');
72 canvas.id = compositeTypes[i] + testNames[j];
73 cell = row.insertCell(-
1);
74 cell.appendChild(canvas);
79 function getContext(compositeIndex, testIndex) {
80 var id = compositeTypes[compositeIndex] + testNames[testIndex];
81 var context = document.getElementById(id).getContext('
2d');
85 function setupContext(context) {
86 context.fillStyle = 'blue';
87 context.fillRect(
5,
5,
120,
30);
90 context.lineTo(
0,
45);
91 context.lineTo(
80,
45);
92 context.lineTo(
80,
0);
94 context.translate(
40, -
10);
95 context.scale(
0.4,
0.6);
96 context.rotate(Math.PI /
8);
97 context.translate(-
10, -
10);
100 function prepareRepaintTest() {
101 if (window.testRunner)
102 testRunner.dumpAsText();
104 for (var i =
0; i < compositeTypes.length; i++) {
105 for (var j =
0; j < testNames.length; j++) {
106 var context = getContext(i, j);
108 setupContext(context);
113 function drawRect(context) {
114 context.fillStyle = 'green';
115 context.fillRect(
10,
10,
150,
60);
118 function drawImage(context) {
119 context.drawImage(document.getElementById('image'),
10,
10);
122 function drawCanvas(context) {
123 context.drawImage(document.getElementById('source-canvas'),
10,
10);
126 function drawVideo(context) {
127 context.drawImage(document.getElementById('video'),
10,
10);
130 // callback from text-based-repaint.js
131 function repaintTest() {
132 for (var i =
0; i < compositeTypes.length; i++) {
133 for (var j =
0; j < testNames.length; j++) {
134 var context = getContext(i, j);
135 context.globalCompositeOperation = compositeTypes[i];
136 switch (testNames[j]) {
152 // Because canvas invalidations are processed at the end of the current task,
153 // the repaint test has to end in a subsequent task in order to capture the repaint.
154 setTimeout(finishRepaintTest,
0);
157 // we can start this test after the video can be played.
158 function startTest() {
159 video.removeEventListener(
"playing", startTest, true);
160 prepareRepaintTest();
164 var video = document.getElementById(
"video");
165 video.addEventListener(
"playing", startTest, true);
168 var imageElement = document.getElementById('image');
169 var canvas = document.getElementById('source-canvas');
170 canvas.width = imageElement.width;
171 canvas.height = imageElement.height;
172 var context = canvas.getContext('
2d');
173 context.drawImage(imageElement,
0,
0);
175 window.testIsAsync = true;