From 6a692228fc091fd999763e521e61f2cc50e1284d Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 8 Sep 2018 18:06:51 +0200 Subject: [PATCH 1/2] Fix the ALPHA/FLOAT case of rgba8_image_to_tex_image_data I'm pretty sure this is supposed to write the ALPHA component. --- components/script/dom/webglrenderingcontext.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index c96fdcf60b60..24f8458aa1c2 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -4107,7 +4107,7 @@ fn rgba8_image_to_tex_image_data( (TexFormat::Alpha, TexDataType::Float) => { for rgba8 in pixels.chunks_mut(4) { - let p = rgba8[0] as f32; + let p = rgba8[3] as f32; NativeEndian::write_f32(rgba8, p); } pixels From 74e6f40abe666b2868b209dd2c7b7cf18b085186 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Sat, 8 Sep 2018 18:21:45 +0200 Subject: [PATCH 2/2] Reuse the input vector in more cases of rgba8_image_to_tex_image_data --- .../script/dom/webglrenderingcontext.rs | 126 ++++++++++-------- 1 file changed, 70 insertions(+), 56 deletions(-) diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 24f8458aa1c2..dc43e41c277b 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -4025,65 +4025,78 @@ fn rgba8_image_to_tex_image_data( } rgb8 }, - (TexFormat::Alpha, TexDataType::UnsignedByte) => { - let mut alpha = Vec::::with_capacity(pixel_count); - for rgba8 in pixels.chunks(4) { - alpha.push(rgba8[3]); + for i in 0..pixel_count { + let p = pixels[i * 4 + 3]; + pixels[i] = p; } - alpha + pixels.truncate(pixel_count); + pixels }, - (TexFormat::Luminance, TexDataType::UnsignedByte) => { - let mut lum = Vec::::with_capacity(pixel_count); - for rgba8 in pixels.chunks(4) { - lum.push(luminance(rgba8[0], rgba8[1], rgba8[2])); + for i in 0..pixel_count { + let p = { + let rgb = &pixels[i * 4..i * 4 + 3]; + luminance(rgb[0], rgb[1], rgb[2]) + }; + pixels[i] = p; } - lum + pixels.truncate(pixel_count); + pixels }, - (TexFormat::LuminanceAlpha, TexDataType::UnsignedByte) => { - let mut data = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - data.push(luminance(rgba8[0], rgba8[1], rgba8[2])); - data.push(rgba8[3]); + for i in 0..pixel_count { + let (lum, a) = { + let rgba = &pixels[i * 4..i * 4 + 4]; + (luminance(rgba[0], rgba[1], rgba[2]), rgba[3]) + }; + pixels[i * 2] = lum; + pixels[i * 2 + 1] = a; } - data + pixels.truncate(pixel_count * 2); + pixels }, - (TexFormat::RGBA, TexDataType::UnsignedShort4444) => { - let mut rgba4 = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - rgba4.write_u16::((rgba8[0] as u16 & 0xf0) << 8 | - (rgba8[1] as u16 & 0xf0) << 4 | - (rgba8[2] as u16 & 0xf0) | - (rgba8[3] as u16 & 0xf0) >> 4).unwrap(); + for i in 0..pixel_count { + let p = { + let rgba = &pixels[i * 4..i * 4 + 4]; + (rgba[0] as u16 & 0xf0) << 8 | + (rgba[1] as u16 & 0xf0) << 4 | + (rgba[2] as u16 & 0xf0) | + (rgba[3] as u16 & 0xf0) >> 4 + }; + NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); } - rgba4 - } - + pixels.truncate(pixel_count * 2); + pixels + }, (TexFormat::RGBA, TexDataType::UnsignedShort5551) => { - let mut rgba5551 = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - rgba5551.write_u16::((rgba8[0] as u16 & 0xf8) << 8 | - (rgba8[1] as u16 & 0xf8) << 3 | - (rgba8[2] as u16 & 0xf8) >> 2 | - (rgba8[3] as u16) >> 7).unwrap(); + for i in 0..pixel_count { + let p = { + let rgba = &pixels[i * 4..i * 4 + 4]; + (rgba[0] as u16 & 0xf8) << 8 | + (rgba[1] as u16 & 0xf8) << 3 | + (rgba[2] as u16 & 0xf8) >> 2 | + (rgba[3] as u16) >> 7 + }; + NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); } - rgba5551 - } - + pixels.truncate(pixel_count * 2); + pixels + }, (TexFormat::RGB, TexDataType::UnsignedShort565) => { - let mut rgb565 = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - rgb565.write_u16::((rgba8[0] as u16 & 0xf8) << 8 | - (rgba8[1] as u16 & 0xfc) << 3 | - (rgba8[2] as u16 & 0xf8) >> 3).unwrap(); + for i in 0..pixel_count { + let p = { + let rgb = &pixels[i * 4..i * 4 + 3]; + (rgb[0] as u16 & 0xf8) << 8 | + (rgb[1] as u16 & 0xfc) << 3 | + (rgb[2] as u16 & 0xf8) >> 3 + }; + NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); } - rgb565 - } - - + pixels.truncate(pixel_count * 2); + pixels + }, (TexFormat::RGBA, TexDataType::Float) => { let mut rgbaf32 = Vec::::with_capacity(pixel_count * 16); for rgba8 in pixels.chunks(4) { @@ -4151,24 +4164,25 @@ fn rgba8_image_to_tex_image_data( } rgbf16 }, - (TexFormat::Alpha, TexDataType::HalfFloat) => { - let mut alpha = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - alpha.write_u16::(f16::from_f32(rgba8[3] as f32).as_bits()).unwrap(); + for i in 0..pixel_count { + let p = f16::from_f32(pixels[i * 4 + 3] as f32).as_bits(); + NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); } - alpha + pixels.truncate(pixel_count * 2); + pixels }, - (TexFormat::Luminance, TexDataType::HalfFloat) => { - let mut lum = Vec::::with_capacity(pixel_count * 2); - for rgba8 in pixels.chunks(4) { - let p = luminance(rgba8[0], rgba8[1], rgba8[2]); - lum.write_u16::(f16::from_f32(p as f32).as_bits()).unwrap(); + for i in 0..pixel_count { + let p = { + let rgb = &pixels[i * 4..i * 4 + 3]; + f16::from_f32(luminance(rgb[0], rgb[1], rgb[2]) as f32).as_bits() + }; + NativeEndian::write_u16(&mut pixels[i * 2..i * 2 + 2], p); } - lum + pixels.truncate(pixel_count * 2); + pixels }, - (TexFormat::LuminanceAlpha, TexDataType::HalfFloat) => { let mut data = Vec::::with_capacity(pixel_count * 8); for rgba8 in pixels.chunks(4) {