mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Pass a TexPixels value to tex_image_2d and tex_sub_image_2d
This commit is contained in:
parent
947e5afa0c
commit
af2b4dbc21
1 changed files with 39 additions and 52 deletions
|
@ -494,19 +494,19 @@ impl WebGLRenderingContext {
|
||||||
rgba8[3] = 255u8;
|
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(
|
self.tex_image_2d(
|
||||||
texture,
|
texture,
|
||||||
target,
|
target,
|
||||||
data_type,
|
data_type,
|
||||||
format,
|
format,
|
||||||
level,
|
level,
|
||||||
size.width,
|
|
||||||
size.height,
|
|
||||||
0,
|
0,
|
||||||
1,
|
1,
|
||||||
true,
|
|
||||||
TexSource::FromHtmlElement,
|
TexSource::FromHtmlElement,
|
||||||
pixels,
|
TexPixels::new(pixels, size, true),
|
||||||
);
|
);
|
||||||
|
|
||||||
false
|
false
|
||||||
|
@ -642,8 +642,7 @@ impl WebGLRenderingContext {
|
||||||
&self,
|
&self,
|
||||||
internal_format: TexFormat,
|
internal_format: TexFormat,
|
||||||
data_type: TexDataType,
|
data_type: TexDataType,
|
||||||
width: u32,
|
size: Size2D<u32>,
|
||||||
height: u32,
|
|
||||||
unpacking_alignment: u32,
|
unpacking_alignment: u32,
|
||||||
alpha_treatment: Option<AlphaTreatment>,
|
alpha_treatment: Option<AlphaTreatment>,
|
||||||
y_axis_treatment: YAxisTreatment,
|
y_axis_treatment: YAxisTreatment,
|
||||||
|
@ -678,8 +677,8 @@ impl WebGLRenderingContext {
|
||||||
pixels = webgl::flip_pixels_y(
|
pixels = webgl::flip_pixels_y(
|
||||||
internal_format,
|
internal_format,
|
||||||
data_type,
|
data_type,
|
||||||
width as usize,
|
size.width as usize,
|
||||||
height as usize,
|
size.height as usize,
|
||||||
unpacking_alignment as usize,
|
unpacking_alignment as usize,
|
||||||
pixels,
|
pixels,
|
||||||
);
|
);
|
||||||
|
@ -695,18 +694,15 @@ impl WebGLRenderingContext {
|
||||||
data_type: TexDataType,
|
data_type: TexDataType,
|
||||||
internal_format: TexFormat,
|
internal_format: TexFormat,
|
||||||
level: u32,
|
level: u32,
|
||||||
width: u32,
|
|
||||||
height: u32,
|
|
||||||
_border: u32,
|
_border: u32,
|
||||||
unpacking_alignment: u32,
|
unpacking_alignment: u32,
|
||||||
source_premultiplied: bool,
|
|
||||||
tex_source: TexSource,
|
tex_source: TexSource,
|
||||||
pixels: Vec<u8>,
|
pixels: TexPixels,
|
||||||
) {
|
) {
|
||||||
let settings = self.texture_unpacking_settings.get();
|
let settings = self.texture_unpacking_settings.get();
|
||||||
let dest_premultiplied = settings.contains(TextureUnpacking::PREMULTIPLY_ALPHA);
|
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),
|
(true, false) => Some(AlphaTreatment::Unmultiply),
|
||||||
(false, true) => Some(AlphaTreatment::Premultiply),
|
(false, true) => Some(AlphaTreatment::Premultiply),
|
||||||
_ => None,
|
_ => None,
|
||||||
|
@ -718,16 +714,15 @@ impl WebGLRenderingContext {
|
||||||
YAxisTreatment::AsIs
|
YAxisTreatment::AsIs
|
||||||
};
|
};
|
||||||
|
|
||||||
let pixels = self.prepare_pixels(
|
let buff = self.prepare_pixels(
|
||||||
internal_format,
|
internal_format,
|
||||||
data_type,
|
data_type,
|
||||||
width,
|
pixels.size,
|
||||||
height,
|
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
alpha_treatment,
|
alpha_treatment,
|
||||||
y_axis_treatment,
|
y_axis_treatment,
|
||||||
tex_source,
|
tex_source,
|
||||||
pixels,
|
pixels.data,
|
||||||
);
|
);
|
||||||
|
|
||||||
// TexImage2D depth is always equal to 1
|
// TexImage2D depth is always equal to 1
|
||||||
|
@ -735,8 +730,8 @@ impl WebGLRenderingContext {
|
||||||
self,
|
self,
|
||||||
texture.initialize(
|
texture.initialize(
|
||||||
target,
|
target,
|
||||||
width,
|
pixels.size.width,
|
||||||
height,
|
pixels.size.height,
|
||||||
1,
|
1,
|
||||||
internal_format,
|
internal_format,
|
||||||
level,
|
level,
|
||||||
|
@ -756,14 +751,14 @@ impl WebGLRenderingContext {
|
||||||
target: target.as_gl_constant(),
|
target: target.as_gl_constant(),
|
||||||
level,
|
level,
|
||||||
internal_format,
|
internal_format,
|
||||||
width,
|
width: pixels.size.width,
|
||||||
height,
|
height: pixels.size.height,
|
||||||
format,
|
format,
|
||||||
data_type: self.extension_manager.effective_type(data_type),
|
data_type: self.extension_manager.effective_type(data_type),
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
receiver,
|
receiver,
|
||||||
});
|
});
|
||||||
sender.send(&pixels).unwrap();
|
sender.send(&buff).unwrap();
|
||||||
|
|
||||||
if let Some(fb) = self.bound_framebuffer.get() {
|
if let Some(fb) = self.bound_framebuffer.get() {
|
||||||
fb.invalidate_texture(&*texture);
|
fb.invalidate_texture(&*texture);
|
||||||
|
@ -777,19 +772,16 @@ impl WebGLRenderingContext {
|
||||||
level: u32,
|
level: u32,
|
||||||
xoffset: i32,
|
xoffset: i32,
|
||||||
yoffset: i32,
|
yoffset: i32,
|
||||||
width: u32,
|
|
||||||
height: u32,
|
|
||||||
format: TexFormat,
|
format: TexFormat,
|
||||||
data_type: TexDataType,
|
data_type: TexDataType,
|
||||||
unpacking_alignment: u32,
|
unpacking_alignment: u32,
|
||||||
source_premultiplied: bool,
|
|
||||||
tex_source: TexSource,
|
tex_source: TexSource,
|
||||||
pixels: Vec<u8>,
|
pixels: TexPixels,
|
||||||
) {
|
) {
|
||||||
let settings = self.texture_unpacking_settings.get();
|
let settings = self.texture_unpacking_settings.get();
|
||||||
|
|
||||||
let alpha_treatment = match (
|
let alpha_treatment = match (
|
||||||
source_premultiplied,
|
pixels.premultiplied,
|
||||||
settings.contains(TextureUnpacking::PREMULTIPLY_ALPHA),
|
settings.contains(TextureUnpacking::PREMULTIPLY_ALPHA),
|
||||||
) {
|
) {
|
||||||
(true, false) => Some(AlphaTreatment::Unmultiply),
|
(true, false) => Some(AlphaTreatment::Unmultiply),
|
||||||
|
@ -803,16 +795,15 @@ impl WebGLRenderingContext {
|
||||||
YAxisTreatment::AsIs
|
YAxisTreatment::AsIs
|
||||||
};
|
};
|
||||||
|
|
||||||
let pixels = self.prepare_pixels(
|
let buff = self.prepare_pixels(
|
||||||
format,
|
format,
|
||||||
data_type,
|
data_type,
|
||||||
width,
|
pixels.size,
|
||||||
height,
|
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
alpha_treatment,
|
alpha_treatment,
|
||||||
y_axis_treatment,
|
y_axis_treatment,
|
||||||
tex_source,
|
tex_source,
|
||||||
pixels,
|
pixels.data,
|
||||||
);
|
);
|
||||||
|
|
||||||
// We have already validated level
|
// We have already validated level
|
||||||
|
@ -823,9 +814,9 @@ impl WebGLRenderingContext {
|
||||||
// - x offset plus the width is greater than the texture width
|
// - x offset plus the width is greater than the texture width
|
||||||
// - y offset plus the height is greater than the texture height
|
// - y offset plus the height is greater than the texture height
|
||||||
if xoffset < 0 ||
|
if xoffset < 0 ||
|
||||||
(xoffset as u32 + width) > image_info.width() ||
|
(xoffset as u32 + pixels.size.width) > image_info.width() ||
|
||||||
yoffset < 0 ||
|
yoffset < 0 ||
|
||||||
(yoffset as u32 + height) > image_info.height()
|
(yoffset as u32 + pixels.size.height) > image_info.height()
|
||||||
{
|
{
|
||||||
return self.webgl_error(InvalidValue);
|
return self.webgl_error(InvalidValue);
|
||||||
}
|
}
|
||||||
|
@ -844,8 +835,8 @@ impl WebGLRenderingContext {
|
||||||
level,
|
level,
|
||||||
xoffset,
|
xoffset,
|
||||||
yoffset,
|
yoffset,
|
||||||
width,
|
width: pixels.size.width,
|
||||||
height,
|
height: pixels.size.height,
|
||||||
format: format.as_gl_constant(),
|
format: format.as_gl_constant(),
|
||||||
data_type: self
|
data_type: self
|
||||||
.extension_manager
|
.extension_manager
|
||||||
|
@ -853,7 +844,7 @@ impl WebGLRenderingContext {
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
receiver,
|
receiver,
|
||||||
});
|
});
|
||||||
sender.send(&pixels).unwrap();
|
sender.send(&buff).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_gl_extensions(&self) -> String {
|
fn get_gl_extensions(&self) -> String {
|
||||||
|
@ -3713,13 +3704,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
data_type,
|
data_type,
|
||||||
format,
|
format,
|
||||||
level,
|
level,
|
||||||
width,
|
|
||||||
height,
|
|
||||||
border,
|
border,
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
false,
|
|
||||||
TexSource::FromArray,
|
TexSource::FromArray,
|
||||||
buff,
|
TexPixels::from_array(buff, Size2D::new(width, height)),
|
||||||
);
|
);
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -3788,13 +3776,10 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
data_type,
|
data_type,
|
||||||
format,
|
format,
|
||||||
level,
|
level,
|
||||||
pixels.size.width,
|
|
||||||
pixels.size.height,
|
|
||||||
border,
|
border,
|
||||||
1,
|
1,
|
||||||
pixels.premultiplied,
|
|
||||||
TexSource::FromHtmlElement,
|
TexSource::FromHtmlElement,
|
||||||
pixels.data,
|
pixels,
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -3923,14 +3908,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
level,
|
level,
|
||||||
xoffset,
|
xoffset,
|
||||||
yoffset,
|
yoffset,
|
||||||
width,
|
|
||||||
height,
|
|
||||||
format,
|
format,
|
||||||
data_type,
|
data_type,
|
||||||
unpacking_alignment,
|
unpacking_alignment,
|
||||||
false,
|
|
||||||
TexSource::FromArray,
|
TexSource::FromArray,
|
||||||
buff,
|
TexPixels::from_array(buff, Size2D::new(width, height)),
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -3980,14 +3962,11 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
|
||||||
level,
|
level,
|
||||||
xoffset,
|
xoffset,
|
||||||
yoffset,
|
yoffset,
|
||||||
pixels.size.width,
|
|
||||||
pixels.size.height,
|
|
||||||
format,
|
format,
|
||||||
data_type,
|
data_type,
|
||||||
1,
|
1,
|
||||||
pixels.premultiplied,
|
|
||||||
TexSource::FromHtmlElement,
|
TexSource::FromHtmlElement,
|
||||||
pixels.data,
|
pixels,
|
||||||
);
|
);
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
@ -4283,4 +4262,12 @@ impl TexPixels {
|
||||||
premultiplied,
|
premultiplied,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn from_array(data: Vec<u8>, size: Size2D<u32>) -> Self {
|
||||||
|
Self {
|
||||||
|
data,
|
||||||
|
size,
|
||||||
|
premultiplied: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue