aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/htmlcanvaselement.rs
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2015-09-19 17:32:50 +0200
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2015-09-25 16:20:31 +0200
commite2b7a01055b67eed1711b8e2946fadaffbe58542 (patch)
tree49491bf1874bd8d1d715c0d8b250a3b4c1ce8b23 /components/script/dom/htmlcanvaselement.rs
parenta58e731abdba7220a9c13e10c9cca47667a73271 (diff)
downloadservo-e2b7a01055b67eed1711b8e2946fadaffbe58542.tar.gz
servo-e2b7a01055b67eed1711b8e2946fadaffbe58542.zip
webgl: texImage2D with a canvas argument
Diffstat (limited to 'components/script/dom/htmlcanvaselement.rs')
-rw-r--r--components/script/dom/htmlcanvaselement.rs36
1 files changed, 34 insertions, 2 deletions
diff --git a/components/script/dom/htmlcanvaselement.rs b/components/script/dom/htmlcanvaselement.rs
index 3c254ffa330..8cd254b4fe8 100644
--- a/components/script/dom/htmlcanvaselement.rs
+++ b/components/script/dom/htmlcanvaselement.rs
@@ -2,7 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-use canvas_traits::CanvasMsg;
+use canvas_traits::{CanvasMsg, FromLayoutMsg};
use dom::attr::Attr;
use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding;
use dom::bindings::codegen::Bindings::HTMLCanvasElementBinding::HTMLCanvasElementMethods;
@@ -22,7 +22,7 @@ use dom::node::{Node, NodeTypeId, window_from_node};
use dom::virtualmethods::VirtualMethods;
use dom::webglrenderingcontext::{LayoutCanvasWebGLRenderingContextHelpers, WebGLRenderingContext};
use euclid::size::Size2D;
-use ipc_channel::ipc::IpcSender;
+use ipc_channel::ipc::{self, IpcSender};
use js::jsapi::{HandleValue, JSContext};
use offscreen_gl_context::GLContextAttributes;
use std::cell::Cell;
@@ -150,6 +150,17 @@ impl LayoutHTMLCanvasElementHelpers for LayoutJS<HTMLCanvasElement> {
impl HTMLCanvasElement {
+ pub fn ipc_renderer(&self) -> Option<IpcSender<CanvasMsg>> {
+ if let Some(context) = self.context.get() {
+ match context {
+ CanvasContext::Context2d(context) => Some(context.root().r().ipc_renderer()),
+ CanvasContext::WebGL(context) => Some(context.root().r().ipc_renderer()),
+ }
+ } else {
+ None
+ }
+ }
+
pub fn get_or_init_2d_context(&self) -> Option<Root<CanvasRenderingContext2D>> {
if self.context.get().is_none() {
let window = window_from_node(self);
@@ -200,6 +211,27 @@ impl HTMLCanvasElement {
pub fn is_valid(&self) -> bool {
self.height.get() != 0 && self.width.get() != 0
}
+
+ pub fn fetch_all_data(&self) -> Option<(Vec<u8>, Size2D<i32>)> {
+ let size = self.get_size();
+
+ if size.width == 0 || size.height == 0 {
+ return None
+ }
+
+ let renderer = match self.ipc_renderer() {
+ Some(renderer) => renderer,
+ None => return None,
+ };
+
+ let (sender, receiver) = ipc::channel().unwrap();
+ let msg = CanvasMsg::FromLayout(FromLayoutMsg::SendPixelContents(sender));
+ renderer.send(msg).unwrap();
+
+ let data = receiver.recv().unwrap().to_vec();
+
+ Some((data, size))
+ }
}
impl HTMLCanvasElementMethods for HTMLCanvasElement {