webgl: Add support for premultiplying alpha.

Now the affected testcase only fails due to unpack alignment.
This commit is contained in:
Eric Anholt 2017-01-08 21:34:41 -08:00
parent 57ba1646bc
commit dfc4de0d84
3 changed files with 103 additions and 866 deletions

View file

@ -417,6 +417,10 @@ pub fn byte_swap(data: &mut [u8]) {
} }
} }
pub fn multiply_u8_pixel(a: u8, b: u8) -> u8 {
return (a as u32 * b as u32 / 255) as u8;
}
pub fn byte_swap_and_premultiply(data: &mut [u8]) { pub fn byte_swap_and_premultiply(data: &mut [u8]) {
let length = data.len(); let length = data.len();
@ -427,9 +431,9 @@ pub fn byte_swap_and_premultiply(data: &mut [u8]) {
let b = data[i + 0]; let b = data[i + 0];
let a = data[i + 3]; let a = data[i + 3];
data[i + 0] = ((r as u32) * (a as u32) / 255) as u8; data[i + 0] = multiply_u8_pixel(r, a);
data[i + 1] = ((g as u32) * (a as u32) / 255) as u8; data[i + 1] = multiply_u8_pixel(g, a);
data[i + 2] = ((b as u32) * (a as u32) / 255) as u8; data[i + 2] = multiply_u8_pixel(b, a);
i += 4; i += 4;
} }

View file

@ -2,8 +2,8 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use byteorder::{NativeEndian, WriteBytesExt}; use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
use canvas_traits::{CanvasCommonMsg, CanvasMsg, byte_swap}; use canvas_traits::{CanvasCommonMsg, CanvasMsg, byte_swap, multiply_u8_pixel};
use core::nonzero::NonZero; use core::nonzero::NonZero;
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes}; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes};
use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants;
@ -113,6 +113,7 @@ fn has_invalid_blend_constants(arg1: u32, arg2: u32) -> bool {
(_, _) => false (_, _) => false
} }
} }
/// Set of bitflags for texture unpacking (texImage2d, etc...) /// Set of bitflags for texture unpacking (texImage2d, etc...)
bitflags! { bitflags! {
#[derive(HeapSizeOf, JSTraceable)] #[derive(HeapSizeOf, JSTraceable)]
@ -560,6 +561,72 @@ impl WebGLRenderingContext {
flipped flipped
} }
/// Performs premultiplication of the pixels if
/// UNPACK_PREMULTIPLY_ALPHA_WEBGL is currently enabled.
fn premultiply_pixels(&self,
format: TexFormat,
data_type: TexDataType,
pixels: Vec<u8>) -> Vec<u8> {
if !self.texture_unpacking_settings.get().contains(PREMULTIPLY_ALPHA) {
return pixels;
}
match (format, data_type) {
(TexFormat::RGBA, TexDataType::UnsignedByte) => {
let mut premul = Vec::<u8>::with_capacity(pixels.len());
for rgba in pixels.chunks(4) {
premul.push(multiply_u8_pixel(rgba[0], rgba[3]));
premul.push(multiply_u8_pixel(rgba[1], rgba[3]));
premul.push(multiply_u8_pixel(rgba[2], rgba[3]));
premul.push(rgba[3]);
}
premul
}
(TexFormat::LuminanceAlpha, TexDataType::UnsignedByte) => {
let mut premul = Vec::<u8>::with_capacity(pixels.len());
for la in pixels.chunks(2) {
premul.push(multiply_u8_pixel(la[0], la[1]));
premul.push(la[1]);
}
premul
}
(TexFormat::RGBA, TexDataType::UnsignedShort5551) => {
let mut premul = Vec::<u8>::with_capacity(pixels.len());
for mut rgba in pixels.chunks(2) {
let pix = rgba.read_u16::<NativeEndian>().unwrap();
if pix & (1 << 15) != 0 {
premul.write_u16::<NativeEndian>(pix).unwrap();
} else {
premul.write_u16::<NativeEndian>(0).unwrap();
}
}
premul
}
(TexFormat::RGBA, TexDataType::UnsignedShort4444) => {
let mut premul = Vec::<u8>::with_capacity(pixels.len());
for mut rgba in pixels.chunks(2) {
let pix = rgba.read_u16::<NativeEndian>().unwrap();
let extend_to_8_bits = |val| { (val | val << 4) as u8 };
let r = extend_to_8_bits(pix & 0x000f);
let g = extend_to_8_bits((pix & 0x00f0) >> 4);
let b = extend_to_8_bits((pix & 0x0f00) >> 8);
let a = extend_to_8_bits((pix & 0xf000) >> 12);
premul.write_u16::<NativeEndian>((multiply_u8_pixel(r, a) & 0xf0) as u16 >> 4 |
(multiply_u8_pixel(g, a) & 0xf0) as u16 |
((multiply_u8_pixel(b, a) & 0xf0) as u16) << 4 |
pix & 0xf000).unwrap();
}
premul
}
// Other formats don't have alpha, so return their data untouched.
_ => pixels
}
}
fn tex_image_2d(&self, fn tex_image_2d(&self,
texture: Root<WebGLTexture>, texture: Root<WebGLTexture>,
target: TexImageTarget, target: TexImageTarget,
@ -570,11 +637,8 @@ impl WebGLRenderingContext {
height: u32, height: u32,
_border: u32, _border: u32,
pixels: Vec<u8>) { // NB: pixels should NOT be premultipied pixels: Vec<u8>) { // NB: pixels should NOT be premultipied
if internal_format == TexFormat::RGBA && // FINISHME: Consider doing premultiply and flip in a single mutable Vec.
data_type == TexDataType::UnsignedByte && let pixels = self.premultiply_pixels(internal_format, data_type, pixels);
self.texture_unpacking_settings.get().contains(PREMULTIPLY_ALPHA) {
// TODO(emilio): premultiply here.
}
let pixels = self.flip_teximage_y(pixels, internal_format, data_type, let pixels = self.flip_teximage_y(pixels, internal_format, data_type,
width as usize, height as usize); width as usize, height as usize);
@ -587,7 +651,7 @@ impl WebGLRenderingContext {
level, level,
Some(data_type))); Some(data_type)));
// TODO(emilio): convert colorspace, premultiply alpha if requested // TODO(emilio): convert colorspace if requested
let msg = WebGLCommand::TexImage2D(target.as_gl_constant(), level as i32, let msg = WebGLCommand::TexImage2D(target.as_gl_constant(), level as i32,
internal_format.as_gl_constant() as i32, internal_format.as_gl_constant() as i32,
width as i32, height as i32, width as i32, height as i32,
@ -632,10 +696,13 @@ impl WebGLRenderingContext {
return self.webgl_error(InvalidOperation); return self.webgl_error(InvalidOperation);
} }
// FINISHME: Consider doing premultiply and flip in a single mutable Vec.
let pixels = self.premultiply_pixels(format, data_type, pixels);
let pixels = self.flip_teximage_y(pixels, format, data_type, let pixels = self.flip_teximage_y(pixels, format, data_type,
width as usize, height as usize); width as usize, height as usize);
// TODO(emilio): convert colorspace, premultiply alpha if requested // TODO(emilio): convert colorspace if requested
let msg = WebGLCommand::TexSubImage2D(target.as_gl_constant(), let msg = WebGLCommand::TexSubImage2D(target.as_gl_constant(),
level as i32, xoffset, yoffset, level as i32, xoffset, yoffset,
width as i32, height as i32, width as i32, height as i32,

View file

@ -1,956 +1,122 @@
[tex-image-and-sub-image-2d-with-array-buffer-view.html] [tex-image-and-sub-image-2d-with-array-buffer-view.html]
type: testharness type: testharness
[WebGL test #37: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #39: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #41: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #43: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #45: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #47: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #85: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #87: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #89: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #91: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #93: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #95: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #133: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #135: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #137: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #139: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #141: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #143: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #181: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #183: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #185: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #187: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #189: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #191: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #229: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #231: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #233: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #235: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #237: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #239: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #277: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #279: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #281: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #283: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #285: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #287: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #331: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #333: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #429: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #477: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #525: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #573: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #325: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #327: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #329: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #335: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #373: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #375: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #377: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #379: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #381: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #383: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #421: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #423: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #425: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #427: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #431: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #469: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #471: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #473: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #475: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #479: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #517: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #519: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #521: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #523: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #527: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #565: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #567: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #569: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #571: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #575: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #613: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #615: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #617: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #619: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #621: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #623: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #661: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #663: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #665: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #667: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #669: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #671: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #709: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #711: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #713: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #715: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #717: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #719: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #757: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #759: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #761: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #763: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #765: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #767: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #805: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #807: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #809: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #811: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #813: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #815: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #853: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #855: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #857: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #859: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #861: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #863: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #901: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #903: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #905: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #907: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #909: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #911: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #949: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #951: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #953: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #955: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #957: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #959: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #997: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #999: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1001: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1003: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1005: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1007: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1045: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1047: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1049: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1051: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1053: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1055: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1093: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1095: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1097: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1099: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1101: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1103: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1141: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1143: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1145: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1147: at (0, 4) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1149: at (0, 8) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1151: at (8, 12) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #24: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #26: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #28: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #30: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #32: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #34: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #72: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #74: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #76: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #78: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #80: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #82: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #120: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #122: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #124: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #126: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #128: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #130: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #168: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #170: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #172: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #174: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #176: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #178: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #216: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #218: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #220: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #222: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #224: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #226: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #264: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #266: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #268: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #270: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #272: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #274: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #288: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #288: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #289: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #289: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #312: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #313: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #313: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #314: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #316: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #318: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #320: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #322: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #336: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #336: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #337: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #337: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #360: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #361: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #361: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #362: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #364: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #366: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #368: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #370: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #408: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #410: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #412: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #414: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #416: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #418: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #456: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #458: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #460: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #462: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #464: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #466: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #504: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #506: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #508: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #510: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #512: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #514: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #552: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #554: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #556: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #558: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #560: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #562: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #576: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #576: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #577: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #577: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #600: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #601: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #601: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #602: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #604: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #606: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #608: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #610: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #624: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #624: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #625: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #625: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #648: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #649: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #649: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #650: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #652: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #654: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #656: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #658: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #672: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #672: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #673: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #673: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #696: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #697: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #697: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #698: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #700: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #702: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #704: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #706: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #720: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #720: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #721: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #721: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #744: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #745: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #745: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #746: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #748: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #750: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #752: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #754: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #792: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #794: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #796: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #798: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #800: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #802: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #840: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #842: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #844: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #846: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #848: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #850: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #888: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #890: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #892: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #894: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #896: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #898: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #936: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #938: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #940: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #942: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #944: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #946: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #960: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #960: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #961: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #961: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #984: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #985: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #985: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #986: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #988: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #990: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #992: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #994: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1008: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #1008: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1009: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1009: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1032: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1033: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1033: at (0, 9) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1034: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1036: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1038: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1040: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1042: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1056: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #1056: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1057: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1057: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1080: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1081: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1081: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1082: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1084: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1086: at (0, 0) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1088: at (8, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1090: at (8, 8) expected: 0,0,0,255 was 0,0,255,255]
expected: FAIL
[WebGL test #1104: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] [WebGL test #1104: at (6, 0) expected: 0,255,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1105: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1105: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1128: at (0, 0) expected: 0,0,0,255 was 0,255,0,255]
expected: FAIL
[WebGL test #1129: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] [WebGL test #1129: at (13, 8) expected: 255,0,0,255 was 0,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1130: at (0, 0) expected: 0,0,0,255 was 0,0,255,255] [WebGL test #312: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1132: at (8, 0) expected: 0,0,0,255 was 0,255,0,255] [WebGL test #360: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1134: at (0, 0) expected: 0,0,0,255 was 0,0,255,255] [WebGL test #600: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1136: at (8, 0) expected: 0,0,0,255 was 0,255,0,255] [WebGL test #648: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL expected: FAIL
[WebGL test #1138: at (8, 8) expected: 0,0,0,255 was 0,0,255,255] [WebGL test #696: at (0, 3) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL
[WebGL test #744: at (0, 3) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL
[WebGL test #984: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL
[WebGL test #1032: at (0, 5) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL
[WebGL test #1080: at (0, 3) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL
[WebGL test #1128: at (0, 3) expected: 0,0,0,255 was 255,0,0,255]
expected: FAIL expected: FAIL