From dfc4de0d8481c10b5ce1200a6a392acfe26c4143 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Sun, 8 Jan 2017 21:34:41 -0800 Subject: [PATCH] webgl: Add support for premultiplying alpha. Now the affected testcase only fails due to unpack alignment. --- components/canvas_traits/lib.rs | 10 +- .../script/dom/webglrenderingcontext.rs | 85 +- ...b-image-2d-with-array-buffer-view.html.ini | 860 +----------------- 3 files changed, 96 insertions(+), 859 deletions(-) diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index 6b66f659802b..e9f73a83adfd 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -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]) { let length = data.len(); @@ -427,9 +431,9 @@ pub fn byte_swap_and_premultiply(data: &mut [u8]) { let b = data[i + 0]; let a = data[i + 3]; - data[i + 0] = ((r as u32) * (a as u32) / 255) as u8; - data[i + 1] = ((g as u32) * (a as u32) / 255) as u8; - data[i + 2] = ((b as u32) * (a as u32) / 255) as u8; + data[i + 0] = multiply_u8_pixel(r, a); + data[i + 1] = multiply_u8_pixel(g, a); + data[i + 2] = multiply_u8_pixel(b, a); i += 4; } diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index ca38df1e4421..c038c0abf8f0 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -2,8 +2,8 @@ * 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/. */ -use byteorder::{NativeEndian, WriteBytesExt}; -use canvas_traits::{CanvasCommonMsg, CanvasMsg, byte_swap}; +use byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt}; +use canvas_traits::{CanvasCommonMsg, CanvasMsg, byte_swap, multiply_u8_pixel}; use core::nonzero::NonZero; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::{self, WebGLContextAttributes}; use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextConstants as constants; @@ -113,6 +113,7 @@ fn has_invalid_blend_constants(arg1: u32, arg2: u32) -> bool { (_, _) => false } } + /// Set of bitflags for texture unpacking (texImage2d, etc...) bitflags! { #[derive(HeapSizeOf, JSTraceable)] @@ -560,6 +561,72 @@ impl WebGLRenderingContext { 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) -> Vec { + if !self.texture_unpacking_settings.get().contains(PREMULTIPLY_ALPHA) { + return pixels; + } + + match (format, data_type) { + (TexFormat::RGBA, TexDataType::UnsignedByte) => { + let mut premul = Vec::::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::::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::::with_capacity(pixels.len()); + for mut rgba in pixels.chunks(2) { + let pix = rgba.read_u16::().unwrap(); + if pix & (1 << 15) != 0 { + premul.write_u16::(pix).unwrap(); + } else { + premul.write_u16::(0).unwrap(); + } + } + premul + } + + (TexFormat::RGBA, TexDataType::UnsignedShort4444) => { + let mut premul = Vec::::with_capacity(pixels.len()); + for mut rgba in pixels.chunks(2) { + let pix = rgba.read_u16::().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::((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, texture: Root, target: TexImageTarget, @@ -570,11 +637,8 @@ impl WebGLRenderingContext { height: u32, _border: u32, pixels: Vec) { // NB: pixels should NOT be premultipied - if internal_format == TexFormat::RGBA && - data_type == TexDataType::UnsignedByte && - self.texture_unpacking_settings.get().contains(PREMULTIPLY_ALPHA) { - // TODO(emilio): premultiply here. - } + // FINISHME: Consider doing premultiply and flip in a single mutable Vec. + let pixels = self.premultiply_pixels(internal_format, data_type, pixels); let pixels = self.flip_teximage_y(pixels, internal_format, data_type, width as usize, height as usize); @@ -587,7 +651,7 @@ impl WebGLRenderingContext { level, 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, internal_format.as_gl_constant() as i32, width as i32, height as i32, @@ -632,10 +696,13 @@ impl WebGLRenderingContext { 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, 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(), level as i32, xoffset, yoffset, width as i32, height as i32, diff --git a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html.ini b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html.ini index d59840369b0e..1c76e0ed8420 100644 --- a/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html.ini +++ b/tests/wpt/metadata/webgl/conformance-1.0.3/conformance/textures/tex-image-and-sub-image-2d-with-array-buffer-view.html.ini @@ -1,956 +1,122 @@ [tex-image-and-sub-image-2d-with-array-buffer-view.html] 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] expected: FAIL [WebGL test #289: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #337: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #577: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #625: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #673: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #721: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #961: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #1009: at (0, 9) expected: 255,0,0,255 was 0,0,0,255] 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] 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] expected: FAIL [WebGL test #1057: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] 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] 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] + [WebGL test #1104: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] expected: FAIL - [WebGL test #1086: at (0, 0) expected: 0,0,0,255 was 0,0,255,255] + [WebGL test #1105: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] expected: FAIL - [WebGL test #1088: at (8, 0) expected: 0,0,0,255 was 0,255,0,255] + [WebGL test #1129: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] expected: FAIL - [WebGL test #1090: at (8, 8) 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 - [WebGL test #1104: at (6, 0) expected: 0,255,0,255 was 0,0,0,255] + [WebGL test #360: at (0, 5) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1105: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] + [WebGL test #600: at (0, 5) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1128: at (0, 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 - [WebGL test #1129: at (13, 8) expected: 255,0,0,255 was 0,0,0,255] + [WebGL test #696: at (0, 3) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1130: at (0, 0) expected: 0,0,0,255 was 0,0,255,255] + [WebGL test #744: at (0, 3) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1132: at (8, 0) expected: 0,0,0,255 was 0,255,0,255] + [WebGL test #984: at (0, 5) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1134: at (0, 0) expected: 0,0,0,255 was 0,0,255,255] + [WebGL test #1032: at (0, 5) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1136: at (8, 0) expected: 0,0,0,255 was 0,255,0,255] + [WebGL test #1080: at (0, 3) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL - [WebGL test #1138: at (8, 8) expected: 0,0,0,255 was 0,0,255,255] + [WebGL test #1128: at (0, 3) expected: 0,0,0,255 was 255,0,0,255] expected: FAIL