<!--

/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/

-->

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>WebGL pixelStorei Test</title>
<link rel="stylesheet" href="../../resources/js-test-style.css"/>
<script src="../../resources/js-test-pre.js"></script>
<script src="../resources/webgl-test-utils.js"> </script>
</head>
<body>
<canvas id="example" width="50" height="50"></canvas>
<canvas id="2d00" width="50" height="50"></canvas>
<canvas id="2d01" width="50" height="50"></canvas>
<canvas id="2d02" width="50" height="50"></canvas>
<canvas id="2d03" width="50" height="50"></canvas>
<div id="description"></div>
<div id="console"></div>
<script id="vshader" type="x-shader/x-vertex">
attribute vec4 vPosition;
void main() {
  gl_Position = vPosition;
}
</script>

<script id="fshader" type="x-shader/x-fragment">
void main() {
  gl_FragColor = vec4(1.0,0.0,0.0,1.0);
}
</script>

<script>
"use strict";
function init() {
  description("This test checks that drawImage and readPixels are not effected by gl.Pixelstorei(gl.PACK_ALIGNMENT) and visa versa");

  debug("There should be 5 red triangles on 5 black squares above");
  debug("");

  var wtu = WebGLTestUtils;
  var canvas3d = document.getElementById("example");
  var gl = wtu.create3DContext("example");
  var program = wtu.setupProgram(gl, ["vshader", "fshader"], ["vPosition"]);

  var vertexObject = gl.createBuffer();
  gl.bindBuffer(gl.ARRAY_BUFFER, vertexObject);
  gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([ 0,0.5,0, -0.5,-0.5,0, 0.5,-0.5,0 ]), gl.STATIC_DRAW);
  gl.enableVertexAttribArray(0);
  gl.vertexAttribPointer(0, 3, gl.FLOAT, false, 0, 0);

  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  gl.drawArrays(gl.TRIANGLES, 0, 3);

  function checkData(ctx, name) {
    // Test several locations
    // First line should be all black
    wtu.checkCanvasRect(ctx, 0, 0, 50, 1, [0, 0, 0, 0]);

    // Line 25 should be red for at least 6 red pixels starting 22 pixels in
    wtu.checkCanvasRect(ctx, 22, 25, 6, 1, [255, 0, 0, 255]);

    // Last line should be all black
    wtu.checkCanvasRect(ctx, 0, 49, 50, 1, [0, 0, 0, 0]);
  }

  var ctx2d;

  function checkColors() {
    checkData(gl, "3d context");
    checkData(ctx2d, "2d context");
  }

  var table = [1, 2, 4, 8];
  for (var ii = 0; ii < table.length; ++ii) {
    gl.pixelStorei(gl.PACK_ALIGNMENT, table[ii]);
    ctx2d = document.getElementById("2d0" + ii).getContext("2d");
    ctx2d.globalCompositeOperation = 'copy';
    ctx2d.drawImage(canvas3d, 0, 0);
    checkColors();
    assertMsg(gl.getParameter(gl.PACK_ALIGNMENT) == table[ii],
        "PACK_ALIGNMENT is " + table[ii]);
  }
}

init();
var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>

</body>
</html>
