summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/canvas/element/manual/imagebitmap/createImageBitmap-exif-orientation.html
blob: 8b2a33e85b1ff0b2b167483c04d10d9e9288317a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
<!DOCTYPE html>
<title>Test that createImageBitmap honors EXIF orientation</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>canvas { outline: 1px solid black; margin-right: 1em; }</style>
<body>
<script>
function loadImage(src) {
    return new Promise(function(resolve) {
        const image = new Image();
        image.addEventListener("load", () => resolve(image), { once: true });
        image.src = src;
    });
}

function checkColors(ctx, w, h, expectedColors) {
    let data = ctx.getImageData(0, 0, w, h).data;
    for (let [row, col, r, g, b, a] of expectedColors) {
        let x = col * 80 + 40;
        let y = row * 80 + 40;
        let i = (x + y * w) * 4;

        let expected = [r, g, b, a];
        let actual = [data[i], data[i + 1], data[i + 2], data[i + 3]];

        assert_array_approx_equals(actual, expected, 1, `Pixel value at (${x},${y}) ${expected} =~ ${actual}.`);
    }
}

async_test(function(t) {
    const canvas = document.createElement("canvas");
    canvas.width = 320;
    canvas.height = 160;
    document.body.append(canvas);

    const ctx = canvas.getContext("2d");
    loadImage("resources/squares_6.jpg")
        .then((image) => createImageBitmap(image))
        .then(t.step_func_done(function(imageBitmap) {
            ctx.drawImage(imageBitmap, 0, 0);
            checkColors(ctx, canvas.width, canvas.height, [
                // row, col, r, g, b, a
                [0, 0, 255, 0, 0, 255],
                [0, 1, 0, 255, 0, 255],
                [0, 2, 0, 0, 255, 255],
                [0, 3, 0, 0, 0, 255],
                [1, 0, 255, 128, 128, 255],
                [1, 1, 128, 255, 128, 255],
                [1, 2, 128, 128, 255, 255],
                [1, 3, 128, 128, 128, 255],
            ]);
        }));
}, "createImageBitmap with EXIF rotation, imageOrientation from-image, and no cropping");

async_test(function(t) {
    const canvas = document.createElement("canvas");
    canvas.width = 320;
    canvas.height = 160;
    document.body.append(canvas);

    const ctx = canvas.getContext("2d");
    loadImage("resources/squares_6.jpg")
        .then((image) => createImageBitmap(image, { imageOrientation: "flipY" }))
        .then(t.step_func_done(function(imageBitmap) {
            ctx.drawImage(imageBitmap, 0, 0);
            checkColors(ctx, canvas.width, canvas.height, [
                // row, col, r, g, b, a
                [0, 0, 255, 128, 128, 255],
                [0, 1, 128, 255, 128, 255],
                [0, 2, 128, 128, 255, 255],
                [0, 3, 128, 128, 128, 255],
                [1, 0, 255, 0, 0, 255],
                [1, 1, 0, 255, 0, 255],
                [1, 2, 0, 0, 255, 255],
                [1, 3, 0, 0, 0, 255],
            ]);
        }));
}, "createImageBitmap with EXIF rotation, imageOrientation flipY, and no cropping");

async_test(function(t) {
    const canvas = document.createElement("canvas");
    canvas.width = 160;
    canvas.height = 160;
    document.body.append(canvas);

    const ctx = canvas.getContext("2d");
    loadImage("resources/squares_6.jpg")
        .then(image => createImageBitmap(image, 80, 0, 160, 160))
        .then(t.step_func_done(function(imageBitmap) {
            ctx.drawImage(imageBitmap, 0, 0);
            checkColors(ctx, canvas.width, canvas.height, [
                // row, col, r, g, b, a
                [0, 0, 0, 255, 0, 255],
                [0, 1, 0, 0, 255, 255],
                [1, 0, 128, 255, 128, 255],
                [1, 1, 128, 128, 255, 255],
            ]);
        }));
}, "createImageBitmap with EXIF rotation, imageOrientation from-image, and cropping");

async_test(function(t) {
    const canvas = document.createElement("canvas");
    canvas.width = 160;
    canvas.height = 160;
    document.body.append(canvas);

    const ctx = canvas.getContext("2d");
    loadImage("resources/squares_6.jpg")
        .then(image => createImageBitmap(image, 80, 0, 160, 160, { imageOrientation: "flipY" }))
        .then(t.step_func_done(function(imageBitmap) {
            ctx.drawImage(imageBitmap, 0, 0);
            checkColors(ctx, canvas.width, canvas.height, [
                // row, col, r, g, b, a
                [0, 0, 128, 255, 128, 255],
                [0, 1, 128, 128, 255, 255],
                [1, 0, 0, 255, 0, 255],
                [1, 1, 0, 0, 255, 255],
            ]);
        }));
}, "createImageBitmap with EXIF rotation, imageOrientation flipY, and cropping");
</script>