| Index: conformance/reading/read-pixels-pack-alignment.html
|
| ===================================================================
|
| --- conformance/reading/read-pixels-pack-alignment.html (revision 0)
|
| +++ conformance/reading/read-pixels-pack-alignment.html (revision 0)
|
| @@ -0,0 +1,240 @@
|
| +<!--
|
| +Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +Use of this source code is governed by a BSD-style license that can be
|
| +found in the LICENSE file.
|
| + -->
|
| +<!DOCTYPE html>
|
| +<html>
|
| +<head>
|
| +<meta charset="utf-8">
|
| +<link rel="stylesheet" href="../../resources/js-test-style.css"/>
|
| +<script src="../../resources/js-test-pre.js"></script>
|
| +<script src="../resources/webgl-test.js"></script>
|
| +<script id="vshader" type="x-shader/x-vertex">
|
| +attribute vec3 pos;
|
| +attribute vec4 colorIn;
|
| +varying vec4 color;
|
| +
|
| +void main()
|
| +{
|
| + color = colorIn;
|
| + gl_Position = vec4(pos.xyz, 1.0);
|
| +}
|
| +</script>
|
| +
|
| +<script id="fshader" type="x-shader/x-fragment">
|
| +precision mediump float;
|
| +varying vec4 color;
|
| +
|
| +void main()
|
| +{
|
| + gl_FragColor = color;
|
| +}
|
| +</script>
|
| +</head>
|
| +<body>
|
| +<canvas id="example" width="32px" height="32px"></canvas>
|
| +<div id="description"></div>
|
| +<div id="console"></div>
|
| +<script>
|
| +var successfullyParsed = false;
|
| +
|
| +// The below declarations need to be global for "shouldBe" to see them
|
| +var gl = null;
|
| +var array = null;
|
| +var pixel = [ 0, 0, 0, 0 ];
|
| +var expectedColor = [ 0, 0, 0, 0 ];
|
| +
|
| +function calculatePixelBytes(format, type)
|
| +{
|
| + var size = 0;
|
| + switch (format) {
|
| + case gl.ALPHA:
|
| + size = 1;
|
| + break;
|
| + case gl.RGB:
|
| + size = 3;
|
| + break;
|
| + case gl.RGBA:
|
| + size = 4;
|
| + break;
|
| + default:
|
| + return -1;
|
| + }
|
| + switch (type) {
|
| + case gl.UNSIGNED_BYTE:
|
| + break;
|
| + case gl.UNSIGNED_SHORT_5_6_5:
|
| + if (format != gl.RGB)
|
| + return -1;
|
| + size = 2;
|
| + break;
|
| + case gl.UNSIGNED_SHORT_4_4_4_4:
|
| + case gl.UNSIGNED_SHORT_5_5_5_1:
|
| + if (format != gl.RGBA)
|
| + return -1;
|
| + size = 2;
|
| + break;
|
| + default:
|
| + return -1;
|
| + }
|
| + return size;
|
| +}
|
| +
|
| +function calculatePaddingBytes(bytesPerPixel, packAlignment, width)
|
| +{
|
| + var padding = 0;
|
| + switch (packAlignment) {
|
| + case 1:
|
| + case 2:
|
| + case 4:
|
| + case 8:
|
| + padding = (bytesPerPixel * width) % packAlignment;
|
| + if (padding > 0)
|
| + padding = packAlignment - padding;
|
| + break;
|
| + default:
|
| + return -1;
|
| + }
|
| + return padding;
|
| +}
|
| +
|
| +function packColor(format, type, r, g, b, a)
|
| +{
|
| + // FIXME: not sure if the color packing is correct for UNSIGNED_SHORT_*.
|
| + var color = [ 0, 0, 0, 0 ];
|
| + switch (type) {
|
| + case gl.UNSIGNED_BYTE:
|
| + switch (format) {
|
| + case gl.ALPHA:
|
| + color[0] = a;
|
| + break;
|
| + case gl.RGB:
|
| + color[0] = r;
|
| + color[1] = g;
|
| + color[2] = b;
|
| + break;
|
| + case gl.RGBA:
|
| + color[0] = r;
|
| + color[1] = g;
|
| + color[2] = b;
|
| + color[3] = a;
|
| + break;
|
| + default:
|
| + return null;
|
| + }
|
| + break;
|
| + case gl.UNSIGNED_SHORT_5_6_5:
|
| + if (format != gl.RGB)
|
| + return null;
|
| + r >>= 3;
|
| + g >>= 2;
|
| + b >>= 3;
|
| + color[0] = (r << 11) + (g << 5) + b;
|
| + break;
|
| + case gl.UNSIGNED_SHORT_4_4_4_4:
|
| + if (format != gl.RGBA)
|
| + return null;
|
| + r >>= 4;
|
| + g >>= 4;
|
| + b >>= 4;
|
| + a >>= 4;
|
| + color[0] = (r << 12) + (g << 8) + (b << 4) + a;
|
| + break;
|
| + case gl.UNSIGNED_SHORT_5_5_5_1:
|
| + if (format != gl.RGBA)
|
| + return null;
|
| + r >>= 3;
|
| + g >>= 3;
|
| + b >>= 3;
|
| + a >>= 7;
|
| + color[0] = (r << 11) + (g << 6) + (b << 1) + a;
|
| + break;
|
| + Default:
|
| + return null;
|
| + }
|
| + return color;
|
| +}
|
| +
|
| +function runTestIteration(format, type, packAlignment, width, height)
|
| +{
|
| + debug("Testing PACK_ALIGNMENT = " + packAlignment + ", width = " + width + ", height = " + height);
|
| + gl.clearColor(1, 0.4, 0, 1);
|
| + gl.clear(gl.COLOR_BUFFER_BIT);
|
| + gl.pixelStorei(gl.PACK_ALIGNMENT, packAlignment);
|
| + glErrorShouldBe(gl, gl.NO_ERROR);
|
| + var bytesPerPixel = calculatePixelBytes(format, type);
|
| + var padding = calculatePaddingBytes(bytesPerPixel, packAlignment, width);
|
| + var size = bytesPerPixel * width * height + padding * (height - 1);
|
| + if (type != gl.UNSIGNED_BYTE) {
|
| + throw "test error: only UNSIGNED_BYTE is valid to ReadPixels";
|
| + }
|
| + if (size < 0)
|
| + size = 0;
|
| + array = new Uint8Array(size);
|
| + gl.readPixels(0, 0, width, height, format, type, array);
|
| + if (width < 0 || height < 0) {
|
| + glErrorShouldBe(gl, gl.INVALID_VALUE);
|
| + return;
|
| + }
|
| +
|
| + glErrorShouldBe(gl, gl.NO_ERROR);
|
| + if (!array.length)
|
| + return;
|
| +
|
| + // Check the last pixel of the last row.
|
| + var bytesPerRow = width * bytesPerPixel + padding;
|
| + var pos = bytesPerRow * (height - 1) + (width - 1) * bytesPerPixel;
|
| + var numComponents = bytesPerPixel;
|
| + for (var i = 0; i < numComponents; ++i)
|
| + pixel[i] = array[pos + i];
|
| + for (var i = numComponents; i < 4; ++i)
|
| + pixel[i] = 0;
|
| + expectedColor = packColor(format, type, 255, 102, 0, 255);
|
| + shouldBeNonNull(expectedColor);
|
| + shouldBe("pixel", "expectedColor");
|
| +}
|
| +
|
| +description('Verify readPixels() works fine with various PACK_ALIGNMENT values.');
|
| +
|
| +shouldBeNonNull("gl = initWebGL('example', 'vshader', 'fshader', [ 'pos', 'colorIn' ], [ 0, 0, 0, 1 ], 1)");
|
| +gl.disable(gl.BLEND);
|
| +
|
| +var formats = [ gl.RGBA ];
|
| +var formatNames = [ "RGBA" ];
|
| +
|
| +for (var i = 0; i < formats.length; ++i) {
|
| + var format = formats[i];
|
| +
|
| + debug("Testing format = " + formatNames[i] + " and type = UNSIGNED_BYTE");
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 1, 1, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 2, 1, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 1, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 1, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 2, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 2, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 3, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 3, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 4, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 4, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 5, 1);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 5, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 5, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 6, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 7, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 8, 2);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 1, 0, 0);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 2, 0, 0);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 0, 0);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, 0, 0);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 1, -1, 1);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 2, 1, -1);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 4, 0, -1);
|
| + runTestIteration(format, gl.UNSIGNED_BYTE, 8, -1, -1);
|
| +}
|
| +
|
| +successfullyParsed = true;
|
| +</script>
|
| +<script src="../../resources/js-test-post.js"></script>
|
| +</body>
|
| +</html>
|
|
|
| Property changes on: conformance/reading/read-pixels-pack-alignment.html
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|