From 5bbfb42e907f75acd93e586160d3692867447e73 Mon Sep 17 00:00:00 2001 From: Hyowon Kim Date: Fri, 5 Jun 2015 14:54:45 +0900 Subject: [PATCH] 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. --- components/script/dom/canvasgradient.rs | 1 + .../script/dom/canvasrenderingcontext2d.rs | 71 ++++++++++++++----- ...dient.interpolate.zerosize.stroke.html.ini | 5 -- ...t.interpolate.zerosize.strokeRect.html.ini | 5 -- .../2d.gradient.object.compare.html.ini | 5 -- 5 files changed, 53 insertions(+), 34 deletions(-) delete mode 100644 tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.object.compare.html.ini diff --git a/components/script/dom/canvasgradient.rs b/components/script/dom/canvasgradient.rs index b0a7ea924da1..eae2a08da65f 100644 --- a/components/script/dom/canvasgradient.rs +++ b/components/script/dom/canvasgradient.rs @@ -22,6 +22,7 @@ pub struct CanvasGradient { } #[jstraceable] +#[derive(Clone)] pub enum CanvasGradientStyle { Linear(LinearGradientStyle), Radial(RadialGradientStyle), diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 9898f1d501da..5cda56f085d0 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), + // Pattern(JS), // 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>, } -#[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, } @@ -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(); } _ => {} diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini deleted file mode 100644 index f18694d03c3a..000000000000 --- a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.stroke.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.gradient.interpolate.zerosize.stroke.html] - type: testharness - [Canvas test: 2d.gradient.interpolate.zerosize.stroke] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini deleted file mode 100644 index e5ae2179bd8e..000000000000 --- a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.interpolate.zerosize.strokeRect.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.gradient.interpolate.zerosize.strokeRect.html] - type: testharness - [Canvas test: 2d.gradient.interpolate.zerosize.strokeRect] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.object.compare.html.ini b/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.object.compare.html.ini deleted file mode 100644 index 9fbe5bd58937..000000000000 --- a/tests/wpt/metadata/2dcontext/fill-and-stroke-styles/2d.gradient.object.compare.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.gradient.object.compare.html] - type: testharness - [Canvas test: 2d.gradient.object.compare] - expected: FAIL -