mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
Introduce TexPixels
This commit is contained in:
parent
1e2a72abfe
commit
86987ed75d
1 changed files with 69 additions and 41 deletions
|
@ -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,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue