chromium/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-display-p3-pattern-canvas.html

<!DOCTYPE HTML>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="canvas-display-p3.js"></script>
<script>
// Test that patterns created from canvas sources with different color spaces
// can be drawn into sRGB and Display P3 canvases, by reading pixels with
// getImageData() as sRGB and Display P3 values.
function runTest(sourceColorSpace, destinationColorSpace, colors) {
    for (let [sourceColorString, expectedColor] of Object.entries(colors)) {
        test(function() {
            let source = document.createElement("canvas");
            source.width = 2;
            source.height = 2;

            let sourceContext = source.getContext("2d", { colorSpace: sourceColorSpace });

            let sourceColor = sourceColorString.split(",").map(x => +x);

            let sourceImageData = new ImageData(2, 2, { colorSpace: sourceColorSpace });
            for (let i = 0; i < 2 * 2 * 4; i += 4) {
                for (let c = 0; c < 4; ++c)
                    sourceImageData.data[i + c] = sourceColor[c];
            }
            sourceContext.putImageData(sourceImageData, 0, 0);

            let destination = document.createElement("canvas");
            destination.width = 4;
            destination.height = 4;

            let destinationContext = destination.getContext("2d", { colorSpace: destinationColorSpace });
            destinationContext.fillStyle = destinationContext.createPattern(source, "repeat");
            destinationContext.fillRect(0, 0, 4, 4);

            let destinationImageData = destinationContext.getImageData(2, 2, 1, 1);

            assert_true(pixelsApproximatelyEqual(destinationImageData.data, expectedColor), `Actual pixel value ${[...destinationImageData.data]} is approximately equal to ${expectedColor}.`);
        }, `Source ${sourceColorSpace}, destination ${destinationColorSpace}, color ${sourceColorString}`);
    }
}

runTest("srgb", "display-p3", fromSRGBToDisplayP3);
runTest("display-p3", "srgb", fromDisplayP3ToSRGB);
</script>