mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +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]
|
#[jstraceable]
|
||||||
|
#[derive(Clone)]
|
||||||
pub enum CanvasGradientStyle {
|
pub enum CanvasGradientStyle {
|
||||||
Linear(LinearGradientStyle),
|
Linear(LinearGradientStyle),
|
||||||
Radial(RadialGradientStyle),
|
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::Error::{IndexSize, NotSupported, Type, InvalidState};
|
||||||
use dom::bindings::error::Fallible;
|
use dom::bindings::error::Fallible;
|
||||||
use dom::bindings::global::{GlobalRef, GlobalField};
|
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::num::Finite;
|
||||||
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
use dom::bindings::utils::{Reflector, reflect_dom_object};
|
||||||
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
use dom::canvasgradient::{CanvasGradient, CanvasGradientStyle, ToFillOrStrokeStyle};
|
||||||
|
@ -46,6 +46,15 @@ use util::str::DOMString;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
use util::vec::byte_swap;
|
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
|
// https://html.spec.whatwg.org/multipage/#canvasrenderingcontext2d
|
||||||
#[dom_struct]
|
#[dom_struct]
|
||||||
pub struct CanvasRenderingContext2D {
|
pub struct CanvasRenderingContext2D {
|
||||||
|
@ -57,18 +66,19 @@ pub struct CanvasRenderingContext2D {
|
||||||
saved_states: RefCell<Vec<CanvasContextState>>,
|
saved_states: RefCell<Vec<CanvasContextState>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[must_root]
|
||||||
#[jstraceable]
|
#[jstraceable]
|
||||||
|
#[derive(Clone)]
|
||||||
struct CanvasContextState {
|
struct CanvasContextState {
|
||||||
global_alpha: f64,
|
global_alpha: f64,
|
||||||
global_composition: CompositionOrBlending,
|
global_composition: CompositionOrBlending,
|
||||||
image_smoothing_enabled: bool,
|
image_smoothing_enabled: bool,
|
||||||
stroke_color: RGBA,
|
fill_style: CanvasFillOrStrokeStyle,
|
||||||
|
stroke_style: CanvasFillOrStrokeStyle,
|
||||||
line_width: f64,
|
line_width: f64,
|
||||||
line_cap: LineCapStyle,
|
line_cap: LineCapStyle,
|
||||||
line_join: LineJoinStyle,
|
line_join: LineJoinStyle,
|
||||||
miter_limit: f64,
|
miter_limit: f64,
|
||||||
fill_color: RGBA,
|
|
||||||
transform: Matrix2D<f32>,
|
transform: Matrix2D<f32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,12 +94,12 @@ impl CanvasContextState {
|
||||||
global_alpha: 1.0,
|
global_alpha: 1.0,
|
||||||
global_composition: CompositionOrBlending::default(),
|
global_composition: CompositionOrBlending::default(),
|
||||||
image_smoothing_enabled: true,
|
image_smoothing_enabled: true,
|
||||||
stroke_color: black,
|
fill_style: CanvasFillOrStrokeStyle::Color(black),
|
||||||
|
stroke_style: CanvasFillOrStrokeStyle::Color(black),
|
||||||
line_width: 1.0,
|
line_width: 1.0,
|
||||||
line_cap: LineCapStyle::Butt,
|
line_cap: LineCapStyle::Butt,
|
||||||
line_join: LineJoinStyle::Miter,
|
line_join: LineJoinStyle::Miter,
|
||||||
miter_limit: 10.0,
|
miter_limit: 10.0,
|
||||||
fill_color: black,
|
|
||||||
transform: Matrix2D::identity(),
|
transform: Matrix2D::identity(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -773,9 +783,16 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
|
||||||
fn StrokeStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
|
fn StrokeStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
|
||||||
let mut result = String::new();
|
match self.state.borrow().stroke_style {
|
||||||
serialize(&self.state.borrow().stroke_color, &mut result).unwrap();
|
CanvasFillOrStrokeStyle::Color(ref rgba) => {
|
||||||
StringOrCanvasGradientOrCanvasPattern::eString(result)
|
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
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
|
||||||
|
@ -784,25 +801,38 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
||||||
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
|
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
|
||||||
match parse_color(&string) {
|
match parse_color(&string) {
|
||||||
Ok(rgba) => {
|
Ok(rgba) => {
|
||||||
self.state.borrow_mut().stroke_color = rgba;
|
self.state.borrow_mut().stroke_style = CanvasFillOrStrokeStyle::Color(rgba);
|
||||||
self.renderer
|
self.renderer
|
||||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba))))
|
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetStrokeStyle(FillOrStrokeStyle::Color(rgba))))
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
_ => {
|
StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient) => {
|
||||||
// TODO(pcwalton)
|
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
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
|
||||||
fn FillStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
|
fn FillStyle(self) -> StringOrCanvasGradientOrCanvasPattern {
|
||||||
let mut result = String::new();
|
match self.state.borrow().fill_style {
|
||||||
serialize(&self.state.borrow().fill_color, &mut result).unwrap();
|
CanvasFillOrStrokeStyle::Color(ref rgba) => {
|
||||||
StringOrCanvasGradientOrCanvasPattern::eString(result)
|
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
|
// https://html.spec.whatwg.org/multipage/#dom-context-2d-strokestyle
|
||||||
|
@ -811,7 +841,7 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
||||||
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
|
StringOrCanvasGradientOrCanvasPattern::eString(string) => {
|
||||||
match parse_color(&string) {
|
match parse_color(&string) {
|
||||||
Ok(rgba) => {
|
Ok(rgba) => {
|
||||||
self.state.borrow_mut().fill_color = rgba;
|
self.state.borrow_mut().fill_style = CanvasFillOrStrokeStyle::Color(rgba);
|
||||||
self.renderer
|
self.renderer
|
||||||
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba))))
|
.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetFillStyle(FillOrStrokeStyle::Color(rgba))))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
|
@ -820,8 +850,11 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
StringOrCanvasGradientOrCanvasPattern::eCanvasGradient(gradient) => {
|
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(
|
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();
|
self.renderer.send(msg).unwrap();
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[2d.gradient.interpolate.zerosize.stroke.html]
|
|
||||||
type: testharness
|
|
||||||
[Canvas test: 2d.gradient.interpolate.zerosize.stroke]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[2d.gradient.interpolate.zerosize.strokeRect.html]
|
|
||||||
type: testharness
|
|
||||||
[Canvas test: 2d.gradient.interpolate.zerosize.strokeRect]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
[2d.gradient.object.compare.html]
|
|
||||||
type: testharness
|
|
||||||
[Canvas test: 2d.gradient.object.compare]
|
|
||||||
expected: FAIL
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue