summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html')
-rw-r--r--testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html119
1 files changed, 119 insertions, 0 deletions
diff --git a/testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html b/testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html
new file mode 100644
index 0000000000..fa4a090418
--- /dev/null
+++ b/testing/web-platform/tests/density-size-correction/density-corrected-image-in-canvas.html
@@ -0,0 +1,119 @@
+<html>
+ <head>
+ <title>Density corrected size: canvas</title>
+ <link rel="author" title="Noam Rosenthal" href="noam@webkit.org">
+ <meta name="assert" content="Assert that density-corrected size in EXIF is taken into account for images when drawn in canvas">
+ <script src="/resources/testharness.js"></script>
+ <script src="/resources/testharnessreport.js"></script>
+ </head>
+ <body>
+ <p>You should see green/yellow gradient boxes</p>
+ <script id="shader-fs" type="x-shader/x-fragment">
+ precision mediump float;
+ uniform sampler2D u_image;
+ varying vec2 v_texCoord;
+ uniform float u_frame;
+
+ void main(void) {
+ gl_FragColor = texture2D(u_image, v_texCoord);
+ }
+ </script>
+ <script id="shader-vs" type="x-shader/x-vertex">
+ precision mediump float;
+ attribute vec2 a_vertex;
+ attribute vec2 a_tex;
+ varying vec2 v_texCoord;
+
+ void main(void) {
+ gl_Position = vec4(a_vertex, 0, 1) ;
+ v_texCoord = a_tex;
+ }
+ </script>
+
+ <script>
+ const dim = 3
+ function drawImage2d(context, image, srcRect) {
+ context.drawImage(image, ...srcRect, 0, 0, dim, dim)
+ return context.getImageData(0, 0, dim, dim)
+ }
+ function drawImage3d(gl, image, srcRect) {
+ const vshader = gl.createShader(gl.VERTEX_SHADER)
+ const fshader = gl.createShader(gl.FRAGMENT_SHADER)
+ gl.shaderSource(vshader, document.querySelector("#shader-vs").textContent)
+ gl.shaderSource(fshader, document.querySelector("#shader-fs").textContent)
+ gl.compileShader(vshader)
+ gl.compileShader(fshader)
+ const program = gl.createProgram()
+ gl.attachShader(program, vshader)
+ gl.attachShader(program, fshader)
+ gl.linkProgram(program)
+ gl.useProgram(program)
+ const a_vertex = gl.getAttribLocation(program, "a_vertex")
+ const a_tex = gl.getAttribLocation(program, "a_tex")
+ const buf_vertex = gl.createBuffer()
+ const buf_tex = gl.createBuffer()
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf_tex)
+ const [sx, sy, sw, sh] = [srcRect[0] / image.naturalWidth, srcRect[1] / image.naturalHeight, srcRect[2] / image.naturalWidth, srcRect[3] / image.naturalHeight]
+
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
+ sx, sy, sx + sw, sy, sx, sy + sh, sx + sw, sy + sh
+ ]), gl.STATIC_DRAW)
+
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf_vertex)
+ var vertices = [-1, 1, 1, 1, -1, -1, 1, -1]
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW)
+ var texture = gl.createTexture()
+ gl.bindTexture(gl.TEXTURE_2D, texture)
+ gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, image)
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR)
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR)
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE)
+ gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE)
+ gl.viewport(0, 0, dim, dim)
+ gl.enableVertexAttribArray(a_vertex)
+ gl.enableVertexAttribArray(a_tex)
+ gl.uniform1i(gl.getUniformLocation(program, "u_image"), 0)
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf_tex)
+ gl.vertexAttribPointer(a_tex, 2, gl.FLOAT, false, 0, 0)
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf_vertex)
+ gl.vertexAttribPointer(a_vertex, 2, gl.FLOAT, false, 0, 0)
+ gl.clearColor(1, 1, 1, 1)
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+ const pixels = new Uint8ClampedArray(dim * dim * 4)
+ gl.readPixels(0, 0, dim, dim, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
+ return {data: pixels, width: dim, height: dim}
+ }
+ function createCanvasWithImage(src, contextType, srcRect) {
+ const canvas = document.createElement('canvas')
+ canvas.width = canvas.height = dim
+ const image = new Image()
+ image.src = src
+ return new Promise(resolve => {
+ image.onload = () => {
+ const context = canvas.getContext(contextType)
+ if (contextType === '2d')
+ resolve(drawImage2d(context, image, srcRect))
+ else
+ resolve(drawImage3d(context, image, srcRect))
+ }
+ })
+ }
+
+ let reference = null;
+ function checkCanvasImage(src, contextType, srcRect) {
+ promise_test(async function() {
+ if (!reference)
+ reference = await createCanvasWithImage('resources/exif-resolution-none.jpg', '2d', [40, 5, 20, 5]);
+ const data = await createCanvasWithImage(src, contextType, srcRect)
+ assert_array_approx_equals(data.data, reference.data, 32)
+ }, `${src}: ${contextType}`);
+ }
+
+ checkCanvasImage("resources/exif-resolution-valid-hires.jpg", '2d', [20, 5, 10, 1])
+ checkCanvasImage("resources/exif-resolution-valid-lores.jpg", '2d', [80, 5, 40, 10])
+ checkCanvasImage("resources/exif-resolution-none.jpg", 'webgl', [40, 5, 20, 5]);
+ checkCanvasImage("resources/exif-resolution-valid-hires.jpg", 'webgl', [20, 5, 10, 1]);
+ checkCanvasImage("resources/exif-resolution-valid-lores.jpg", 'webgl', [80, 5, 40, 1]);
+ </script>
+ </body>
+</html>