blob: f990ebcb7272e8300ff462775d88d37972679388 [file] [edit]
// META: script=/webcodecs/videoFrame-alpha-discard-utils.js
async function makeTransparentImage() {
const canvas = document.createElement('canvas');
canvas.width = 32;
canvas.height = 32;
canvas.getContext('2d').drawImage(makeTransparentCanvas(), 0, 0);
const image = new Image();
image.src = canvas.toDataURL('image/png');
await image.decode();
return image;
}
function makeTransparentHTMLCanvas() {
const canvas = document.createElement('canvas');
canvas.width = 32;
canvas.height = 32;
canvas.getContext('2d').drawImage(makeTransparentCanvas(), 0, 0);
return canvas;
}
const kWindowSources = {
'HTMLImageElement': makeTransparentImage,
'HTMLCanvasElement': makeTransparentHTMLCanvas,
};
for (const [name, makeSource] of Object.entries(kWindowSources)) {
async function makeDiscardedFrame(t) {
const source = await makeSource();
const frame = new VideoFrame(source, {alpha: 'discard', timestamp: 0});
t.add_cleanup(() => frame.close());
return frame;
}
promise_test(async t => {
const frame = await makeDiscardedFrame(t);
assert_in_array(frame.format, ['RGBX', 'BGRX'], 'format');
verifyOpaquePicture(drawToNewCanvas(frame), 'new canvas');
}, `Drawing a VideoFrame made from an ${name} with alpha discard gives opaque pixels`);
promise_test(async t => {
const frame = await makeDiscardedFrame(t);
verifyOpaquePicture(drawToNewCanvas(frame, 'white'), 'white background');
}, `Drawing a VideoFrame made from an ${name} with alpha discard replaces the canvas background`);
promise_test(async t => {
const frame = await makeDiscardedFrame(t);
const clone = frame.clone();
t.add_cleanup(() => clone.close());
verifyOpaquePicture(drawToNewCanvas(clone), 'clone');
}, `Drawing a clone of a VideoFrame made from an ${name} with alpha discard gives opaque pixels`);
// Control: with alpha keep, the transparent quadrant stays transparent.
promise_test(async t => {
const source = await makeSource();
const frame = new VideoFrame(source, {alpha: 'keep', timestamp: 0});
t.add_cleanup(() => frame.close());
assert_array_equals(getPixel(drawToNewCanvas(frame, 'white'), 24, 24), [255, 255, 255, 255], 'white background shows through');
}, `Drawing a VideoFrame made from an ${name} with alpha keep preserves its transparency`);
}