diff options
author | David Zbarsky <dzbarsky@gmail.com> | 2015-08-09 19:43:09 -0400 |
---|---|---|
committer | David Zbarsky <dzbarsky@gmail.com> | 2015-11-21 11:59:19 -0800 |
commit | 8408891ec5d2c7d455e52bef4181adbb276413a5 (patch) | |
tree | ae1dcef884a13039bf17b9b040e698329ac7caad /components/script/dom/canvasrenderingcontext2d.rs | |
parent | ea690a2dff64d1cb4eb668473d62f1bbcb19f7c8 (diff) | |
download | servo-8408891ec5d2c7d455e52bef4181adbb276413a5.tar.gz servo-8408891ec5d2c7d455e52bef4181adbb276413a5.zip |
Parse currentColor as Canvas2D color
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/canvasrenderingcontext2d.rs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 4f307a5c127..2954fbb332e 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -9,10 +9,12 @@ use canvas_traits::{FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle, use cssparser::Color as CSSColor; use cssparser::{Parser, RGBA}; use dom::bindings::cell::DOMRefCell; +use dom::bindings::codegen::Bindings::CSSStyleDeclarationBinding::CSSStyleDeclarationMethods; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasRenderingContext2DMethods; use dom::bindings::codegen::Bindings::CanvasRenderingContext2DBinding::CanvasWindingRule; use dom::bindings::codegen::Bindings::ImageDataBinding::ImageDataMethods; +use dom::bindings::codegen::Bindings::WindowBinding::WindowMethods; use dom::bindings::codegen::UnionTypes::HTMLImageElementOrHTMLCanvasElementOrCanvasRenderingContext2D; use dom::bindings::codegen::UnionTypes::StringOrCanvasGradientOrCanvasPattern; use dom::bindings::error::{Error, Fallible}; @@ -439,6 +441,26 @@ impl CanvasRenderingContext2D { Size2D::new(w as f32, h as f32))) } + fn parse_color(&self, string: &str) -> Result<RGBA,()> { + let mut parser = Parser::new(&string); + let color = CSSColor::parse(&mut parser); + if parser.is_exhausted() { + match color { + Ok(CSSColor::RGBA(rgba)) => Ok(rgba), + Ok(CSSColor::CurrentColor) => { + // TODO: will need to check that the context bitmap mode is fixed + // once we implement CanvasProxy + let window = window_from_node(&*self.canvas); + let style = window.GetComputedStyle(&*self.canvas.upcast(), None); + self.parse_color(&style.GetPropertyValue(DOMString::from("color"))) + }, + _ => Err(()) + } + } else { + Err(()) + } + } + pub fn get_renderer_id(&self) -> usize { self.renderer_id } @@ -844,7 +866,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { fn SetStrokeStyle(&self, value: StringOrCanvasGradientOrCanvasPattern) { match value { StringOrCanvasGradientOrCanvasPattern::eString(string) => { - match parse_color(&string) { + match self.parse_color(&string) { Ok(rgba) => { self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba); self.ipc_renderer @@ -884,7 +906,7 @@ impl CanvasRenderingContext2DMethods for CanvasRenderingContext2D { fn SetFillStyle(&self, value: StringOrCanvasGradientOrCanvasPattern) { match value { StringOrCanvasGradientOrCanvasPattern::eString(string) => { - if let Ok(rgba) = parse_color(&string) { + if let Ok(rgba) = self.parse_color(&string) { self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba); self.ipc_renderer .send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle( |