| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library canvas_rendering_context_2d_test; import '../../pkg/unittest/lib/unittes
t.dart'; | 5 library canvas_rendering_context_2d_test; |
| 6 import '../../pkg/unittest/lib/unittest.dart'; |
| 6 import '../../pkg/unittest/lib/html_config.dart'; | 7 import '../../pkg/unittest/lib/html_config.dart'; |
| 7 import 'dart:html'; | 8 import 'dart:html'; |
| 8 import 'dart:math'; | 9 import 'dart:math'; |
| 9 | 10 |
| 10 // Some rounding errors in the browsers. | 11 // Some rounding errors in the browsers. |
| 11 checkPixel(List<int> pixel, List<int> expected) { | 12 checkPixel(List<int> pixel, List<int> expected) { |
| 12 expect(pixel[0], closeTo(expected[0], 2)); | 13 expect(pixel[0], closeTo(expected[0], 2)); |
| 13 expect(pixel[1], closeTo(expected[1], 2)); | 14 expect(pixel[1], closeTo(expected[1], 2)); |
| 14 expect(pixel[2], closeTo(expected[2], 2)); | 15 expect(pixel[2], closeTo(expected[2], 2)); |
| 15 expect(pixel[3], closeTo(expected[3], 2)); | 16 expect(pixel[3], closeTo(expected[3], 2)); |
| 16 } | 17 } |
| 17 | 18 |
| 18 var canvas; | |
| 19 var context; | |
| 20 var otherCanvas; | |
| 21 var otherContext; | |
| 22 var video; | |
| 23 | |
| 24 void createCanvas() { | |
| 25 canvas = new CanvasElement(); | |
| 26 canvas.width = 100; | |
| 27 canvas.height = 100; | |
| 28 | |
| 29 context = canvas.context2d; | |
| 30 } | |
| 31 | |
| 32 void createOtherCanvas() { | |
| 33 otherCanvas = new CanvasElement(); | |
| 34 otherCanvas.width = 10; | |
| 35 otherCanvas.height = 10; | |
| 36 otherContext = otherCanvas.context2d; | |
| 37 otherContext.fillStyle = "red"; | |
| 38 otherContext.fillRect(0, 0, otherCanvas.width, otherCanvas.height); | |
| 39 } | |
| 40 | |
| 41 void setupFunc() { | |
| 42 createCanvas(); | |
| 43 createOtherCanvas(); | |
| 44 video = new VideoElement(); | |
| 45 } | |
| 46 | |
| 47 void tearDownFunc() { | |
| 48 canvas = null; | |
| 49 context = null; | |
| 50 otherCanvas = null; | |
| 51 otherContext = null; | |
| 52 video = null; | |
| 53 } | |
| 54 | |
| 55 List<int> readPixel(int x, int y) { | |
| 56 var imageData = context.getImageData(x, y, 1, 1); | |
| 57 return imageData.data; | |
| 58 } | |
| 59 | |
| 60 /// Returns true if the pixel has some data in it, false otherwise. | |
| 61 bool isPixelFilled(int x, int y) => readPixel(x,y).any((p) => p != 0); | |
| 62 | |
| 63 String pixelDataToString(List<int> data, int x, int y) { | |
| 64 return '[${data.join(", ")}]'; | |
| 65 } | |
| 66 | |
| 67 String _filled(bool v) => v ? "filled" : "unfilled"; | |
| 68 | |
| 69 void expectPixelFilled(int x, int y, [bool filled = true]) { | |
| 70 expect(isPixelFilled(x, y), filled, reason: | |
| 71 'Pixel at ($x, $y) was expected to' | |
| 72 ' be: <${_filled(filled)}> but was: <${_filled(!filled)}> with data: ' | |
| 73 '${pixelDataToString(readPixel(x, y), x, y)}'); | |
| 74 } | |
| 75 | |
| 76 void expectPixelUnfilled(int x, int y) { | |
| 77 expectPixelFilled(x, y, false); | |
| 78 } | |
| 79 | |
| 80 main() { | 19 main() { |
| 81 useHtmlConfiguration(); | 20 useHtmlConfiguration(); |
| 82 | 21 |
| 83 group('pixel_manipulation', () { | 22 group('canvasRenderingContext2d', () { |
| 84 setUp(setupFunc); | 23 var canvas; |
| 85 tearDown(tearDownFunc); | 24 var context; |
| 25 var otherCanvas; |
| 26 var otherContext; |
| 27 |
| 28 void createOtherCanvas() { |
| 29 otherCanvas = new CanvasElement(); |
| 30 otherCanvas.width = 10; |
| 31 otherCanvas.height = 10; |
| 32 otherContext = otherCanvas.context2d; |
| 33 otherContext.fillStyle = "red"; |
| 34 otherContext.fillRect(0, 0, otherCanvas.width, otherCanvas.height); |
| 35 } |
| 36 |
| 37 setUp(() { |
| 38 canvas = new CanvasElement(); |
| 39 canvas.width = 100; |
| 40 canvas.height = 100; |
| 41 |
| 42 context = canvas.context2d; |
| 43 |
| 44 createOtherCanvas(); |
| 45 }); |
| 46 |
| 47 tearDown(() { |
| 48 canvas = null; |
| 49 context = null; |
| 50 otherCanvas = null; |
| 51 otherContext = null; |
| 52 }); |
| 53 |
| 54 List<int> readPixel(int x, int y) { |
| 55 var imageData = context.getImageData(x, y, 1, 1); |
| 56 return imageData.data; |
| 57 } |
| 58 |
| 59 /// Returns true if the pixel has some data in it, false otherwise. |
| 60 bool isPixelFilled(int x, int y) => readPixel(x,y).any((p) => p != 0); |
| 61 |
| 62 String pixelDataToString(int x, int y) { |
| 63 var data = readPixel(x, y); |
| 64 |
| 65 return '[${data.join(", ")}]'; |
| 66 } |
| 67 |
| 68 String _filled(bool v) => v ? "filled" : "unfilled"; |
| 69 |
| 70 void expectPixelFilled(int x, int y, [bool filled = true]) { |
| 71 expect(isPixelFilled(x, y), filled, reason: |
| 72 'Pixel at ($x, $y) was expected to' |
| 73 ' be: <${_filled(filled)}> but was: <${_filled(!filled)}> with data: ' |
| 74 '${pixelDataToString(x,y)}'); |
| 75 } |
| 76 |
| 77 void expectPixelUnfilled(int x, int y) { |
| 78 expectPixelFilled(x, y, false); |
| 79 } |
| 80 |
| 86 | 81 |
| 87 test('setFillColorRgb', () { | 82 test('setFillColorRgb', () { |
| 88 context.setFillColorRgb(255, 0, 255, 1); | 83 context.setFillColorRgb(255, 0, 255, 1); |
| 89 context.fillRect(0, 0, canvas.width, canvas.height); | 84 context.fillRect(0, 0, canvas.width, canvas.height); |
| 90 expect(readPixel(2, 2), [255, 0, 255, 255]); | 85 expect(readPixel(2, 2), [255, 0, 255, 255]); |
| 91 }); | 86 }); |
| 92 | 87 |
| 93 test('setFillColorHsl hue', () { | 88 test('setFillColorHsl hue', () { |
| 94 context.setFillColorHsl(0, 100, 50); | 89 context.setFillColorHsl(0, 100, 50); |
| 95 context.fillRect(0, 0, canvas.width, canvas.height); | 90 context.fillRect(0, 0, canvas.width, canvas.height); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 expectedData.data[3] = 255; | 162 expectedData.data[3] = 255; |
| 168 context.fillStyle = 'green'; | 163 context.fillStyle = 'green'; |
| 169 context.fillRect(0, 0, canvas.width, canvas.height); | 164 context.fillRect(0, 0, canvas.width, canvas.height); |
| 170 | 165 |
| 171 context.putImageData(expectedData, 0, 0); | 166 context.putImageData(expectedData, 0, 0); |
| 172 | 167 |
| 173 var resultingData = context.getImageData(0, 0, 10, 10); | 168 var resultingData = context.getImageData(0, 0, 10, 10); |
| 174 // Make sure that we read back what we wrote. | 169 // Make sure that we read back what we wrote. |
| 175 expect(resultingData.data, expectedData.data); | 170 expect(resultingData.data, expectedData.data); |
| 176 }); | 171 }); |
| 177 }); | |
| 178 | |
| 179 group('arc', () { | |
| 180 setUp(setupFunc); | |
| 181 tearDown(tearDownFunc); | |
| 182 | 172 |
| 183 test('default arc should be clockwise', () { | 173 test('default arc should be clockwise', () { |
| 184 context.beginPath(); | 174 context.beginPath(); |
| 185 final r = 10; | 175 final r = 10; |
| 186 | 176 |
| 187 // Center of arc. | 177 // Center of arc. |
| 188 final cx = 20; | 178 final cx = 20; |
| 189 final cy = 20; | 179 final cy = 20; |
| 190 // Arc centered at (20, 20) with radius 10 will go clockwise | 180 // Arc centered at (20, 20) with radius 10 will go clockwise |
| 191 // from (20 + r, 20) to (20, 20 + r), which is 1/4 of a circle. | 181 // from (20 + r, 20) to (20, 20 + r), which is 1/4 of a circle. |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 255 | 245 |
| 256 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 246 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. |
| 257 expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true); | 247 expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true); |
| 258 | 248 |
| 259 // (cx + r/SQRT2, cy + r/SQRT2) should be filled. | 249 // (cx + r/SQRT2, cy + r/SQRT2) should be filled. |
| 260 expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); | 250 expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); |
| 261 | 251 |
| 262 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 252 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. |
| 263 expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); | 253 expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); |
| 264 }); | 254 }); |
| 265 }); | |
| 266 | 255 |
| 267 group('drawImage_image_element', () { | |
| 268 setUp(setupFunc); | |
| 269 tearDown(tearDownFunc); | |
| 270 // Draw an image to the canvas from an image element. | 256 // Draw an image to the canvas from an image element. |
| 271 test('with 3 params', () { | 257 test('drawImage from img element with 3 params', () { |
| 272 var dataUrl = otherCanvas.toDataUrl('image/gif'); | 258 var dataUrl = otherCanvas.toDataUrl('image/gif'); |
| 273 var img = new ImageElement(); | 259 var img = new ImageElement(); |
| 274 | 260 |
| 275 img.onLoad.listen(expectAsync1((_) { | 261 img.onLoad.listen(expectAsync1((_) { |
| 276 context.drawImage(img, 50, 50); | 262 context.drawImage(img, 50, 50); |
| 277 | 263 |
| 278 expectPixelFilled(50, 50); | 264 expectPixelFilled(50, 50); |
| 279 expectPixelFilled(55, 55); | 265 expectPixelFilled(55, 55); |
| 280 expectPixelFilled(59, 59); | 266 expectPixelFilled(59, 59); |
| 281 expectPixelUnfilled(60, 60); | 267 expectPixelUnfilled(60, 60); |
| 282 expectPixelUnfilled(0, 0); | 268 expectPixelUnfilled(0, 0); |
| 283 expectPixelUnfilled(70, 70); | 269 expectPixelUnfilled(70, 70); |
| 284 })); | 270 })); |
| 285 img.onError.listen((_) { | 271 img.onError.listen((_) { |
| 286 guardAsync(() { | 272 guardAsync(() { |
| 287 fail('URL failed to load.'); | 273 fail('URL failed to load.'); |
| 288 }); | 274 }); |
| 289 }); | 275 }); |
| 290 img.src = dataUrl; | 276 img.src = dataUrl; |
| 291 }); | 277 }); |
| 292 | 278 |
| 293 // Draw an image to the canvas from an image element and scale it. | 279 // Draw an image to the canvas from an image element and scale it. |
| 294 test('with 5 params', () { | 280 test('drawImage from img element with 5 params', () { |
| 295 var dataUrl = otherCanvas.toDataUrl('image/gif'); | 281 var dataUrl = otherCanvas.toDataUrl('image/gif'); |
| 296 var img = new ImageElement(); | 282 var img = new ImageElement(); |
| 297 | 283 |
| 298 img.onLoad.listen(expectAsync1((_) { | 284 img.onLoad.listen(expectAsync1((_) { |
| 299 context.drawImageToRect(img, new Rect(50, 50, 20, 20)); | 285 context.drawImageToRect(img, new Rect(50, 50, 20, 20)); |
| 300 | 286 |
| 301 expectPixelFilled(50, 50); | 287 expectPixelFilled(50, 50); |
| 302 expectPixelFilled(55, 55); | 288 expectPixelFilled(55, 55); |
| 303 expectPixelFilled(59, 59); | 289 expectPixelFilled(59, 59); |
| 304 expectPixelFilled(60, 60); | 290 expectPixelFilled(60, 60); |
| 305 expectPixelFilled(69, 69); | 291 expectPixelFilled(69, 69); |
| 306 expectPixelUnfilled(70, 70); | 292 expectPixelUnfilled(70, 70); |
| 307 expectPixelUnfilled(0, 0); | 293 expectPixelUnfilled(0, 0); |
| 308 expectPixelUnfilled(80, 80); | 294 expectPixelUnfilled(80, 80); |
| 309 })); | 295 })); |
| 310 img.onError.listen((_) { | 296 img.onError.listen((_) { |
| 311 guardAsync(() { | 297 guardAsync(() { |
| 312 fail('URL failed to load.'); | 298 fail('URL failed to load.'); |
| 313 }); | 299 }); |
| 314 }); | 300 }); |
| 315 img.src = dataUrl; | 301 img.src = dataUrl; |
| 316 }); | 302 }); |
| 317 | 303 |
| 318 // Draw an image to the canvas from an image element and scale it. | 304 // Draw an image to the canvas from an image element and scale it. |
| 319 test('with 9 params', () { | 305 test('drawImage from img element with 9 params', () { |
| 320 otherContext.fillStyle = "blue"; | 306 otherContext.fillStyle = "blue"; |
| 321 otherContext.fillRect(5, 5, 5, 5); | 307 otherContext.fillRect(5, 5, 5, 5); |
| 322 var dataUrl = otherCanvas.toDataUrl('image/gif'); | 308 var dataUrl = otherCanvas.toDataUrl('image/gif'); |
| 323 var img = new ImageElement(); | 309 var img = new ImageElement(); |
| 324 | 310 |
| 325 img.onLoad.listen(expectAsync1((_) { | 311 img.onLoad.listen(expectAsync1((_) { |
| 326 // This will take a 6x6 square from the first canvas from position 2,2 | 312 // This will take a 6x6 square from the first canvas from position 2,2 |
| 327 // and then scale it to a 20x20 square and place it to the second | 313 // and then scale it to a 20x20 square and place it to the second canvas |
| 328 // canvas at 50,50. | 314 // at 50,50. |
| 329 context.drawImageToRect(img, new Rect(50, 50, 20, 20), | 315 context.drawImageToRect(img, new Rect(50, 50, 20, 20), |
| 330 sourceRect: new Rect(2, 2, 6, 6)); | 316 sourceRect: new Rect(2, 2, 6, 6)); |
| 331 | 317 |
| 332 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); | 318 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); |
| 333 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); | 319 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); |
| 334 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); | 320 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); |
| 335 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); | 321 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); |
| 336 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); | 322 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); |
| 337 | 323 |
| 338 expectPixelFilled(50, 50); | 324 expectPixelFilled(50, 50); |
| 339 expectPixelFilled(55, 55); | 325 expectPixelFilled(55, 55); |
| 340 expectPixelFilled(59, 59); | 326 expectPixelFilled(59, 59); |
| 341 expectPixelFilled(60, 60); | 327 expectPixelFilled(60, 60); |
| 342 expectPixelFilled(69, 69); | 328 expectPixelFilled(69, 69); |
| 343 expectPixelUnfilled(70, 70); | 329 expectPixelUnfilled(70, 70); |
| 344 expectPixelUnfilled(0, 0); | 330 expectPixelUnfilled(0, 0); |
| 345 expectPixelUnfilled(80, 80); | 331 expectPixelUnfilled(80, 80); |
| 346 })); | 332 })); |
| 347 img.onError.listen((_) { | 333 img.onError.listen((_) { |
| 348 guardAsync(() { | 334 guardAsync(() { |
| 349 fail('URL failed to load.'); | 335 fail('URL failed to load.'); |
| 350 }); | 336 }); |
| 351 }); | 337 }); |
| 352 img.src = dataUrl; | 338 img.src = dataUrl; |
| 353 }); | 339 }); |
| 354 }); | |
| 355 | 340 |
| 356 // These videos and base64 strings are the same video, representing 2 | 341 // These base64 strings are the same video, representing 2 frames of 8x8 red |
| 357 // frames of 8x8 red pixels. | 342 // pixels. |
| 358 // The videos were created with: | 343 // The videos were created with: |
| 359 // convert -size 8x8 xc:red blank1.jpg | 344 // convert -size 8x8 xc:red blank1.jpg |
| 360 // convert -size 8x8 xc:red blank2.jpg | 345 // convert -size 8x8 xc:red blank2.jpg |
| 361 // avconv -f image2 -i "blank%d.jpg" -c:v libx264 small.mp4 | 346 // avconv -f image2 -i "blank%d.jpg" -c:v libx264 small.mp4 |
| 362 // avconv -i small.mp4 small.webm | 347 // python -m base64 -e small.mp4 |
| 363 // python -m base64 -e small.mp4 | 348 // avconv -i small.mp4 small.webm |
| 364 // python -m base64 -e small.webm | 349 // python -m base64 -e small.webm |
| 365 var mp4VideoUrl = '/root_dart/tests/html/small.mp4'; | 350 var mp4VideoUrl = |
| 366 var webmVideoUrl = '/root_dart/tests/html/small.webm'; | 351 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZn' |
| 367 var mp4VideoDataUrl = | 352 'JlZQAAAsdtZGF0AAACmwYF//+X3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDEyMCByMj' |
| 368 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAA' | 353 'E1MSBhM2Y0NDA3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMj' |
| 369 'AIZnJlZQAAAsdtZGF0AAACmwYF//+X3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlID' | 354 'AxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYm' |
| 370 'EyMCByMjE1MSBhM2Y0NDA3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZW' | 355 'FjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibW' |
| 371 'Z0IDIwMDMtMjAxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG' | 356 'U9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm' |
| 372 '9wdGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweD' | 357 '9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3' |
| 373 'ExMSBtZT1oZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj' | 358 'Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTE4IHNsaWNlZF90aHJlYWRzPT' |
| 374 '0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MCBjcW09MC' | 359 'AgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYW' |
| 375 'BkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aH' | 360 'luZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTAgYl9hZGFwdD0xIGJfYmlhcz0wIG' |
| 376 'JlYWRzPTE4IHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZW' | 361 'RpcmVjdD0xIHdlaWdodGI9MCBvcGVuX2dvcD0xIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleW' |
| 377 'Q9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl' | 362 'ludF9taW49MjUgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MC' |
| 378 '9weXJhbWlkPTAgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MCBvcG' | 363 'ByYz1jcmYgbWJ0cmVlPTEgY3JmPTUxLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IH' |
| 379 'VuX2dvcD0xIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleWludF9taW49MjUgc2NlbmVjdX' | 364 'Fwc3RlcD00IGlwX3JhdGlvPTEuMjUgYXE9MToxLjAwAIAAAAARZYiEB//3aoK5/tP9+8yeuI' |
| 380 'Q9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MCByYz1jcmYgbWJ0cmVlPT' | 365 'EAAAAHQZoi2P/wgAAAAzxtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAUAABAAABAA' |
| 381 'EgY3JmPTUxLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IGlwX3' | 366 'AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAA' |
| 382 'JhdGlvPTEuMjUgYXE9MToxLjAwAIAAAAARZYiEB//3aoK5/tP9+8yeuIEAAAAHQZoi2P' | 367 'AAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT/////7/AAACUHRyYWsAAA' |
| 383 '/wgAAAAzxtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAUAABAAABAAAAAAAAAA' | 368 'BcdGtoZAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA' |
| 384 'AAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAA' | 369 'AAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAgAAAAAACRlZHRzAAAAHGVsc3QAAA' |
| 385 'AAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT/////7/AAACUHRyYWsAAA' | 370 'AAAAAAAQAAAFAAAAABAAEAAAAAAchtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAAAZAAAAAl' |
| 386 'BcdGtoZAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAQAAAA' | 371 'XEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFzbW' |
| 387 'AAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAgAAAAAACRlZHRzAAAAHG' | 372 'luZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybC' |
| 388 'Vsc3QAAAAAAAAAAQAAAFAAAAABAAEAAAAAAchtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAA' | 373 'AAAAABAAABM3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2YzEAAAAAAAAAAQAAAAAAAAAAAA' |
| 389 'AAAAAZAAAAAlXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSG' | 374 'AAAAAAAAAACAAIAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' |
| 390 'FuZGxlcgAAAAFzbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZg' | 375 'AAAAAY//8AAAAxYXZjQwFNQAr/4QAYZ01ACuiPyy4C2QAAAwABAAADADIPEiUSAQAGaOvAZS' |
| 391 'AAAAAAAAABAAAADHVybCAAAAABAAABM3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2Yz' | 376 'yAAAAAGHN0dHMAAAAAAAAAAQAAAAIAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cw' |
| 392 'EAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAACAAIAEgAAABIAAAAAAAAAAEAAAAAAAAAAA' | 377 'AAAAAAAAABAAAAAgAAAAEAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAHHN0c3oAAA' |
| 393 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY//8AAAAxYXZjQwFNQAr/4QAYZ01ACuiPyy' | 378 'AAAAAAAAAAAAIAAAK0AAAACwAAABhzdGNvAAAAAAAAAAIAAAAwAAAC5AAAAGB1ZHRhAAAAWG' |
| 394 '4C2QAAAwABAAADADIPEiUSAQAGaOvAZSyAAAAAGHN0dHMAAAAAAAAAAQAAAAIAAAABAA' | 379 '1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqX' |
| 395 'AAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cwAAAAAAAAABAAAAAgAAAAEAAAAcc3RzYw' | 380 'RvbwAAABtkYXRhAAAAAQAAAABMYXZmNTMuMjEuMQ=='; |
| 396 'AAAAAAAAABAAAAAQAAAAEAAAABAAAAHHN0c3oAAAAAAAAAAAAAAAIAAAK0AAAACwAAAB' | 381 var webmVideoUrl = |
| 397 'hzdGNvAAAAAAAAAAIAAAAwAAAC5AAAAGB1ZHRhAAAAWG1ldGEAAAAAAAAAIWhkbHIAAA' | 382 'data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch' |
| 398 'AAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqXRvbwAAABtkYXRhAAAAAQ' | 383 '4ECQoWBAhhTgGcBAAAAAAAB/hFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEsT' |
| 399 'AAAABMYXZmNTMuMjEuMQ=='; | 384 'buMU6uEHFO7a1OsggHk7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' |
| 400 var webmVideoDataUrl = | 385 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' |
| 401 'data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlY' | 386 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' |
| 402 'm1Ch4ECQoWBAhhTgGcBAAAAAAAB/hFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua' | 387 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEEq17GDD0JATYCLTGF2ZjUzL' |
| 403 '1OsggEsTbuMU6uEHFO7a1OsggHk7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | 388 'jIxLjFXQYtMYXZmNTMuMjEuMXOkkJatuHwTJ7cvFLSzBSmxbp5EiYhAVAAAAAAAABZUrmsBA' |
| 404 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | 389 'AAAAAAAR64BAAAAAAAAPteBAXPFgQGcgQAitZyDdW5khoVWX1ZQOIOBASPjg4QCYloA4AEAA' |
| 405 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | 390 'AAAAAASsIEIuoEIVLCBCFS6gQhUsoEDH0O2dQEAAAAAAABZ54EAo72BAACA8AIAnQEqCAAIA' |
| 406 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAA' | 391 'ABHCIWFiIWEiAICAnWqA/gD+gINTRgA/v0hRf/kb+PnRv/I4//8WE8DijI//FRAo5WBACgAs' |
| 407 'EEq17GDD0JATYCLTGF2ZjUzLjIxLjFXQYtMYXZmNTMuMjEuMXOkkJatuHwTJ7cvFLSzB' | 392 'QEAARAQABgAGFgv9AAIAAAcU7trAQAAAAAAAA67jLOBALeH94EB8YIBfw=='; |
| 408 'Smxbp5EiYhAVAAAAAAAABZUrmsBAAAAAAAAR64BAAAAAAAAPteBAXPFgQGcgQAitZyDd' | |
| 409 'W5khoVWX1ZQOIOBASPjg4QCYloA4AEAAAAAAAASsIEIuoEIVLCBCFS6gQhUsoEDH0O2d' | |
| 410 'QEAAAAAAABZ54EAo72BAACA8AIAnQEqCAAIAABHCIWFiIWEiAICAnWqA/gD+gINTRgA/' | |
| 411 'v0hRf/kb+PnRv/I4//8WE8DijI//FRAo5WBACgAsQEAARAQABgAGFgv9AAIAAAcU7trA' | |
| 412 'QAAAAAAAA67jLOBALeH94EB8YIBfw=='; | |
| 413 group('drawImage_video_element', () { | |
| 414 setUp(setupFunc); | |
| 415 tearDown(tearDownFunc); | |
| 416 | 393 |
| 417 test('with 3 params', () { | 394 // test('drawImage from video element with 3 params', () { |
| 418 video.onCanPlay.listen(expectAsync1((_) { | 395 // var video = new VideoElement(); |
| 419 context.drawImage(video, 50, 50); | 396 // |
| 397 // video.onLoadedData.listen(expectAsync1((_) { |
| 398 // context.drawImage(video, 50, 50); |
| 399 // |
| 400 // expectPixelFilled(50, 50); |
| 401 // expectPixelFilled(54, 54); |
| 402 // expectPixelFilled(57, 57); |
| 403 // expectPixelUnfilled(58, 58); |
| 404 // expectPixelUnfilled(0, 0); |
| 405 // expectPixelUnfilled(70, 70); |
| 406 // })); |
| 407 // video.onError.listen((_) { |
| 408 // guardAsync(() { |
| 409 // fail('URL failed to load.'); |
| 410 // }); |
| 411 // }); |
| 412 // |
| 413 // if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { |
| 414 // video.src = webmVideoUrl; |
| 415 // } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"'
, |
| 416 // null) != '') { |
| 417 // video.src = mp4VideoUrl; |
| 418 // } else { |
| 419 // logMessage('Video is not supported on this system.'); |
| 420 // } |
| 421 // }); |
| 422 // |
| 423 // test('drawImage from video element with 5 params', () { |
| 424 // var video = new VideoElement(); |
| 425 // |
| 426 // video.onLoadedData.listen(expectAsync1((_) { |
| 427 // context.drawImageToRect(video, new Rect(50, 50, 20, 20)); |
| 428 // |
| 429 // expectPixelFilled(50, 50); |
| 430 // expectPixelFilled(55, 55); |
| 431 // expectPixelFilled(59, 59); |
| 432 // expectPixelFilled(60, 60); |
| 433 // expectPixelFilled(69, 69); |
| 434 // expectPixelUnfilled(70, 70); |
| 435 // expectPixelUnfilled(0, 0); |
| 436 // expectPixelUnfilled(80, 80); |
| 437 // })); |
| 438 // video.onError.listen((_) { |
| 439 // guardAsync(() { |
| 440 // fail('URL failed to load.'); |
| 441 // }); |
| 442 // }); |
| 443 // |
| 444 // if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { |
| 445 // video.src = webmVideoUrl; |
| 446 // } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"'
, |
| 447 // null) != '') { |
| 448 // video.src = mp4VideoUrl; |
| 449 // } else { |
| 450 // // TODO(amouravski): Better fallback? |
| 451 // logMessage('Video is not supported on this system.'); |
| 452 // } |
| 453 // }); |
| 454 // |
| 455 // test('drawImage from video element with 9 params', () { |
| 456 // var video = new VideoElement(); |
| 457 // |
| 458 // video.onLoadedData.listen(expectAsync1((_) { |
| 459 // context.drawImageToRect(video, new Rect(50, 50, 20, 20), |
| 460 // sourceRect: new Rect(2, 2, 6, 6)); |
| 461 // |
| 462 // expectPixelFilled(50, 50); |
| 463 // expectPixelFilled(55, 55); |
| 464 // expectPixelFilled(59, 59); |
| 465 // expectPixelFilled(60, 60); |
| 466 // expectPixelFilled(69, 69); |
| 467 // expectPixelUnfilled(70, 70); |
| 468 // expectPixelUnfilled(0, 0); |
| 469 // expectPixelUnfilled(80, 80); |
| 470 // })); |
| 471 // video.onError.listen((_) { |
| 472 // guardAsync(() { |
| 473 // fail('URL failed to load.'); |
| 474 // }); |
| 475 // }); |
| 476 // |
| 477 // if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { |
| 478 // video.src = webmVideoUrl; |
| 479 // } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"'
, |
| 480 // null) != '') { |
| 481 // video.src = mp4VideoUrl; |
| 482 // } else { |
| 483 // // TODO(amouravski): Better fallback? |
| 484 // logMessage('Video is not supported on this system.'); |
| 485 // } |
| 486 // }); |
| 420 | 487 |
| 421 expectPixelFilled(50, 50); | 488 test('drawImage from canvas element with 3 params', () { |
| 422 expectPixelFilled(54, 54); | |
| 423 expectPixelFilled(57, 57); | |
| 424 expectPixelUnfilled(58, 58); | |
| 425 expectPixelUnfilled(0, 0); | |
| 426 expectPixelUnfilled(70, 70); | |
| 427 })); | |
| 428 | |
| 429 video.onError.listen((_) { | |
| 430 guardAsync(() { | |
| 431 fail('URL failed to load.'); | |
| 432 }); | |
| 433 }); | |
| 434 | |
| 435 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
| 436 video.src = webmVideoUrl; | |
| 437 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', | |
| 438 null) != '') { | |
| 439 video.src = mp4VideoUrl; | |
| 440 } else { | |
| 441 window.console.log('Video is not supported on this system.'); | |
| 442 } | |
| 443 }); | |
| 444 | |
| 445 test('with 5 params', () { | |
| 446 video.onCanPlay.listen(expectAsync1((_) { | |
| 447 context.drawImageToRect(video, new Rect(50, 50, 20, 20)); | |
| 448 | |
| 449 expectPixelFilled(50, 50); | |
| 450 expectPixelFilled(55, 55); | |
| 451 expectPixelFilled(59, 59); | |
| 452 expectPixelFilled(60, 60); | |
| 453 expectPixelFilled(69, 69); | |
| 454 expectPixelUnfilled(70, 70); | |
| 455 expectPixelUnfilled(0, 0); | |
| 456 expectPixelUnfilled(80, 80); | |
| 457 })); | |
| 458 video.onError.listen((_) { | |
| 459 guardAsync(() { | |
| 460 fail('URL failed to load.'); | |
| 461 }); | |
| 462 }); | |
| 463 | |
| 464 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
| 465 video.src = webmVideoUrl; | |
| 466 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', | |
| 467 null) != '') { | |
| 468 video.src = mp4VideoUrl; | |
| 469 } else { | |
| 470 // TODO(amouravski): Better fallback? | |
| 471 window.console.log('Video is not supported on this system.'); | |
| 472 } | |
| 473 }); | |
| 474 | |
| 475 test('with 9 params', () { | |
| 476 video.onCanPlay.listen(expectAsync1((_) { | |
| 477 context.drawImageToRect(video, new Rect(50, 50, 20, 20), | |
| 478 sourceRect: new Rect(2, 2, 6, 6)); | |
| 479 | |
| 480 expectPixelFilled(50, 50); | |
| 481 expectPixelFilled(55, 55); | |
| 482 expectPixelFilled(59, 59); | |
| 483 expectPixelFilled(60, 60); | |
| 484 expectPixelFilled(69, 69); | |
| 485 expectPixelUnfilled(70, 70); | |
| 486 expectPixelUnfilled(0, 0); | |
| 487 expectPixelUnfilled(80, 80); | |
| 488 })); | |
| 489 video.onError.listen((_) { | |
| 490 guardAsync(() { | |
| 491 fail('URL failed to load.'); | |
| 492 }); | |
| 493 }); | |
| 494 | |
| 495 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
| 496 video.src = webmVideoUrl; | |
| 497 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', | |
| 498 null) != '') { | |
| 499 video.src = mp4VideoUrl; | |
| 500 } else { | |
| 501 // TODO(amouravski): Better fallback? | |
| 502 window.console.log('Video is not supported on this system.'); | |
| 503 } | |
| 504 }); | |
| 505 }); | |
| 506 | |
| 507 group('drawImage_video_element_dataUrl', () { | |
| 508 setUp(setupFunc); | |
| 509 tearDown(tearDownFunc); | |
| 510 | |
| 511 test('with 9 params', () { | |
| 512 video = new VideoElement(); | |
| 513 canvas = new CanvasElement(); | |
| 514 video.onCanPlay.listen(expectAsync1((_) { | |
| 515 context.drawImageToRect(video, new Rect(50, 50, 20, 20), | |
| 516 sourceRect: new Rect(2, 2, 6, 6)); | |
| 517 | |
| 518 expectPixelFilled(50, 50); | |
| 519 expectPixelFilled(55, 55); | |
| 520 expectPixelFilled(59, 59); | |
| 521 expectPixelFilled(60, 60); | |
| 522 expectPixelFilled(69, 69); | |
| 523 expectPixelUnfilled(70, 70); | |
| 524 expectPixelUnfilled(0, 0); | |
| 525 expectPixelUnfilled(80, 80); | |
| 526 })); | |
| 527 video.onError.listen((_) { | |
| 528 guardAsync(() { | |
| 529 fail('URL failed to load.'); | |
| 530 }); | |
| 531 }); | |
| 532 | |
| 533 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
| 534 video.src = webmVideoDataUrl; | |
| 535 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', | |
| 536 null) != '') { | |
| 537 video.src = mp4VideoDataUrl; | |
| 538 } else { | |
| 539 // TODO(amouravski): Better fallback? | |
| 540 window.console.log('Video is not supported on this system.'); | |
| 541 } | |
| 542 }); | |
| 543 }); | |
| 544 | |
| 545 group('drawImage_canvas_element', () { | |
| 546 setUp(setupFunc); | |
| 547 tearDown(tearDownFunc); | |
| 548 | |
| 549 test('with 3 params', () { | |
| 550 // Draw an image to the canvas from a canvas element. | 489 // Draw an image to the canvas from a canvas element. |
| 551 context.drawImage(otherCanvas, 50, 50); | 490 context.drawImage(otherCanvas, 50, 50); |
| 552 | 491 |
| 553 expectPixelFilled(50, 50); | 492 expectPixelFilled(50, 50); |
| 554 expectPixelFilled(55, 55); | 493 expectPixelFilled(55, 55); |
| 555 expectPixelFilled(59, 59); | 494 expectPixelFilled(59, 59); |
| 556 expectPixelUnfilled(60, 60); | 495 expectPixelUnfilled(60, 60); |
| 557 expectPixelUnfilled(0, 0); | 496 expectPixelUnfilled(0, 0); |
| 558 expectPixelUnfilled(70, 70); | 497 expectPixelUnfilled(70, 70); |
| 559 }); | 498 }); |
| 560 test('with 5 params', () { | 499 test('drawImage from canvas element with 5 params', () { |
| 561 // Draw an image to the canvas from a canvas element. | 500 // Draw an image to the canvas from a canvas element. |
| 562 context.drawImageToRect(otherCanvas, new Rect(50, 50, 20, 20)); | 501 context.drawImageToRect(otherCanvas, new Rect(50, 50, 20, 20)); |
| 563 | 502 |
| 564 expectPixelFilled(50, 50); | 503 expectPixelFilled(50, 50); |
| 565 expectPixelFilled(55, 55); | 504 expectPixelFilled(55, 55); |
| 566 expectPixelFilled(59, 59); | 505 expectPixelFilled(59, 59); |
| 567 expectPixelFilled(60, 60); | 506 expectPixelFilled(60, 60); |
| 568 expectPixelFilled(69, 69); | 507 expectPixelFilled(69, 69); |
| 569 expectPixelUnfilled(70, 70); | 508 expectPixelUnfilled(70, 70); |
| 570 expectPixelUnfilled(0, 0); | 509 expectPixelUnfilled(0, 0); |
| 571 expectPixelUnfilled(80, 80); | 510 expectPixelUnfilled(80, 80); |
| 572 }); | 511 }); |
| 573 test('with 9 params', () { | 512 test('drawImage from canvas element with 9 params', () { |
| 574 // Draw an image to the canvas from a canvas element. | 513 // Draw an image to the canvas from a canvas element. |
| 575 otherContext.fillStyle = "blue"; | 514 otherContext.fillStyle = "blue"; |
| 576 otherContext.fillRect(5, 5, 5, 5); | 515 otherContext.fillRect(5, 5, 5, 5); |
| 577 context.drawImageToRect(otherCanvas, new Rect(50, 50, 20, 20), | 516 context.drawImageToRect(otherCanvas, new Rect(50, 50, 20, 20), |
| 578 sourceRect: new Rect(2, 2, 6, 6)); | 517 sourceRect: new Rect(2, 2, 6, 6)); |
| 579 | 518 |
| 580 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); | 519 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); |
| 581 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); | 520 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); |
| 582 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); | 521 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); |
| 583 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); | 522 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); |
| 584 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); | 523 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); |
| 585 expectPixelFilled(50, 50); | 524 expectPixelFilled(50, 50); |
| 586 expectPixelFilled(55, 55); | 525 expectPixelFilled(55, 55); |
| 587 expectPixelFilled(59, 59); | 526 expectPixelFilled(59, 59); |
| 588 expectPixelFilled(60, 60); | 527 expectPixelFilled(60, 60); |
| 589 expectPixelFilled(69, 69); | 528 expectPixelFilled(69, 69); |
| 590 expectPixelUnfilled(70, 70); | 529 expectPixelUnfilled(70, 70); |
| 591 expectPixelUnfilled(0, 0); | 530 expectPixelUnfilled(0, 0); |
| 592 expectPixelUnfilled(80, 80); | 531 expectPixelUnfilled(80, 80); |
| 593 }); | 532 }); |
| 594 }); | 533 }); |
| 595 } | 534 } |
| OLD | NEW |