Advertisement
Guest User

Untitled

a guest
Nov 13th, 2018
209
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.60 KB | None | 0 0
  1. use dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{OffscreenCanvasMethods, Wrap as OffscreenCanvasWrap};
  2. use dom::bindings::codegen::Bindings::OffscreenCanvasBinding;
  3. use dom::bindings::codegen::UnionTypes;
  4. use dom::bindings::error::{Error, Fallible};
  5. use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
  6. use std::ptr;
  7. use dom::bindings::root::{DomRoot, Dom};
  8. use std::cell::Ref;
  9. use dom::bindings::str::DOMString;
  10. use dom::globalscope::GlobalScope;
  11. use dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
  12. use dom_struct::dom_struct;
  13. use dom::bindings::cell::DomRefCell;
  14. use ref_filter_map;
  15. use dom::offscreencanvasrenderingcontext2d::OffscreenCanvasRenderingContext2D;
  16. use dom::webglrenderingcontext::WebGLRenderingContext;
  17. use dom::webgl2renderingcontext::WebGL2RenderingContext;
  18. use js::rust::HandleValue;
  19. use js::jsapi::JSContext;
  20. use dom::node::{Node, window_from_node};
  21. //use dom::bindings::codegen::UnionTypes::OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext;
  22. use dom::eventtarget::EventTarget;
  23.  
  24. #[derive(MallocSizeOf)]
  25. #[derive(JSTraceable)]
  26. pub enum OffscreenRenderingContext {
  27.     Context2D(Dom<OffscreenCanvasRenderingContext2D>),
  28.     WebGL(Dom<WebGLRenderingContext>),
  29.     WebGL2(Dom<WebGL2RenderingContext>),
  30. }
  31.  
  32. #[dom_struct]
  33. pub struct OffscreenCanvas{
  34.     eventtarget: EventTarget,
  35.     height: u64,
  36.     width: u64,
  37.     context: DomRefCell<Option<OffscreenRenderingContext>>,
  38.     placeholder: Option<Dom<HTMLCanvasElement>>,
  39. }
  40.  
  41. impl OffscreenCanvas{
  42.     pub fn new_inherited(height: u64, width: u64, placeholder: Option<&HTMLCanvasElement>) -> OffscreenCanvas {
  43.         OffscreenCanvas {
  44.             eventtarget: EventTarget::new_inherited(),
  45.             height: height,
  46.             width: width,
  47.             context: DomRefCell::new(None),
  48.             placeholder: placeholder.map(Dom::from_ref),
  49.         }
  50.     }
  51.  
  52.     pub fn new(global: &GlobalScope, height: u64, width: u64, placeholder: Option<&HTMLCanvasElement>) -> DomRoot<OffscreenCanvas> {
  53.         reflect_dom_object(Box::new(OffscreenCanvas::new_inherited(height,width,placeholder)), global, OffscreenCanvasWrap)
  54.     }
  55.  
  56.     pub fn Constructor (global: &GlobalScope, height: u64, width: u64) -> Fallible<DomRoot<OffscreenCanvas>> {
  57.         //step 1
  58.         let offscreencanvas = OffscreenCanvas::new(global,height,width,None);
  59.         //step 2
  60.  
  61.         if offscreencanvas.context.borrow().is_some() {
  62.             return Err(Error::InvalidState);
  63.         }
  64.  
  65.         offscreencanvas.height = height;
  66.         offscreencanvas.width = width;
  67.  
  68.         offscreencanvas.placeholder = None;
  69.  
  70.         //step 3
  71.         Ok(offscreencanvas)
  72.     }
  73.  
  74.     /*pub fn context(&self) -> Option<Ref<OffscreenRenderingContext>> {
  75.         ref_filter_map::ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
  76.     }
  77.  
  78.     fn get_or_init_2d_context(&self) -> Option<DomRoot<OffscreenCanvasRenderingContext2D>> {
  79.         if let Some(ctx) = self.context() {
  80.             return match *ctx {
  81.                 OffscreenRenderingContext::Context2D(ref ctx) => Some(DomRoot::from_ref(ctx)),
  82.                 _ => None,
  83.             };
  84.         }
  85.         //let window = window_from_node(self);
  86.         //let size = self.get_size();
  87.         let context = OffscreenCanvasRenderingContext2D::new(self.global,self);
  88.         *self.context.borrow_mut() = Some(OffscreenRenderingContext::Context2D(Dom::from_ref(&*context)));
  89.         Some(context)
  90.     }*/
  91.  
  92. }
  93.  
  94.  
  95. impl OffscreenCanvasMethods for OffscreenCanvas{
  96.     #[allow(unsafe_code)]
  97.     unsafe fn GetContext(&self,cx: *mut JSContext, contextID: DOMString, options: HandleValue) -> Option<OffscreenRenderingContext> {
  98.  
  99.         //let options =
  100.         /*if !options.is_object() {
  101.             options = HandleValue::null();
  102.         }*/
  103.  
  104.  
  105.  
  106.  
  107.         /*    if contextID == "2d"
  108.             {
  109.                 self.get_or_init_2d_context();
  110.             }
  111.             */
  112.  
  113.         /*match &*contextID {
  114.             "2d" => self.get_or_init_2d_context(),
  115.             "webgl" | "experimental-webgl" => self
  116.                 .map(CanvasRenderingContext::WebGLRenderingContext),
  117.             "webgl2" | "experimental-webgl2" => self
  118.                 .map(CanvasRenderingContext::WebGL2RenderingContext)
  119.             _ => None,
  120.         }*/
  121.  
  122.     }
  123.  
  124.  
  125.  
  126.     fn Width(&self) -> u64 {
  127.         return self.width;
  128.     }
  129.     fn SetWidth(&self, value: u64) -> () {
  130.         self.width = value;
  131.     }
  132.     fn Height(&self) -> u64 {
  133.         return self.height;
  134.     }
  135.     fn SetHeight(&self, value: u64) -> () {
  136.         self.height = value;
  137.     }
  138. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement