videoFrame-alpha.any.js (1577B)
1 // META: global=window,dedicatedworker 2 3 function makeRGBACanvas() { 4 let canvas = new OffscreenCanvas(32, 32, {alpha: true}); 5 let ctx = canvas.getContext('2d'); 6 7 // Opaque red quadrant. 8 ctx.fillStyle = 'rgba(255, 0, 0, 255)'; 9 ctx.fillRect(0, 0, 16, 16); 10 11 // Opaque blue quadrant. 12 ctx.fillStyle = 'rgba(0, 255, 0, 255)'; 13 ctx.fillRect(16, 0, 16, 16); 14 15 // Opaque green quadrant. 16 ctx.fillStyle = 'rgba(0, 0, 255, 255)'; 17 ctx.fillRect(0, 16, 16, 16); 18 19 // Remaining quadrant should be transparent black. 20 return canvas; 21 } 22 23 function getPixel(ctx, x, y) { 24 let data = ctx.getImageData(x, y, 1, 1).data; 25 return data[0] * 2 ** 24 + data[1] * 2 ** 16 + data[2] * 2 ** 8 + data[3]; 26 } 27 28 function verifyPicture(picture) { 29 let canvas = new OffscreenCanvas(32, 32, {alpha: true}); 30 let ctx = canvas.getContext('2d'); 31 ctx.drawImage(picture, 0, 0); 32 assert_equals(getPixel(ctx, 8, 8), 0xFF0000FF); 33 assert_equals(getPixel(ctx, 24, 8), 0x00FF00FF); 34 assert_equals(getPixel(ctx, 8, 24), 0x0000FFFF); 35 assert_equals(getPixel(ctx, 24, 24), 0x00000000); 36 } 37 38 promise_test(async () => { 39 let src = makeRGBACanvas(); 40 let frame = new VideoFrame(src, {alpha: 'keep', timestamp: 0}); 41 verifyPicture(frame); 42 verifyPicture(await createImageBitmap(frame)); 43 }, 'OffscreenCanvas source preserves alpha'); 44 45 promise_test(async () => { 46 let src = makeRGBACanvas().transferToImageBitmap(); 47 let frame = new VideoFrame(src, {alpha: 'keep', timestamp: 0}); 48 verifyPicture(frame); 49 verifyPicture(await createImageBitmap(frame)); 50 }, 'ImageBitmap source preserves alpha');