Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OffscreenCanvas API #22168

Closed

Offscreen canvas

code changes to add offscreen canvas
  • Loading branch information
PrayaniSingh0106 committed Nov 10, 2018
commit fd57e91bf41117fcd9cbe0045c4984699a078e6a
@@ -405,6 +405,8 @@ pub mod nodeiterator;
pub mod nodelist;
pub mod offlineaudiocompletionevent;
pub mod offlineaudiocontext;
pub mod offscreencanvas;
pub mod offscreencanvasrenderingcontext2d;
pub mod oscillatornode;
pub mod pagetransitionevent;
pub mod paintrenderingcontext2d;
@@ -0,0 +1,128 @@
/* 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 dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{OffscreenCanvasMethods, Wrap as OffscreenCanvasWrap};
use dom::bindings::codegen::Bindings::OffscreenCanvasBinding;
use dom::bindings::codegen::UnionTypes;
use dom::bindings::error::{Error, Fallible};
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};
use std::ptr;
use dom::bindings::root::{DomRoot, Dom};
use std::cell::Ref;
use dom::bindings::str::DOMString;
use dom::globalscope::GlobalScope;
use dom::htmlcanvaselement::{CanvasContext, HTMLCanvasElement};
use dom_struct::dom_struct;
use dom::bindings::cell::DomRefCell;
use ref_filter_map;
use dom::offscreencanvasrenderingcontext2d::OffscreenCanvasRenderingContext2D;
use js::rust::HandleValue;
use js::jsapi::JSContext;
use dom::node::{Node, window_from_node};


pub enum OffscreenCanvasContext {
Context2d(Dom<OffscreenCanvasRenderingContext2D>),
//WebGL(Dom<WebGLRenderingContext>),
//WebGL2(Dom<WebGL2RenderingContext>),
}

#[dom_struct]
pub struct OffscreenCanvas{
height: u64,
width: u64,
context: DomRefCell<Option<OffscreenCanvasContext>>,
placeholder: Option<Dom<HTMLCanvasElement>>,
}

impl OffscreenCanvas{
pub fn new_inherited(height: u64, width: u64, placeholder: Option<Dom<HTMLCanvasElement>>) -> OffscreenCanvas {
OffscreenCanvas {
reflector_: Reflector::new(),
height: height,
width: width,
context: DomRefCell::new(None),
placeholder: placeholder,
}
}

pub fn new(global: &GlobalScope, height: u64, width: u64, placeholder: Option<Dom<HTMLCanvasElement>>) -> DomRoot<OffscreenCanvas> {
reflect_dom_object(Box::new(OffscreenCanvas::new_inherited(height,width,placeholder)), global, OffscreenCanvasWrap)
}

pub fn Constructor (global: &GlobalScope, height: u64, width: u64) -> Fallible<DomRoot<OffscreenCanvas>> {
//step 1
let offscreencanvas = OffscreenCanvas::new(global,height,width,None);
//step 2

if(offscreencanvas.context.is_some()){
return Err(Error::InvalidState);
}

//offscreencanvas.height = height;
//offscreencanvas.width = width;

offscreencanvas.placeholder = ptr::null();

//step 3
Ok(offscreencanvas)
}

pub fn context(&self) -> Option<Ref<OffscreenCanvasContext>> {
ref_filter_map::ref_filter_map(self.context.borrow(), |ctx| ctx.as_ref())
}

fn get_or_init_2d_context(&self) -> Option<DomRoot<OffscreenCanvasRenderingContext2D>> {
if let Some(ctx) = self.context() {
return match *ctx {
OffscreenCanvasContext::Context2d(ref ctx) => Some(DomRoot::from_ref(ctx)),
_ => None,
};
}
let window = window_from_node(self);
let size = self.get_size();
let context = OffscreenCanvasRenderingContext2D::new(window.upcast::<GlobalScope>(), self, size);
*self.context.borrow_mut() = Some(OffscreenCanvasContext::Context2d(Dom::from_ref(&*context)));
Some(context)
}

}


impl OffscreenCanvasMethods for OffscreenCanvas{
#[allow(unsafe_code)]
unsafe fn GetContext(&self,cx: *mut JSContext, contextID: DOMString, options: HandleValue) -> Option<UnionTypes::OffscreenCanvasRenderingContext2DOrWebGLRenderingContextOrWebGL2RenderingContext> {

if(!options.is_object())
{
options = ptr::null();
}



if(self.context.is_none())
{
if(contextID == "2d")
{
self.get_or_init_2d_context();
}
}

}



fn Width(&self) -> u64 {
return self.width;
}
fn SetWidth(&self, value: u64) -> () {
self.width = value;
}
fn Height(&self) -> u64 {
return self.height;
}
fn SetHeight(&self, value: u64) -> () {
self.height = value;
}
}
@@ -0,0 +1,29 @@
/* 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 dom_struct::dom_struct;
use dom::bindings::codegen::Bindings::OffscreenCanvasRenderingContext2DBinding;
use dom::bindings::codegen::Bindings::OffscreenCanvasBinding::{Wrap as OffscreenCanvasRenderingContext2DWrap};
use dom::offscreencanvas::OffscreenCanvas;
use dom::bindings::root::DomRoot;
use dom::globalscope::GlobalScope;
use dom::bindings::reflector::{DomObject, Reflector, reflect_dom_object};

#[dom_struct]
pub struct OffscreenCanvasRenderingContext2D{
canvas: OffscreenCanvas,
}

impl OffscreenCanvasRenderingContext2D {
pub fn new_inherited(canvas: OffscreenCanvas) -> OffscreenCanvasRenderingContext2D {
OffscreenCanvasRenderingContext2D {
canvas: canvas,
}
}

pub fn new(global: &GlobalScope,canvas: OffscreenCanvas) -> DomRoot<OffscreenCanvasRenderingContext2D> {
reflect_dom_object(Box::new(OffscreenCanvasRenderingContext2D::new_inherited()), global, OffscreenCanvasRenderingContext2DWrap)
}
}

@@ -0,0 +1,24 @@
/* 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/. */



typedef (OffscreenCanvasRenderingContext2D or WebGLRenderingContext or WebGL2RenderingContext) OffscreenRenderingContext;

dictionary ImageEncodeOptions {
DOMString type = "image/png";
unrestricted double quality = 1.0;
};

//enum OffscreenRenderingContextId { "2d", "webgl", "webgl2" };

[Constructor([EnforceRange] unsigned long long width, [EnforceRange] unsigned long long height), Exposed=(Window,Worker)/*, Transferable*/, Pref="dom.offscreen_canvas.enabled"]
interface OffscreenCanvas : EventTarget {
attribute /*[EnforceRange]*/ unsigned long long width;
attribute /*[EnforceRange]*/ unsigned long long height;

OffscreenRenderingContext? getContext(DOMString contextId, optional any options = null);
//ImageBitmap transferToImageBitmap();
//Promise<Blob> convertToBlob(optional ImageEncodeOptions options);
};
@@ -1,28 +1,21 @@
/* 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/. */



[Exposed=(Window,Worker)]
[Pref="dom.offscreen_canvas.enabled"]
[Exposed=(Window,Worker), Pref="dom.offscreen_canvas.enabled"]
interface OffscreenCanvasRenderingContext2D {

This comment has been minimized.

Copy link
@jdm

jdm Nov 11, 2018

Member

TravisCI doesn't like that this file is named OffscreenCanvasRenderingContext2d.webidl, while the interface is named OffscreenCanvasRenderingContext2D. The filename should match the interface name (ie. 2D, not 2d).

void commit();
//void commit();
readonly attribute OffscreenCanvas canvas;
};

OffscreenCanvasRenderingContext2D includes CanvasState;
OffscreenCanvasRenderingContext2D includes CanvasTransform;
OffscreenCanvasRenderingContext2D includes CanvasCompositing;
OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing;
OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles;
OffscreenCanvasRenderingContext2D includes CanvasShadowStyles;
OffscreenCanvasRenderingContext2D includes CanvasFilters;
OffscreenCanvasRenderingContext2D includes CanvasRect;
OffscreenCanvasRenderingContext2D includes CanvasDrawPath;
OffscreenCanvasRenderingContext2D includes CanvasText;
OffscreenCanvasRenderingContext2D includes CanvasDrawImage;
OffscreenCanvasRenderingContext2D includes CanvasImageData;
OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles;
OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles;
OffscreenCanvasRenderingContext2D includes CanvasPath;
//OffscreenCanvasRenderingContext2D includes CanvasState;
//OffscreenCanvasRenderingContext2D includes CanvasTransform;
//OffscreenCanvasRenderingContext2D includes CanvasCompositing;
//OffscreenCanvasRenderingContext2D includes CanvasImageSmoothing;
//OffscreenCanvasRenderingContext2D includes CanvasFillStrokeStyles;
//OffscreenCanvasRenderingContext2D includes CanvasShadowStyles;
//OffscreenCanvasRenderingContext2D includes CanvasFilters;
//OffscreenCanvasRenderingContext2D includes CanvasRect;
//OffscreenCanvasRenderingContext2D includes CanvasDrawPath;
//OffscreenCanvasRenderingContext2D includes CanvasText;
//OffscreenCanvasRenderingContext2D includes CanvasDrawImage;
//OffscreenCanvasRenderingContext2D includes CanvasImageData;
//OffscreenCanvasRenderingContext2D includes CanvasPathDrawingStyles;
//OffscreenCanvasRenderingContext2D includes CanvasTextDrawingStyles;
//OffscreenCanvasRenderingContext2D includes CanvasPath;
ProTip! Use n and p to navigate between commits in a pull request.
You can’t perform that action at this time.