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 url_test; | 5 library canvas_rendering_context_2d_test; |
6 import '../../pkg/unittest/lib/unittest.dart'; | 6 import '../../pkg/unittest/lib/unittest.dart'; |
7 import '../../pkg/unittest/lib/html_config.dart'; | 7 import '../../pkg/unittest/lib/html_config.dart'; |
8 import 'dart:html'; | 8 import 'dart:html'; |
9 import 'dart:math'; | 9 import 'dart:math'; |
10 | 10 |
11 // Some rounding errors in the browsers. | 11 // Some rounding errors in the browsers. |
12 checkPixel(List<int> pixel, List<int> expected) { | 12 checkPixel(List<int> pixel, List<int> expected) { |
13 expect(pixel[0], closeTo(expected[0], 2)); | 13 expect(pixel[0], closeTo(expected[0], 2)); |
14 expect(pixel[1], closeTo(expected[1], 2)); | 14 expect(pixel[1], closeTo(expected[1], 2)); |
15 expect(pixel[2], closeTo(expected[2], 2)); | 15 expect(pixel[2], closeTo(expected[2], 2)); |
16 expect(pixel[3], closeTo(expected[3], 2)); | 16 expect(pixel[3], closeTo(expected[3], 2)); |
17 } | 17 } |
18 | 18 |
19 main() { | 19 main() { |
20 useHtmlConfiguration(); | 20 useHtmlConfiguration(); |
21 | 21 |
22 group('canvasRenderingContext2d', () { | 22 group('canvasRenderingContext2d', () { |
23 var canvas; | 23 var canvas; |
24 var context; | 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 } | |
25 | 36 |
26 setUp(() { | 37 setUp(() { |
27 canvas = new CanvasElement(); | 38 canvas = new CanvasElement(); |
28 canvas.width = 100; | 39 canvas.width = 100; |
29 canvas.height = 100; | 40 canvas.height = 100; |
30 | 41 |
31 context = canvas.context2d; | 42 context = canvas.context2d; |
43 | |
44 createOtherCanvas(); | |
32 }); | 45 }); |
33 | 46 |
34 tearDown(() { | 47 tearDown(() { |
35 canvas = null; | 48 canvas = null; |
36 context = null; | 49 context = null; |
50 otherCanvas = null; | |
51 otherContext = null; | |
37 }); | 52 }); |
38 | 53 |
39 List<int> readPixel(int x, int y) { | 54 List<int> readPixel(int x, int y) { |
40 var imageData = context.getImageData(x, y, 1, 1); | 55 var imageData = context.getImageData(x, y, 1, 1); |
41 return imageData.data; | 56 return imageData.data; |
42 } | 57 } |
43 | 58 |
44 /// Returns true if the pixel has some data in it, false otherwise. | 59 /// Returns true if the pixel has some data in it, false otherwise. |
45 bool isPixelFilled(int x, int y) => readPixel(x,y).any((p) => p != 0); | 60 bool isPixelFilled(int x, int y) => readPixel(x,y).any((p) => p != 0); |
46 | 61 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
230 | 245 |
231 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 246 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. |
232 expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true); | 247 expectPixelFilled((cx - r/SQRT2).toInt(), (cy + r/SQRT2).toInt(), true); |
233 | 248 |
234 // (cx + r/SQRT2, cy + r/SQRT2) should be filled. | 249 // (cx + r/SQRT2, cy + r/SQRT2) should be filled. |
235 expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); | 250 expectPixelFilled((cx - r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); |
236 | 251 |
237 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. | 252 // (cx - r/SQRT2, cy - r/SQRT2) should be filled. |
238 expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); | 253 expectPixelFilled((cx + r/SQRT2).toInt(), (cy - r/SQRT2).toInt(), true); |
239 }); | 254 }); |
255 | |
256 // Draw an image to the canvas from an image element. | |
257 test('drawImage from img element with 3 params', () { | |
258 var dataUrl = otherCanvas.toDataUrl('image/gif'); | |
259 var img = new ImageElement(); | |
260 | |
261 img.onLoad.listen(expectAsync1((_) { | |
262 context.drawImage(img, 50, 50); | |
263 | |
264 expectPixelFilled(50, 50); | |
265 expectPixelFilled(55, 55); | |
266 expectPixelFilled(59, 59); | |
267 expectPixelUnfilled(60, 60); | |
268 expectPixelUnfilled(0, 0); | |
269 expectPixelUnfilled(70, 70); | |
270 })); | |
271 img.onError.listen((_) { | |
272 guardAsync(() { | |
273 fail('URL failed to load.'); | |
274 }); | |
275 }); | |
276 img.src = dataUrl; | |
277 }); | |
278 | |
279 // Draw an image to the canvas from an image element and scale it. | |
280 test('drawImage from img element with 5 params', () { | |
281 var dataUrl = otherCanvas.toDataUrl('image/gif'); | |
282 var img = new ImageElement(); | |
283 | |
284 img.onLoad.listen(expectAsync1((_) { | |
285 context.drawImageAndScale(img, 50, 50, 20, 20); | |
286 | |
287 expectPixelFilled(50, 50); | |
288 expectPixelFilled(55, 55); | |
289 expectPixelFilled(59, 59); | |
290 expectPixelFilled(60, 60); | |
291 expectPixelFilled(69, 69); | |
292 expectPixelUnfilled(70, 70); | |
293 expectPixelUnfilled(0, 0); | |
294 expectPixelUnfilled(80, 80); | |
295 })); | |
296 img.onError.listen((_) { | |
297 guardAsync(() { | |
298 fail('URL failed to load.'); | |
299 }); | |
300 }); | |
301 img.src = dataUrl; | |
302 }); | |
303 | |
304 // Draw an image to the canvas from an image element and scale it. | |
305 test('drawImage from img element with 9 params', () { | |
306 otherContext.fillStyle = "blue"; | |
307 otherContext.fillRect(5, 5, 5, 5); | |
308 var dataUrl = otherCanvas.toDataUrl('image/gif'); | |
309 var img = new ImageElement(); | |
310 | |
311 img.onLoad.listen(expectAsync1((_) { | |
312 // This will take a 6x6 square from the first canvas from position 2,2 | |
313 // and then scale it to a 20x20 square and place it to the second canvas | |
314 // at 50,50. | |
315 context.drawImageAndTransform(img, 2, 2, 6, 6, 50, 50, 20, 20); | |
316 | |
317 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); | |
318 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); | |
319 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); | |
320 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); | |
321 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); | |
322 | |
323 expectPixelFilled(50, 50); | |
324 expectPixelFilled(55, 55); | |
325 expectPixelFilled(59, 59); | |
326 expectPixelFilled(60, 60); | |
327 expectPixelFilled(69, 69); | |
328 expectPixelUnfilled(70, 70); | |
329 expectPixelUnfilled(0, 0); | |
330 expectPixelUnfilled(80, 80); | |
331 })); | |
332 img.onError.listen((_) { | |
333 guardAsync(() { | |
334 fail('URL failed to load.'); | |
335 }); | |
336 }); | |
337 img.src = dataUrl; | |
338 }); | |
339 | |
340 // Represents 2 frames of 8x8 red pixels. | |
341 // Created with: | |
342 // convert -size 8x8 xc:red blank1.jpg | |
343 // convert -size 8x8 xc:red blank2.jpg | |
344 // avconv -f image2 -i "blank%d.jpg" -c:v libx264 small.mp4 | |
345 // python -m base64 -e small.mp4 | |
346 // avconv -i small.mp4 small.webm | |
347 // python -m base64 -e small.webm | |
348 var mp4VideoUrl = | |
blois
2013/03/14 16:24:10
What is the video and where did it come from? (jus
Andrei Mouravski
2013/03/15 00:08:52
I have the instructions of how to make the video y
| |
349 'data:video/mp4;base64,AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZn' | |
350 'JlZQAAAsdtZGF0AAACmwYF//+X3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDEyMCByMj' | |
351 'E1MSBhM2Y0NDA3IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMj' | |
352 'AxMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYm' | |
353 'FjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibW' | |
354 'U9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm' | |
355 '9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3' | |
356 'Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTE4IHNsaWNlZF90aHJlYWRzPT' | |
357 'AgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYW' | |
358 'luZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTAgYl9hZGFwdD0xIGJfYmlhcz0wIG' | |
359 'RpcmVjdD0xIHdlaWdodGI9MCBvcGVuX2dvcD0xIHdlaWdodHA9MiBrZXlpbnQ9MjUwIGtleW' | |
360 'ludF9taW49MjUgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD00MC' | |
361 'ByYz1jcmYgbWJ0cmVlPTEgY3JmPTUxLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IH' | |
362 'Fwc3RlcD00IGlwX3JhdGlvPTEuMjUgYXE9MToxLjAwAIAAAAARZYiEB//3aoK5/tP9+8yeuI' | |
363 'EAAAAHQZoi2P/wgAAAAzxtb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAAUAABAAABAA' | |
364 'AAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAA' | |
365 'AAAAAAAAAAAAAAAAAAAAAAAAACAAAAGGlvZHMAAAAAEICAgAcAT/////7/AAACUHRyYWsAAA' | |
366 'BcdGtoZAAAAA8AAAAAAAAAAAAAAAEAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAA' | |
367 'AAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAACAAAAAgAAAAAACRlZHRzAAAAHGVsc3QAAA' | |
368 'AAAAAAAQAAAFAAAAABAAEAAAAAAchtZGlhAAAAIG1kaGQAAAAAAAAAAAAAAAAAAAAZAAAAAl' | |
369 'XEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZpZGVvSGFuZGxlcgAAAAFzbW' | |
370 'luZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAAAAAAAAABAAAADHVybC' | |
371 'AAAAABAAABM3N0YmwAAACXc3RzZAAAAAAAAAABAAAAh2F2YzEAAAAAAAAAAQAAAAAAAAAAAA' | |
372 'AAAAAAAAAACAAIAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | |
373 'AAAAAY//8AAAAxYXZjQwFNQAr/4QAYZ01ACuiPyy4C2QAAAwABAAADADIPEiUSAQAGaOvAZS' | |
374 'yAAAAAGHN0dHMAAAAAAAAAAQAAAAIAAAABAAAAFHN0c3MAAAAAAAAAAQAAAAEAAAAYY3R0cw' | |
375 'AAAAAAAAABAAAAAgAAAAEAAAAcc3RzYwAAAAAAAAABAAAAAQAAAAEAAAABAAAAHHN0c3oAAA' | |
376 'AAAAAAAAAAAAIAAAK0AAAACwAAABhzdGNvAAAAAAAAAAIAAAAwAAAC5AAAAGB1ZHRhAAAAWG' | |
377 '1ldGEAAAAAAAAAIWhkbHIAAAAAAAAAAG1kaXJhcHBsAAAAAAAAAAAAAAAAK2lsc3QAAAAjqX' | |
378 'RvbwAAABtkYXRhAAAAAQAAAABMYXZmNTMuMjEuMQ=='; | |
379 var webmVideoUrl = | |
380 'data:video/webm;base64,GkXfowEAAAAAAAAfQoaBAUL3gQFC8oEEQvOBCEKChHdlYm1Ch' | |
381 '4ECQoWBAhhTgGcBAAAAAAAB/hFNm3RALE27i1OrhBVJqWZTrIHfTbuMU6uEFlSua1OsggEsT' | |
382 'buMU6uEHFO7a1OsggHk7AEAAAAAAACkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | |
383 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | |
384 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' | |
385 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVSalmAQAAAAAAAEEq17GDD0JATYCLTGF2ZjUzL' | |
386 'jIxLjFXQYtMYXZmNTMuMjEuMXOkkJatuHwTJ7cvFLSzBSmxbp5EiYhAVAAAAAAAABZUrmsBA' | |
387 'AAAAAAAR64BAAAAAAAAPteBAXPFgQGcgQAitZyDdW5khoVWX1ZQOIOBASPjg4QCYloA4AEAA' | |
388 'AAAAAASsIEIuoEIVLCBCFS6gQhUsoEDH0O2dQEAAAAAAABZ54EAo72BAACA8AIAnQEqCAAIA' | |
389 'ABHCIWFiIWEiAICAnWqA/gD+gINTRgA/v0hRf/kb+PnRv/I4//8WE8DijI//FRAo5WBACgAs' | |
390 'QEAARAQABgAGFgv9AAIAAAcU7trAQAAAAAAAA67jLOBALeH94EB8YIBfw=='; | |
391 | |
392 test('drawImage from video element with 3 params', () { | |
393 var video = new VideoElement(); | |
394 | |
395 video.onLoadedData.listen(expectAsync1((_) { | |
396 context.drawImage(video, 50, 50); | |
397 | |
398 expectPixelFilled(50, 50); | |
399 expectPixelFilled(54, 54); | |
400 expectPixelFilled(57, 57); | |
401 expectPixelUnfilled(58, 58); | |
402 expectPixelUnfilled(0, 0); | |
403 expectPixelUnfilled(70, 70); | |
404 })); | |
405 video.onError.listen((_) { | |
406 guardAsync(() { | |
407 fail('URL failed to load.'); | |
408 }); | |
409 }); | |
410 | |
411 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
412 video.src = webmVideoUrl; | |
413 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', '') != '') { | |
blois
2013/03/14 16:24:10
line length
Andrei Mouravski
2013/03/15 00:08:52
Done.
| |
414 video.src = mp4VideoUrl; | |
415 } else { | |
416 // TODO(amouravski): Better fallback? | |
417 fail('Video is not supported on this system.'); | |
blois
2013/03/14 16:24:10
Don't fail the test! Just skip it.
Andrei Mouravski
2013/03/15 00:08:52
Done.
| |
418 } | |
419 }); | |
420 | |
421 test('drawImage from video element with 5 params', () { | |
422 var video = new VideoElement(); | |
423 | |
424 video.onLoadedData.listen(expectAsync1((_) { | |
425 context.drawImageAndScale(video, 50, 50, 20, 20); | |
426 | |
427 expectPixelFilled(50, 50); | |
428 expectPixelFilled(55, 55); | |
429 expectPixelFilled(59, 59); | |
430 expectPixelFilled(60, 60); | |
431 expectPixelFilled(69, 69); | |
432 expectPixelUnfilled(70, 70); | |
433 expectPixelUnfilled(0, 0); | |
434 expectPixelUnfilled(80, 80); | |
435 })); | |
436 video.onError.listen((_) { | |
437 guardAsync(() { | |
438 fail('URL failed to load.'); | |
439 }); | |
440 }); | |
441 | |
442 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
443 video.src = webmVideoUrl; | |
444 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', '') != '') { | |
blois
2013/03/14 16:24:10
length
Andrei Mouravski
2013/03/15 00:08:52
Done.
| |
445 video.src = mp4VideoUrl; | |
446 } else { | |
447 // TODO(amouravski): Better fallback? | |
448 fail('Video is not supported on this system.'); | |
449 } | |
450 }); | |
451 | |
452 test('drawImage from video element with 9 params', () { | |
453 var video = new VideoElement(); | |
454 | |
455 video.onLoadedData.listen(expectAsync1((_) { | |
456 context.drawImageAndTransform(video, 2, 2, 6, 6, 50, 50, 20, 20); | |
457 | |
458 expectPixelFilled(50, 50); | |
459 expectPixelFilled(55, 55); | |
460 expectPixelFilled(59, 59); | |
461 expectPixelFilled(60, 60); | |
462 expectPixelFilled(69, 69); | |
463 expectPixelUnfilled(70, 70); | |
464 expectPixelUnfilled(0, 0); | |
465 expectPixelUnfilled(80, 80); | |
466 })); | |
467 video.onError.listen((_) { | |
468 guardAsync(() { | |
469 fail('URL failed to load.'); | |
470 }); | |
471 }); | |
472 | |
473 if(video.canPlayType('video/webm; codecs="vp8.0, vorbis"', '') != '') { | |
474 video.src = webmVideoUrl; | |
475 } else if(video.canPlayType('video/mp4; codecs="avc1.4D401E, mp4a.40.2"', '') != '') { | |
blois
2013/03/14 16:24:10
length
Andrei Mouravski
2013/03/15 00:08:52
Done.
| |
476 video.src = mp4VideoUrl; | |
477 } else { | |
478 // TODO(amouravski): Better fallback? | |
479 fail('Video is not supported on this system.'); | |
480 } | |
481 }); | |
482 | |
483 test('drawImage from canvas element with 3 params', () { | |
484 // Draw an image to the canvas from a canvas element. | |
485 context.drawImage(otherCanvas, 50, 50); | |
486 | |
487 expectPixelFilled(50, 50); | |
488 expectPixelFilled(55, 55); | |
489 expectPixelFilled(59, 59); | |
490 expectPixelUnfilled(60, 60); | |
491 expectPixelUnfilled(0, 0); | |
492 expectPixelUnfilled(70, 70); | |
493 }); | |
494 test('drawImage from canvas element with 5 params', () { | |
495 // Draw an image to the canvas from a canvas element. | |
496 context.drawImageAndScale(otherCanvas, 50, 50, 20, 20); | |
497 | |
498 expectPixelFilled(50, 50); | |
499 expectPixelFilled(55, 55); | |
500 expectPixelFilled(59, 59); | |
501 expectPixelFilled(60, 60); | |
502 expectPixelFilled(69, 69); | |
503 expectPixelUnfilled(70, 70); | |
504 expectPixelUnfilled(0, 0); | |
505 expectPixelUnfilled(80, 80); | |
506 }); | |
507 test('drawImage from canvas element with 9 params', () { | |
508 // Draw an image to the canvas from a canvas element. | |
509 otherContext.fillStyle = "blue"; | |
510 otherContext.fillRect(5, 5, 5, 5); | |
511 context.drawImageAndTransform(otherCanvas, 2, 2, 6, 6, 50, 50, 20, 20); | |
512 | |
513 checkPixel(readPixel(50, 50), [255, 0, 0, 255]); | |
514 checkPixel(readPixel(55, 55), [255, 0, 0, 255]); | |
515 checkPixel(readPixel(60, 50), [255, 0, 0, 255]); | |
516 checkPixel(readPixel(65, 65), [0, 0, 255, 255]); | |
517 checkPixel(readPixel(69, 69), [0, 0, 255, 255]); | |
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 }); | |
240 }); | 527 }); |
241 } | 528 } |
OLD | NEW |