aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglrenderingcontext.rs
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-11-15 15:49:29 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2018-11-16 12:43:19 +0100
commitaf2b4dbc21596b662dcb8c428943422bc0838f4d (patch)
treefa845766ae802cbbba83d5660f1ab76c5c96ae35 /components/script/dom/webglrenderingcontext.rs
parent947e5afa0c5dd374a59b452655c848754dbe2aac (diff)
downloadservo-af2b4dbc21596b662dcb8c428943422bc0838f4d.tar.gz
servo-af2b4dbc21596b662dcb8c428943422bc0838f4d.zip
Pass a TexPixels value to tex_image_2d and tex_sub_image_2d
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r--components/script/dom/webglrenderingcontext.rs91
1 files 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<u32>,
unpacking_alignment: u32,
alpha_treatment: Option<AlphaTreatment>,
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<u8>,
+ 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<u8>,
+ 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<u8>, size: Size2D<u32>) -> Self {
+ Self {
+ data,
+ size,
+ premultiplied: false,
+ }
+ }
}