summaryrefslogtreecommitdiffstats
path: root/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
parentInitial commit. (diff)
downloadfirefox-esr-upstream.tar.xz
firefox-esr-upstream.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/canvas/test/webgl-mochitest/test_hidden_alpha.html')
-rw-r--r--dom/canvas/test/webgl-mochitest/test_hidden_alpha.html156
1 files changed, 156 insertions, 0 deletions
diff --git a/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
new file mode 100644
index 0000000000..addc1b0162
--- /dev/null
+++ b/dom/canvas/test/webgl-mochitest/test_hidden_alpha.html
@@ -0,0 +1,156 @@
+<!DOCTYPE HTML>
+<title>WebGL test: Hidden alpha on no-alpha contexts</title>
+<script src='/tests/SimpleTest/SimpleTest.js'></script>
+<link rel='stylesheet' href='/tests/SimpleTest/test.css'>
+<script src='driver-info.js'></script>
+<script src='webgl-util.js'></script>
+<body>
+<script id='vs' type='x-shader/x-vertex'>
+ attribute vec2 aPosCoord;
+
+ void main(void) {
+ gl_Position = vec4(aPosCoord, 0.0, 1.0);
+ }
+</script>
+
+<script id='fs' type='x-shader/x-fragment'>
+ precision mediump float;
+
+ void main(void) {
+ gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+ }
+</script>
+<canvas id='canvas' style='border: none;' width='100' height='100'></canvas>
+<script>
+
+var posCoords_arr = new Float32Array(2 * 4);
+var posCoords_buff = null;
+function DrawQuad(gl, prog, x0, y0, x1, y1) {
+ gl.useProgram(prog);
+
+ if (!posCoords_buff) {
+ posCoords_buff = gl.createBuffer();
+ }
+ gl.bindBuffer(gl.ARRAY_BUFFER, posCoords_buff);
+ posCoords_arr[0] = x0;
+ posCoords_arr[1] = y0;
+
+ posCoords_arr[2] = x1;
+ posCoords_arr[3] = y0;
+
+ posCoords_arr[4] = x0;
+ posCoords_arr[5] = y1;
+
+ posCoords_arr[6] = x1;
+ posCoords_arr[7] = y1;
+ gl.bufferData(gl.ARRAY_BUFFER, posCoords_arr, gl.STREAM_DRAW);
+
+ gl.enableVertexAttribArray(prog.aPosCoord);
+ gl.vertexAttribPointer(prog.aPosCoord, 2, gl.FLOAT, false, 0, 0);
+
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
+}
+
+function DrawSquare(gl, prog, size) {
+ DrawQuad(gl, prog, -size, -size, size, size);
+}
+
+function Reset(gl) {
+ gl.canvas.width += 1;
+ gl.canvas.width -= 1;
+}
+
+function ReadCenterPixel(gl) {
+ var w = gl.drawingbufferWidth;
+ var h = gl.drawingbufferHeight;
+ var ret = new Uint8Array(4);
+ gl.readPixels(w/2, h/2, 1, 1, gl.RGBA, gl.UNSIGNED_BYTE, ret);
+ return ret;
+}
+
+function Test(gl, prog) {
+ gl.enable(gl.BLEND);
+ gl.blendFunc(gl.ZERO, gl.DST_ALPHA);
+
+ var iColor = 64;
+ var fColor = iColor / 255.0;
+
+ //////////////////
+
+ ok(true, 'clear(R,G,B,0)');
+
+ Reset(gl);
+
+ gl.clearColor(fColor, fColor, fColor, 0.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+
+ var dataURL_pre = gl.canvas.toDataURL();
+ //console.log('Before blending: ' + dataURL_pre);
+
+ DrawSquare(gl, prog, 0.7);
+
+ var pixel = ReadCenterPixel(gl);
+ ok(pixel[0] == iColor &&
+ pixel[1] == iColor &&
+ pixel[2] == iColor, 'Color should be the same.');
+ ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.');
+
+ var dataURL_post = gl.canvas.toDataURL();
+ //console.log('After blending: ' + dataURL_post);
+ ok(dataURL_post == dataURL_pre,
+ 'toDataURL should be unchanged after blending.');
+
+ //////////////////
+
+ ok(true, 'mask(R,G,B,0), clear(R,G,B,1)');
+
+ Reset(gl);
+
+ gl.colorMask(true, true, true, false);
+ gl.clearColor(fColor, fColor, fColor, 1.0);
+ gl.clear(gl.COLOR_BUFFER_BIT);
+ gl.colorMask(true, true, true, true);
+
+ dataURL_pre = gl.canvas.toDataURL();
+ //console.log('Before blending: ' + dataURL_pre);
+
+ DrawSquare(gl, prog, 0.7);
+
+ var pixel = ReadCenterPixel(gl);
+ ok(pixel[0] == iColor &&
+ pixel[1] == iColor &&
+ pixel[2] == iColor, 'Color should be the same.');
+ ok(pixel[3] == 255, 'No-alpha should always readback as 1.0 alpha.');
+ ok(gl.getError() == 0, 'Should have no errors.');
+
+ dataURL_post = gl.canvas.toDataURL();
+ //console.log('After blending: ' + dataURL_post);
+ ok(dataURL_post == dataURL_pre,
+ 'toDataURL should be unchanged after blending.');
+
+ ok(true, 'Test complete.');
+ SimpleTest.finish();
+}
+
+(function(){
+ var canvas = document.getElementById('canvas');
+ var attribs = {
+ alpha: false,
+ antialias: false,
+ premultipliedAlpha: false,
+ };
+ var gl = canvas.getContext('experimental-webgl', attribs);
+ ok(gl, 'WebGL should work.');
+ ok(gl.getParameter(gl.ALPHA_BITS) == 0, 'Shouldn\'t have alpha bits.');
+
+ var prog = WebGLUtil.createProgramByIds(gl, 'vs', 'fs');
+ ok(prog, 'Program should link.');
+ prog.aPosCoord = gl.getAttribLocation(prog, 'aPosCoord');
+
+ SimpleTest.waitForExplicitFinish();
+ SimpleTest.requestFlakyTimeout("untriaged");
+ setTimeout(function(){ Test(gl, prog); }, 500);
+})();
+
+</script>
+</body>