aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlcanvaselement.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/htmlcanvaselement.rs')
-rw-r--r--components/script/dom/htmlcanvaselement.rs66
1 files changed, 31 insertions, 35 deletions
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index a95ff766171..3d89c08b230 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -3,7 +3,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use base64;
-use canvas_traits::{CanvasMsg, FromScriptMsg};
+use canvas_traits::canvas::{CanvasMsg, FromScriptMsg};
use dom::attr::Attr;
use dom::bindings::cell::DOMRefCell;
use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods;
@@ -30,11 +30,11 @@ use euclid::Size2D;
use html5ever::{LocalName, Prefix};
use image::ColorType;
use image::png::PNGEncoder;
-use ipc_channel::ipc::{self, IpcSender};
+use ipc_channel::ipc;
use js::error::throw_type_error;
use js::jsapi::{HandleValue, JSContext};
use offscreen_gl_context::GLContextAttributes;
-use script_layout_interface::HTMLCanvasData;
+use script_layout_interface::{HTMLCanvasData, HTMLCanvasDataSource};
use std::iter::repeat;
use style::attr::{AttrValue, LengthOrPercentageOrAuto};
@@ -106,21 +106,22 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
fn data(&self) -> HTMLCanvasData {
unsafe {
let canvas = &*self.unsafe_get();
- let ipc_renderer = canvas.context.borrow_for_layout().as_ref().map(|context| {
- match *context {
- CanvasContext::Context2d(ref context) => {
- context.to_layout().get_ipc_renderer()
- },
- CanvasContext::WebGL(ref context) => {
- context.to_layout().get_ipc_renderer()
- },
+ let source = match canvas.context.borrow_for_layout().as_ref() {
+ Some(&CanvasContext::Context2d(ref context)) => {
+ HTMLCanvasDataSource::Image(Some(context.to_layout().get_ipc_renderer()))
+ },
+ Some(&CanvasContext::WebGL(ref context)) => {
+ context.to_layout().canvas_data_source()
+ },
+ None => {
+ HTMLCanvasDataSource::Image(None)
}
- });
+ };
let width_attr = canvas.upcast::<Element>().get_attr_for_layout(&ns!(), &local_name!("width"));
let height_attr = canvas.upcast::<Element>().get_attr_for_layout(&ns!(), &local_name!("height"));
HTMLCanvasData {
- ipc_renderer: ipc_renderer,
+ source: source,
width: width_attr.map_or(DEFAULT_WIDTH, |val| val.as_uint()),
height: height_attr.map_or(DEFAULT_HEIGHT, |val| val.as_uint()),
}
@@ -150,15 +151,6 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
impl HTMLCanvasElement {
- pub fn ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
- self.context.borrow().as_ref().map(|context| {
- match *context {
- CanvasContext::Context2d(ref context) => context.ipc_renderer(),
- CanvasContext::WebGL(ref context) => context.ipc_renderer(),
- }
- })
- }
-
pub fn get_or_init_2d_context(&self) -> Option<Root<CanvasRenderingContext2D>> {
if self.context.borrow().is_none() {
let window = window_from_node(self);
@@ -221,22 +213,26 @@ impl HTMLCanvasElement {
return None
}
- let data = if let Some(renderer) = self.ipc_renderer() {
- let (sender, receiver) = ipc::channel().unwrap();
- let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
- renderer.send(msg).unwrap();
+ let data = match self.context.borrow().as_ref() {
+ Some(&CanvasContext::Context2d(ref context)) => {
+ let (sender, receiver) = ipc::channel().unwrap();
+ let msg = CanvasMsg::FromScript(FromScriptMsg::SendPixels(sender));
+ context.get_ipc_renderer().send(msg).unwrap();
- match receiver.recv().unwrap() {
- Some(pixels) => pixels,
- None => {
- // TODO(emilio, #14109): Not sure if WebGL canvas is
- // required for 2d spec, but I think it's not, if so, make
- // this return a readback from the GL context.
- return None;
+ match receiver.recv().unwrap() {
+ Some(pixels) => pixels,
+ None => {
+ return None;
+ }
}
+ },
+ Some(&CanvasContext::WebGL(_)) => {
+ // TODO: add a method in WebGLRenderingContext to get the pixels.
+ return None;
+ },
+ None => {
+ repeat(0xffu8).take((size.height as usize) * (size.width as usize) * 4).collect()
}
- } else {
- repeat(0xffu8).take((size.height as usize) * (size.width as usize) * 4).collect()
};
Some((data, size))