aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs71
1 files changed, 52 insertions, 19 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 9898f1d501d..5cda56f085d 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -12,7 +12,7 @@ use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern;
use dom::bindings::error::Error::{IndexSize, NotSupported, Type, InvalidState};
use dom::bindings::error::Fallible;
use dom::bindings::global::{GlobalRef, GlobalField};
-use dom::bindings::js::{JS, JSRef, LayoutJS, Rootable, Temporary};
+use dom::bindings::js::{JS, JSRef, LayoutJS, Rootable, Temporary, Unrooted};
use dom::bindings::num::Finite;
use dom::bindings::utils::{Reflector, reflect_dom_object};
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
@@ -46,6 +46,15 @@ use util::str::DOMString;
use url::Url;
use util::vec::byte_swap;
+#[must_root]
+#[jstraceable]
+#[derive(Clone)]
+pub enum CanvasFillOrStrokeStyle {
+ Color(RGBA),
+ Gradient(JS<CanvasGradient>),
+ // Pattern(JS<CanvasPattern>), // https://github.com/servo/servo/pull/6157
+}
+
// https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d
#[dom_struct]
pub struct CanvasRenderingContext2D {
@@ -57,18 +66,19 @@ pub struct CanvasRenderingContext2D {
saved_states: RefCell<Vec<CanvasContextState>>,
}
-#[derive(Clone)]
+#[must_root]
#[jstraceable]
+#[derive(Clone)]
struct CanvasContextState {
global_alpha: f64,
global_composition: CompositionOrBlending,
image_smoothing_enabled: bool,
- stroke_color: RGBA,
+ fill_style: CanvasFillOrStrokeStyle,
+ stroke_style: CanvasFillOrStrokeStyle,
line_width: f64,
line_cap: LineCapStyle,
line_join: LineJoinStyle,
miter_limit: f64,
- fill_color: RGBA,
transform: Matrix2D<f32>,
}
@@ -84,12 +94,12 @@ impl CanvasContextState {
global_alpha: 1.0,
global_composition: CompositionOrBlending::default(),
image_smoothing_enabled: true,
- stroke_color: black,
+ fill_style: CanvasFillOrStrokeStyle::Color(black),
+ stroke_style: CanvasFillOrStrokeStyle::Color(black),
line_width: 1.0,
line_cap: LineCapStyle::Butt,
line_join: LineJoinStyle::Miter,
miter_limit: 10.0,
- fill_color: black,
transform: Matrix2D::identity(),
}
}
@@ -773,9 +783,16 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
fn StrokeStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
- let mut result = String::new();
- serialize(&self.state.borrow().stroke_color, &mut result).unwrap();
- StringOrCanvasGradientOrCanvasPattern::eString(result)
+ match self.state.borrow().stroke_style {
+ CanvasFillOrStrokeStyle::Color(ref rgba) => {
+ let mut result = String::new();
+ serialize(rgba, &mut result).unwrap();
+ StringOrCanvasGradientOrCanvasPattern::eString(result)
+ },
+ CanvasFillOrStrokeStyle::Gradient(gradient) => {
+ StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(Unrooted::from_js(gradient))
+ },
+ }
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
@@ -784,25 +801,38 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
match parse_color(&string) {
Ok(rgba) => {
- self.state.borrow_mut().stroke_color = rgba;
+ self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba);
self.renderer
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba))))
.unwrap();
}
_ => {}
}
- }
- _ => {
- // TODO(pcwalton)
- }
+ },
+ StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient) => {
+ let gradient_root = gradient.root();
+ self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Gradient(
+ JS::from_rooted(gradient_root.r()));
+ let msg = CanvasMsg::Canvas2d(
+ Canvas2dMsg::SetStrokeStyle(gradient_root.r().to_fill_or_stroke_style()));
+ self.renderer.send(msg).unwrap();
+ },
+ _ => {}
}
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
fn FillStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
- let mut result = String::new();
- serialize(&self.state.borrow().fill_color, &mut result).unwrap();
- StringOrCanvasGradientOrCanvasPattern::eString(result)
+ match self.state.borrow().fill_style {
+ CanvasFillOrStrokeStyle::Color(ref rgba) => {
+ let mut result = String::new();
+ serialize(rgba, &mut result).unwrap();
+ StringOrCanvasGradientOrCanvasPattern::eString(result)
+ },
+ CanvasFillOrStrokeStyle::Gradient(gradient) => {
+ StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(Unrooted::from_js(gradient))
+ },
+ }
}
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
@@ -811,7 +841,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
match parse_color(&string) {
Ok(rgba) => {
- self.state.borrow_mut().fill_color = rgba;
+ self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba);
self.renderer
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba))))
.unwrap()
@@ -820,8 +850,11 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
}
}
StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient) => {
+ let gradient_root = gradient.root();
+ self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Gradient(
+ JS::from_rooted(gradient_root.r()));
let msg = CanvasMsg::Canvas2d(
- Canvas2dMsg::SetFillStyle(gradient.root().r().to_fill_or_stroke_style()));
+ Canvas2dMsg::SetFillStyle(gradient_root.r().to_fill_or_stroke_style()));
self.renderer.send(msg).unwrap();
}
_ => {}