aboutsummaryrefslogtreecommitdiffstats
path: root/components/script
diff options
context:
space:
mode:
authorAnthony Ramine <n.oxyde@gmail.com>2018-11-19 11:17:00 +0100
committerAnthony Ramine <n.oxyde@gmail.com>2018-11-20 10:14:52 +0100
commitcfca906ee2325fad74896b7647db26625099cf66 (patch)
tree30d1955ab21e63b1c2994a1a8773e2aa765fc9e4 /components/script
parent2c0acf6b9bf2c4082dfbd98763cd21de7ae56449 (diff)
downloadservo-cfca906ee2325fad74896b7647db26625099cf66.tar.gz
servo-cfca906ee2325fad74896b7647db26625099cf66.zip
Call rgba8_byte_swap_colors_inplace on the WebGL thread
Diffstat (limited to 'components/script')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs4
-rw-r--r--components/script/dom/webglrenderingcontext.rs73
2 files changed, 27 insertions, 50 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index b9377a654fe..4840966dfb4 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -444,9 +444,7 @@ impl CanvasRenderingContext2D {
let image_size = Size2D::new(img.width, img.height);
let image_data = match img.format {
PixelFormat::BGRA8 => img.bytes.to_vec(),
- PixelFormat::K8 => panic!("K8 color type not supported"),
- PixelFormat::RGB8 => panic!("RGB8 color type not supported"),
- PixelFormat::KA8 => panic!("KA8 color type not supported"),
+ pixel_format => unimplemented!("unsupported pixel format ({:?})", pixel_format),
};
Some((image_data, image_size))
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
index d63fa9b8017..49d3a9d05ff 100644
--- a/components/script/dom/webglrenderingcontext.rs
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -7,9 +7,9 @@ use backtrace::Backtrace;
use canvas_traits::webgl::WebGLError::*;
use canvas_traits::webgl::{
webgl_channel, AlphaTreatment, DOMToTextureCommand, Parameter, TexDataType, TexFormat,
- TexParameter, TexSource, WebGLCommand, WebGLCommandBacktrace, WebGLContextShareMode,
- WebGLError, WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender, WebGLProgramId,
- WebGLResult, WebGLSLVersion, WebGLSender, WebGLVersion, WebVRCommand, YAxisTreatment,
+ TexParameter, WebGLCommand, WebGLCommandBacktrace, WebGLContextShareMode, WebGLError,
+ WebGLFramebufferBindingRequest, WebGLMsg, WebGLMsgSender, WebGLProgramId, WebGLResult,
+ WebGLSLVersion, WebGLSender, WebGLVersion, WebVRCommand, YAxisTreatment,
};
use crate::dom::bindings::codegen::Bindings::ANGLEInstancedArraysBinding::ANGLEInstancedArraysConstants;
use crate::dom::bindings::codegen::Bindings::EXTBlendMinmaxBinding::EXTBlendMinmaxConstants;
@@ -504,8 +504,7 @@ impl WebGLRenderingContext {
level,
0,
1,
- TexSource::FromHtmlElement,
- TexPixels::new(pixels, size, true),
+ TexPixels::new(pixels, size, PixelFormat::RGBA8, true),
);
false
@@ -527,9 +526,12 @@ impl WebGLRenderingContext {
fn get_image_pixels(&self, source: TexImageSource) -> Fallible<Option<TexPixels>> {
Ok(Some(match source {
- TexImageSource::ImageData(image_data) => {
- TexPixels::new(image_data.to_vec(), image_data.get_size(), false)
- },
+ TexImageSource::ImageData(image_data) => TexPixels::new(
+ image_data.to_vec(),
+ image_data.get_size(),
+ PixelFormat::RGBA8,
+ false,
+ ),
TexImageSource::HTMLImageElement(image) => {
let document = document_from_node(&*self.canvas);
if !image.same_origin(document.origin()) {
@@ -552,15 +554,7 @@ impl WebGLRenderingContext {
let size = Size2D::new(img.width, img.height);
- // For now Servo's images are all stored as BGRA8 internally.
- let mut data = match img.format {
- PixelFormat::BGRA8 => img.bytes.to_vec(),
- _ => unimplemented!(),
- };
-
- pixels::rgba8_byte_swap_colors_inplace(&mut data);
-
- TexPixels::new(data, size, false)
+ TexPixels::new(img.bytes.to_vec(), size, img.format, false)
},
// TODO(emilio): Getting canvas data is implemented in CanvasRenderingContext2D,
// but we need to refactor it moving it to `HTMLCanvasElement` and support
@@ -569,10 +563,8 @@ impl WebGLRenderingContext {
if !canvas.origin_is_clean() {
return Err(Error::Security);
}
- if let Some((mut data, size)) = canvas.fetch_all_data() {
- // Pixels got from Canvas have already alpha premultiplied
- pixels::rgba8_byte_swap_colors_inplace(&mut data);
- TexPixels::new(data, size, true)
+ if let Some((data, size)) = canvas.fetch_all_data() {
+ TexPixels::new(data, size, PixelFormat::BGRA8, true)
} else {
return Ok(None);
}
@@ -646,7 +638,6 @@ impl WebGLRenderingContext {
level: u32,
_border: u32,
unpacking_alignment: u32,
- tex_source: TexSource,
pixels: TexPixels,
) {
// TexImage2D depth is always equal to 1.
@@ -698,7 +689,7 @@ impl WebGLRenderingContext {
unpacking_alignment,
alpha_treatment,
y_axis_treatment,
- tex_source,
+ pixel_format: pixels.pixel_format,
receiver,
});
sender.send(&pixels.data).unwrap();
@@ -718,7 +709,6 @@ impl WebGLRenderingContext {
format: TexFormat,
data_type: TexDataType,
unpacking_alignment: u32,
- tex_source: TexSource,
pixels: TexPixels,
) {
// We have already validated level
@@ -776,7 +766,7 @@ impl WebGLRenderingContext {
unpacking_alignment,
alpha_treatment,
y_axis_treatment,
- tex_source,
+ pixel_format: pixels.pixel_format,
receiver,
});
sender.send(&pixels.data).unwrap();
@@ -3649,7 +3639,6 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
level,
border,
unpacking_alignment,
- TexSource::FromArray,
TexPixels::from_array(buff, Size2D::new(width, height)),
);
@@ -3714,15 +3703,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
}
self.tex_image_2d(
- &texture,
- target,
- data_type,
- format,
- level,
- border,
- 1,
- TexSource::FromHtmlElement,
- pixels,
+ &texture, target, data_type, format, level, border, 1, pixels,
);
Ok(())
}
@@ -3854,7 +3835,6 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
format,
data_type,
unpacking_alignment,
- TexSource::FromArray,
TexPixels::from_array(buff, Size2D::new(width, height)),
);
Ok(())
@@ -3900,16 +3880,7 @@ impl WebGLRenderingContextMethods for WebGLRenderingContext {
};
self.tex_sub_image_2d(
- texture,
- target,
- level,
- xoffset,
- yoffset,
- format,
- data_type,
- 1,
- TexSource::FromHtmlElement,
- pixels,
+ texture, target, level, xoffset, yoffset, format, data_type, 1, pixels,
);
Ok(())
}
@@ -4194,14 +4165,21 @@ impl TextureUnit {
struct TexPixels {
data: Vec<u8>,
size: Size2D<u32>,
+ pixel_format: Option<PixelFormat>,
premultiplied: bool,
}
impl TexPixels {
- fn new(data: Vec<u8>, size: Size2D<u32>, premultiplied: bool) -> Self {
+ fn new(
+ data: Vec<u8>,
+ size: Size2D<u32>,
+ pixel_format: PixelFormat,
+ premultiplied: bool,
+ ) -> Self {
Self {
data,
size,
+ pixel_format: Some(pixel_format),
premultiplied,
}
}
@@ -4210,6 +4188,7 @@ impl TexPixels {
Self {
data,
size,
+ pixel_format: None,
premultiplied: false,
}
}