aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/webglrenderingcontext.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/webglrenderingcontext.rs')
-rw-r--r--components/script/dom/webglrenderingcontext.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/components/script/dom/webglrenderingcontext.rs b/components/script/dom/webglrenderingcontext.rs
new file mode 100644
index 00000000000..07c47970476
--- /dev/null
+++ b/components/script/dom/webglrenderingcontext.rs
@@ -0,0 +1,75 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * 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::webgl_paint_task::WebGLPaintTask;
+use canvas::canvas_msg::{CanvasMsg, CanvasWebGLMsg, CanvasCommonMsg};
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding;
+use dom::bindings::codegen::Bindings::WebGLRenderingContextBinding::WebGLRenderingContextMethods;
+use dom::bindings::global::{GlobalRef, GlobalField};
+use dom::bindings::js::{JS, JSRef, LayoutJS, Temporary};
+use dom::bindings::utils::{Reflector, reflect_dom_object};
+use dom::htmlcanvaselement::{HTMLCanvasElement};
+use geom::size::Size2D;
+use std::sync::mpsc::{Sender};
+
+#[dom_struct]
+pub struct WebGLRenderingContext {
+ reflector_: Reflector,
+ global: GlobalField,
+ renderer: Sender<CanvasMsg>,
+ canvas: JS<HTMLCanvasElement>,
+}
+
+impl WebGLRenderingContext {
+ fn new_inherited(global: GlobalRef, canvas: JSRef<HTMLCanvasElement>, size: Size2D<i32>)
+ -> WebGLRenderingContext {
+ WebGLRenderingContext {
+ reflector_: Reflector::new(),
+ global: GlobalField::from_rooted(&global),
+ renderer: WebGLPaintTask::start(size),
+ canvas: JS::from_rooted(canvas),
+ }
+ }
+
+ pub fn new(global: GlobalRef, canvas: JSRef<HTMLCanvasElement>, size: Size2D<i32>)
+ -> Temporary<WebGLRenderingContext> {
+ reflect_dom_object(box WebGLRenderingContext::new_inherited(global, canvas, size),
+ global, WebGLRenderingContextBinding::Wrap)
+ }
+
+ pub fn recreate(&self, size: Size2D<i32>) {
+ self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Recreate(size))).unwrap();
+ }
+
+}
+
+#[unsafe_destructor]
+impl Drop for WebGLRenderingContext {
+ fn drop(&mut self) {
+ self.renderer.send(CanvasMsg::Common(CanvasCommonMsg::Close)).unwrap();
+ }
+}
+
+impl<'a> WebGLRenderingContextMethods for JSRef<'a, WebGLRenderingContext> {
+ fn Clear(self, mask: u32) -> () {
+ self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::Clear(mask))).unwrap()
+ }
+
+ fn ClearColor(self, red: f32, green: f32, blue: f32, alpha: f32) -> (){
+ self.renderer.send(CanvasMsg::WebGL(CanvasWebGLMsg::ClearColor(red, green, blue, alpha))).unwrap()
+ }
+}
+
+pub trait LayoutCanvasWebGLRenderingContextHelpers {
+ #[allow(unsafe_code)]
+ unsafe fn get_renderer(&self) -> Sender<CanvasMsg>;
+}
+
+impl LayoutCanvasWebGLRenderingContextHelpers for LayoutJS<WebGLRenderingContext> {
+ #[allow(unsafe_code)]
+ unsafe fn get_renderer(&self) -> Sender<CanvasMsg> {
+ (*self.unsafe_get()).renderer.clone()
+ }
+}
+