diff options
author | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2015-09-19 17:32:50 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <ecoal95@gmail.com> | 2015-09-25 16:20:31 +0200 |
commit | e2b7a01055b67eed1711b8e2946fadaffbe58542 (patch) | |
tree | 49491bf1874bd8d1d715c0d8b250a3b4c1ce8b23 /components/script/dom/htmlcanvaselement.rs | |
parent | a58e731abdba7220a9c13e10c9cca47667a73271 (diff) | |
download | servo-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.rs | 36 |
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 { |