From af2b4dbc21596b662dcb8c428943422bc0838f4d Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Thu, 15 Nov 2018 15:49:29 +0100 Subject: [PATCH] Pass a TexPixels value to tex_image_2d and tex_sub_image_2d --- .../script/dom/webglrenderingcontext.rs | 91 ++++++++----------- 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index 8a96fe1dcca..a21d3898112 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -494,19 +494,19 @@ impl WebGLRenderingContext { rgba8[3] = 255u8; } + // TODO(nox): AFAICT here we construct a RGBA8 array and then we + // convert it to whatever actual format we need, we should probably + // construct the desired format from the start. self.tex_image_2d( texture, target, data_type, format, level, - size.width, - size.height, 0, 1, - true, TexSource::FromHtmlElement, - pixels, + TexPixels::new(pixels, size, true), ); false @@ -642,8 +642,7 @@ impl WebGLRenderingContext { &self, internal_format: TexFormat, data_type: TexDataType, - width: u32, - height: u32, + size: Size2D, unpacking_alignment: u32, alpha_treatment: Option, y_axis_treatment: YAxisTreatment, @@ -678,8 +677,8 @@ impl WebGLRenderingContext { pixels = webgl::flip_pixels_y( internal_format, data_type, - width as usize, - height as usize, + size.width as usize, + size.height as usize, unpacking_alignment as usize, pixels, ); @@ -695,18 +694,15 @@ impl WebGLRenderingContext { data_type: TexDataType, internal_format: TexFormat, level: u32, - width: u32, - height: u32, _border: u32, unpacking_alignment: u32, - source_premultiplied: bool, tex_source: TexSource, - pixels: Vec, + pixels: TexPixels, ) { let settings = self.texture_unpacking_settings.get(); let dest_premultiplied = settings.contains(TextureUnpacking::PREMULTIPLY_ALPHA); - let alpha_treatment = match (source_premultiplied, dest_premultiplied) { + let alpha_treatment = match (pixels.premultiplied, dest_premultiplied) { (true, false) => Some(AlphaTreatment::Unmultiply), (false, true) => Some(AlphaTreatment::Premultiply), _ => None, @@ -718,16 +714,15 @@ impl WebGLRenderingContext { YAxisTreatment::AsIs }; - let pixels = self.prepare_pixels( + let buff = self.prepare_pixels( internal_format, data_type, - width, - height, + pixels.size, unpacking_alignment, alpha_treatment, y_axis_treatment, tex_source, - pixels, + pixels.data, ); // TexImage2D depth is always equal to 1 @@ -735,8 +730,8 @@ impl WebGLRenderingContext { self, texture.initialize( target, - width, - height, + pixels.size.width, + pixels.size.height, 1, internal_format, level, @@ -756,14 +751,14 @@ impl WebGLRenderingContext { target: target.as_gl_constant(), level, internal_format, - width, - height, + width: pixels.size.width, + height: pixels.size.height, format, data_type: self.extension_manager.effective_type(data_type), unpacking_alignment, receiver, }); - sender.send(&pixels).unwrap(); + sender.send(&buff).unwrap(); if let Some(fb) = self.bound_framebuffer.get() { fb.invalidate_texture(&*texture); @@ -777,19 +772,16 @@ impl WebGLRenderingContext { level: u32, xoffset: i32, yoffset: i32, - width: u32, - height: u32, format: TexFormat, data_type: TexDataType, unpacking_alignment: u32, - source_premultiplied: bool, tex_source: TexSource, - pixels: Vec, + pixels: TexPixels, ) { let settings = self.texture_unpacking_settings.get(); let alpha_treatment = match ( - source_premultiplied, + pixels.premultiplied, settings.contains(TextureUnpacking::PREMULTIPLY_ALPHA), ) { (true, false) => Some(AlphaTreatment::Unmultiply), @@ -803,16 +795,15 @@ impl WebGLRenderingContext { YAxisTreatment::AsIs }; - let pixels = self.prepare_pixels( + let buff = self.prepare_pixels( format, data_type, - width, - height, + pixels.size, unpacking_alignment, alpha_treatment, y_axis_treatment, tex_source, - pixels, + pixels.data, ); // We have already validated level @@ -823,9 +814,9 @@ impl WebGLRenderingContext { // - x offset plus the width is greater than the texture width // - y offset plus the height is greater than the texture height if xoffset < 0 || - (xoffset as u32 + width) > image_info.width() || + (xoffset as u32 + pixels.size.width) > image_info.width() || yoffset < 0 || - (yoffset as u32 + height) > image_info.height() + (yoffset as u32 + pixels.size.height) > image_info.height() { return self.webgl_error(InvalidValue); } @@ -844,8 +835,8 @@ impl WebGLRenderingContext { level, xoffset, yoffset, - width, - height, + width: pixels.size.width, + height: pixels.size.height, format: format.as_gl_constant(), data_type: self .extension_manager @@ -853,7 +844,7 @@ impl WebGLRenderingContext { unpacking_alignment, receiver, }); - sender.send(&pixels).unwrap(); + sender.send(&buff).unwrap(); } fn get_gl_extensions(&self) -> String { @@ -3713,13 +3704,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { data_type, format, level, - width, - height, border, unpacking_alignment, - false, TexSource::FromArray, - buff, + TexPixels::from_array(buff, Size2D::new(width, height)), ); Ok(()) @@ -3788,13 +3776,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { data_type, format, level, - pixels.size.width, - pixels.size.height, border, 1, - pixels.premultiplied, TexSource::FromHtmlElement, - pixels.data, + pixels, ); Ok(()) } @@ -3923,14 +3908,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { level, xoffset, yoffset, - width, - height, format, data_type, unpacking_alignment, - false, TexSource::FromArray, - buff, + TexPixels::from_array(buff, Size2D::new(width, height)), ); Ok(()) } @@ -3980,14 +3962,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { level, xoffset, yoffset, - pixels.size.width, - pixels.size.height, format, data_type, 1, - pixels.premultiplied, TexSource::FromHtmlElement, - pixels.data, + pixels, ); Ok(()) } @@ -4283,4 +4262,12 @@ impl TexPixels { premultiplied, } } + + fn from_array(data: Vec, size: Size2D) -> Self { + Self { + data, + size, + premultiplied: false, + } + } }