diff options
author | Anthony Ramine <n.oxyde@gmail.com> | 2018-11-09 11:01:15 +0100 |
---|---|---|
committer | Anthony Ramine <n.oxyde@gmail.com> | 2018-11-16 12:18:22 +0100 |
commit | 86987ed75d94ddf8079dccf405073ee3a70bb1e6 (patch) | |
tree | 2964a5ea9d957d67cf59939fbbb9b7877b08654c /components/script/dom/webglrenderingcontext.rs | |
parent | 1e2a72abfe0d5183a95c7edfa92e531dadd488b0 (diff) | |
download | servo-86987ed75d94ddf8079dccf405073ee3a70bb1e6.tar.gz servo-86987ed75d94ddf8079dccf405073ee3a70bb1e6.zip |
Introduce TexPixels
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r-- | components/script/dom/webglrenderingcontext.rs | 110 |
1 files changed, 69 insertions, 41 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs index a1bdcf7f311..346d8905082 100644 --- a/components/script/dom/webglrenderingcontext.rs +++ b/components/script/dom/webglrenderingcontext.rs @@ -429,8 +429,7 @@ impl WebGLRenderingContext { target, 0, info.internal_format().unwrap_or(TexFormat::RGBA), - info.width(), - info.height(), + Size2D::new(info.width(), info.height()), info.data_type().unwrap_or(TexDataType::UnsignedByte), ); } @@ -475,8 +474,7 @@ impl WebGLRenderingContext { target: TexImageTarget, level: u32, format: TexFormat, - width: u32, - height: u32, + size: Size2D<u32>, data_type: TexDataType, ) -> bool { if self @@ -490,14 +488,25 @@ impl WebGLRenderingContext { // Handle validation failed: LINEAR filtering not valid for this texture // WebGL Conformance tests expect to fallback to [0, 0, 0, 255] RGBA UNSIGNED_BYTE let data_type = TexDataType::UnsignedByte; - let expected_byte_length = width * height * 4; + let expected_byte_length = size.area() * 4; let mut pixels = vec![0u8; expected_byte_length as usize]; for rgba8 in pixels.chunks_mut(4) { rgba8[3] = 255u8; } self.tex_image_2d( - texture, target, data_type, format, level, width, height, 0, 1, true, true, pixels, + texture, + target, + data_type, + format, + level, + size.width, + size.height, + 0, + 1, + true, + true, + pixels, ); false @@ -517,13 +526,10 @@ impl WebGLRenderingContext { } } - fn get_image_pixels( - &self, - source: TexImageSource, - ) -> Fallible<Option<(Vec<u8>, Size2D<u32>, bool)>> { + fn get_image_pixels(&self, source: TexImageSource) -> Fallible<Option<TexPixels>> { Ok(Some(match source { TexImageSource::ImageData(image_data) => { - (image_data.to_vec(), image_data.get_size(), false) + TexPixels::new(image_data.to_vec(), image_data.get_size(), false) }, TexImageSource::HTMLImageElement(image) => { let document = document_from_node(&*self.canvas); @@ -555,7 +561,7 @@ impl WebGLRenderingContext { pixels::byte_swap_colors_inplace(&mut data); - (data, size, false) + TexPixels::new(data, size, false) }, // TODO(emilio): Getting canvas data is implemented in CanvasRenderingContext2D, // but we need to refactor it moving it to `HTMLCanvasElement` and support @@ -567,7 +573,7 @@ impl WebGLRenderingContext { if let Some((mut data, size)) = canvas.fetch_all_data() { // Pixels got from Canvas have already alpha premultiplied pixels::byte_swap_colors_inplace(&mut data); - (data, size, true) + TexPixels::new(data, size, true) } else { return Ok(None); } @@ -3752,10 +3758,12 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { return Ok(self.webgl_error(InvalidOperation)); } - if !self - .validate_filterable_texture(&texture, target, level, format, width, height, data_type) - { - return Ok(()); // The validator sets the correct error for use + let size = Size2D::new(width, height); + + if !self.validate_filterable_texture(&texture, target, level, format, size, data_type) { + // FIXME(nox): What is the spec for this? No error is emitted ever + // by validate_filterable_texture. + return Ok(()); } self.tex_image_2d( @@ -3790,8 +3798,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { return Ok(self.webgl_error(InvalidEnum)); } - let (pixels, size, premultiplied) = match self.get_image_pixels(source)? { - Some(triple) => triple, + let pixels = match self.get_image_pixels(source)? { + Some(pixels) => pixels, None => return Ok(()), }; @@ -3800,8 +3808,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { target, level, internal_format, - size.width as i32, - size.height as i32, + pixels.size.width as i32, + pixels.size.height as i32, 0, format, data_type, @@ -3810,21 +3818,27 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { let TexImage2DValidatorResult { texture, target, - width, - height, level, border, format, data_type, + .. } = match validator.validate() { Ok(result) => result, Err(_) => return Ok(()), // NB: The validator sets the correct error for us. }; - if !self - .validate_filterable_texture(&texture, target, level, format, width, height, data_type) - { - return Ok(()); // The validator sets the correct error for use + if !self.validate_filterable_texture( + &texture, + target, + level, + format, + pixels.size, + data_type, + ) { + // FIXME(nox): What is the spec for this? No error is emitted ever + // by validate_filterable_texture. + return Ok(()); } self.tex_image_2d( @@ -3833,13 +3847,13 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { data_type, format, level, - width, - height, + pixels.size.width, + pixels.size.height, border, 1, - premultiplied, + pixels.premultiplied, true, - pixels, + pixels.data, ); Ok(()) } @@ -3991,8 +4005,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { data_type: u32, source: TexImageSource, ) -> ErrorResult { - let (pixels, size, premultiplied) = match self.get_image_pixels(source)? { - Some(triple) => triple, + let pixels = match self.get_image_pixels(source)? { + Some(pixels) => pixels, None => return Ok(()), }; @@ -4001,8 +4015,8 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { target, level, format, - size.width as i32, - size.height as i32, + pixels.size.width as i32, + pixels.size.height as i32, 0, format, data_type, @@ -4010,8 +4024,6 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { let TexImage2DValidatorResult { texture, target, - width, - height, level, format, data_type, @@ -4027,14 +4039,14 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext { level, xoffset, yoffset, - width, - height, + pixels.size.width, + pixels.size.height, format, data_type, 1, - premultiplied, + pixels.premultiplied, true, - pixels, + pixels.data, ); Ok(()) } @@ -4543,3 +4555,19 @@ fn rgba8_image_to_tex_image_data( _ => unreachable!("Unsupported formats {:?} {:?}", format, data_type), } } + +struct TexPixels { + data: Vec<u8>, + size: Size2D<u32>, + premultiplied: bool, +} + +impl TexPixels { + fn new(data: Vec<u8>, size: Size2D<u32>, premultiplied: bool) -> Self { + Self { + data, + size, + premultiplied, + } + } +} |