Auto merge of #6290 - hyowon:fill_or_stroke_style, r=nox

The fillStyle and strokeStyle attributes can be either strings(color), CanvasGradients, or CanvasPatterns.
The current implementation only considers strings(color).
r? @nox @jdm @pcwalton 
cc @yichoi

<!-- Reviewable:start -->
[<img src="https://reviewable.io/review_button.png" height=40 alt="Review on Reviewable"/>](https://reviewable.io/reviews/servo/servo/6290)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2015-06-08 09:49:13 -05:00
commit ce30807be5
5 changed files with 53 additions and 34 deletions

View file

@ -22,6 +22,7 @@ pub struct CanvasGradient {
}
#[jstraceable]
#[derive(Clone)]
pub enum CanvasGradientStyle {
Linear(LinearGradientStyle),
Radial(RadialGradientStyle),

View file

@ -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();
}
_ => {}