Skip to content

Commit

Permalink
Replace fill_color and stroke_color with fill_style and stroke_style …
Browse files Browse the repository at this point in the history
…in CanvasContextState.

The fillStyle and strokeStyle attributes can be either
strings(color), CanvasGradients, or CanvasPatterns.
  • Loading branch information
hyowon committed Jun 6, 2015
1 parent ad5846f commit 5bbfb42
Show file tree
Hide file tree
Showing 5 changed files with 53 additions and 34 deletions.
1 change: 1 addition & 0 deletions components/script/dom/canvasgradient.rs
Expand Up @@ -22,6 +22,7 @@ pub struct CanvasGradient {
}

#[jstraceable]
#[derive(Clone)]
pub enum CanvasGradientStyle {
Linear(LinearGradientStyle),
Radial(RadialGradientStyle),
Expand Down
71 changes: 52 additions & 19 deletions components/script/dom/canvasrenderingcontext2d.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -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 {
Expand All @@ -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>,
}

Expand All @@ -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(),
}
}
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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()
Expand All @@ -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();
}
_ => {}
Expand Down

This file was deleted.

This file was deleted.

This file was deleted.

0 comments on commit 5bbfb42

Please sign in to comment.