diff options
author | Hyowon Kim <hw1008.kim@samsung.com> | 2015-06-05 14:54:45 +0900 |
---|---|---|
committer | Hyowon Kim <hw1008.kim@samsung.com> | 2015-06-06 16:15:11 +0900 |
commit | 5bbfb42e907f75acd93e586160d3692867447e73 (patch) | |
tree | ed2f27309ec1588203a318d921ec07a6c5e95d58 /components/script/dom/canvasrenderingcontext2d.rs | |
parent | ad5846f2e14ac15aca9f561975ae9476d0f13244 (diff) | |
download | servo-5bbfb42e907f75acd93e586160d3692867447e73.tar.gz servo-5bbfb42e907f75acd93e586160d3692867447e73.zip |
Replace fill_color and stroke_color with fill_style and stroke_style in CanvasContextState.
The fillStyle and strokeStyle attributes can be either
strings(color), CanvasGradients, or CanvasPatterns.
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 71 |
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(); } _ => {} |