mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
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:
commit
ce30807be5
5 changed files with 53 additions and 34 deletions
|
@ -22,6 +22,7 @@ pub struct CanvasGradient {
|
|||
}
|
||||
|
||||
#[jstraceable]
|
||||
#[derive(Clone)]
|
||||
pub enum CanvasGradientStyle {
|
||||
Linear(LinearGradientStyle),
|
||||
Radial(RadialGradientStyle),
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
_ => {}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue