Pass a TexPixels value to tex_image_2d and tex_sub_image_2d

This commit is contained in:
Anthony Ramine 2018-11-15 15:49:29 +01:00
parent 947e5afa0c
commit af2b4dbc21

View file

@ -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,
}
}
} }