aboutsummaryrefslogtreecommitdiffstats
path: root/components/script/dom/canvasrenderingcontext2d.rs
diff options
context:
space:
mode:
authorHyowon Kim <hw1008.kim@samsung.com>2015-06-02 15:11:03 +0900
committerHyowon Kim <hw1008.kim@samsung.com>2015-06-03 09:11:24 +0900
commit5d05ffc4175b1c4d28a3ab9ef5e3e70b970c14c8 (patch)
tree9973b981ecc66688d5f7e32e92e2ee19b461f265 /components/script/dom/canvasrenderingcontext2d.rs
parentec79881471bf3e952f40ee7021b561532a9020c6 (diff)
downloadservo-5d05ffc4175b1c4d28a3ab9ef5e3e70b970c14c8.tar.gz
servo-5d05ffc4175b1c4d28a3ab9ef5e3e70b970c14c8.zip
Serialize colors for fill and stroke styles in canvas.
Diffstat (limited to 'components/script/dom/canvasrenderingcontext2d.rs')
-rw-r--r--components/script/dom/canvasrenderingcontext2d.rs30
1 files changed, 21 insertions, 9 deletions
diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs
index 0fa401db399..9898f1d501d 100644
--- a/components/script/dom/canvasrenderingcontext2d.rs
+++ b/components/script/dom/canvasrenderingcontext2d.rs
@@ -22,7 +22,7 @@ use dom::imagedata::{ImageData, ImageDataHelpers};
use dom::node::{window_from_node, NodeHelpers, NodeDamage};
use cssparser::Color as CSSColor;
-use cssparser::{Parser, RGBA, ToCss};
+use cssparser::{Parser, RGBA};
use geom::matrix2d::Matrix2D;
use geom::point::Point2D;
use geom::rect::Rect;
@@ -39,6 +39,7 @@ use png::PixelsByColorType;
use num::{Float, ToPrimitive};
use std::borrow::ToOwned;
use std::cell::RefCell;
+use std::fmt;
use std::sync::mpsc::{channel, Sender};
use util::str::DOMString;
@@ -772,11 +773,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
fn StrokeStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
- // FIXME(pcwalton, #4761): This is not spec-compliant. See:
- //
- // https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour
let mut result = String::new();
- self.state.borrow().stroke_color.to_css(&mut result).unwrap();
+ serialize(&self.state.borrow().stroke_color, &mut result).unwrap();
StringOrCanvasGradientOrCanvasPattern::eString(result)
}
@@ -802,11 +800,8 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
fn FillStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
- // FIXME(pcwalton, #4761): This is not spec-compliant. See:
- //
- // https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour
let mut result = String::new();
- self.state.borrow().stroke_color.to_css(&mut result).unwrap();
+ serialize(&self.state.borrow().fill_color, &mut result).unwrap();
StringOrCanvasGradientOrCanvasPattern::eString(result)
}
@@ -1048,3 +1043,20 @@ pub fn parse_color(string: &str) -> Result<RGBA,()> {
fn is_rect_valid(rect: Rect<f64>) -> bool {
rect.size.width > 0.0 && rect.size.height > 0.0
}
+
+// https://html.spec.whatwg.org/multipage/#serialisation-of-a-colour
+fn serialize<W>(color: &RGBA, dest: &mut W) -> fmt::Result where W: fmt::Write {
+ let red = (color.red * 255.).round() as u8;
+ let green = (color.green * 255.).round() as u8;
+ let blue = (color.blue * 255.).round() as u8;
+
+ if color.alpha == 1f32 {
+ write!(dest, "#{:x}{:x}{:x}{:x}{:x}{:x}",
+ red >> 4, red & 0xF,
+ green >> 4, green & 0xF,
+ blue >> 4, blue & 0xF)
+ } else {
+ write!(dest, "rgba({}, {}, {}, {})",
+ red, green, blue, color.alpha)
+ }
+}