mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
Add attributes for canvas shadows.
This commit is contained in:
parent
37fcced0fa
commit
473afdb196
15 changed files with 106 additions and 70 deletions
|
@ -2,7 +2,7 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use azure::azure::AzFloat;
|
||||
use azure::azure::{AzFloat, AzColor};
|
||||
use azure::azure_hl::{DrawTarget, SurfaceFormat, BackendType, StrokeOptions, DrawOptions, Pattern};
|
||||
use azure::azure_hl::{ColorPattern, PathBuilder, DrawSurfaceOptions, Filter};
|
||||
use azure::azure_hl::{JoinStyle, CapStyle, CompositionOp, AntialiasMode};
|
||||
|
@ -171,6 +171,10 @@ struct CanvasPaintState<'a> {
|
|||
stroke_opts: StrokeOptions<'a>,
|
||||
/// The current 2D transform matrix.
|
||||
transform: Matrix2D<f32>,
|
||||
shadow_offset_x: f64,
|
||||
shadow_offset_y: f64,
|
||||
shadow_blur: f64,
|
||||
shadow_color: AzColor,
|
||||
}
|
||||
|
||||
impl<'a> CanvasPaintState<'a> {
|
||||
|
@ -187,6 +191,10 @@ impl<'a> CanvasPaintState<'a> {
|
|||
stroke_style: Pattern::Color(ColorPattern::new(color::black())),
|
||||
stroke_opts: StrokeOptions::new(1.0, JoinStyle::MiterOrBevel, CapStyle::Butt, 10.0, &[]),
|
||||
transform: Matrix2D::identity(),
|
||||
shadow_offset_x: 0.0,
|
||||
shadow_offset_y: 0.0,
|
||||
shadow_blur: 0.0,
|
||||
shadow_color: color::transparent(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -257,6 +265,10 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
=> painter.get_image_data(dest_rect, canvas_size, chan),
|
||||
Canvas2dMsg::PutImageData(imagedata, image_data_rect, dirty_rect)
|
||||
=> painter.put_image_data(imagedata, image_data_rect, dirty_rect),
|
||||
Canvas2dMsg::SetShadowOffsetX(value) => painter.set_shadow_offset_x(value),
|
||||
Canvas2dMsg::SetShadowOffsetY(value) => painter.set_shadow_offset_y(value),
|
||||
Canvas2dMsg::SetShadowBlur(value) => painter.set_shadow_blur(value),
|
||||
Canvas2dMsg::SetShadowColor(rgba) => painter.set_shadow_color(rgba),
|
||||
}
|
||||
},
|
||||
CanvasMsg::Common(message) => {
|
||||
|
@ -582,6 +594,22 @@ impl<'a> CanvasPaintTask<'a> {
|
|||
|
||||
self.write_pixels(&imagedata, image_data_rect.size, source_rect, dest_rect, true)
|
||||
}
|
||||
|
||||
fn set_shadow_offset_x(&mut self, value: f64) {
|
||||
self.state.shadow_offset_x = value;
|
||||
}
|
||||
|
||||
fn set_shadow_offset_y(&mut self, value: f64) {
|
||||
self.state.shadow_offset_y = value;
|
||||
}
|
||||
|
||||
fn set_shadow_blur(&mut self, value: f64) {
|
||||
self.state.shadow_blur = value;
|
||||
}
|
||||
|
||||
fn set_shadow_color(&mut self, value: AzColor) {
|
||||
self.state.shadow_color = value;
|
||||
}
|
||||
}
|
||||
|
||||
/// Used by drawImage to get rid of the extra pixels of the image data that
|
||||
|
|
|
@ -13,7 +13,7 @@ extern crate gfx_traits;
|
|||
extern crate layers;
|
||||
extern crate offscreen_gl_context;
|
||||
|
||||
use azure::azure::AzFloat;
|
||||
use azure::azure::{AzFloat, AzColor};
|
||||
use azure::azure_hl::{DrawTarget, Pattern, ColorPattern};
|
||||
use azure::azure_hl::{GradientStop, LinearGradientPattern, RadialGradientPattern, ExtendMode};
|
||||
use azure::azure_hl::{JoinStyle, CapStyle, CompositionOp};
|
||||
|
@ -67,6 +67,10 @@ pub enum Canvas2dMsg {
|
|||
SetGlobalAlpha(f32),
|
||||
SetGlobalComposition(CompositionOrBlending),
|
||||
SetTransform(Matrix2D<f32>),
|
||||
SetShadowOffsetX(f64),
|
||||
SetShadowOffsetY(f64),
|
||||
SetShadowBlur(f64),
|
||||
SetShadowColor(AzColor),
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
|
|
|
@ -39,6 +39,9 @@ path = "../style"
|
|||
[dependencies.gfx]
|
||||
path = "../gfx"
|
||||
|
||||
[dependencies.gfx_traits]
|
||||
path = "../gfx_traits"
|
||||
|
||||
[dependencies.canvas]
|
||||
path = "../canvas"
|
||||
|
||||
|
|
|
@ -27,6 +27,7 @@ use geom::matrix2d::Matrix2D;
|
|||
use geom::point::Point2D;
|
||||
use geom::rect::Rect;
|
||||
use geom::size::Size2D;
|
||||
use gfx_traits::color;
|
||||
|
||||
use canvas_traits::{CanvasMsg, Canvas2dMsg, CanvasCommonMsg};
|
||||
use canvas_traits::{FillOrStrokeStyle, LinearGradientStyle, RadialGradientStyle};
|
||||
|
@ -80,6 +81,10 @@ struct CanvasContextState {
|
|||
line_join: LineJoinStyle,
|
||||
miter_limit: f64,
|
||||
transform: Matrix2D<f32>,
|
||||
shadow_offset_x: f64,
|
||||
shadow_offset_y: f64,
|
||||
shadow_blur: f64,
|
||||
shadow_color: RGBA,
|
||||
}
|
||||
|
||||
impl CanvasContextState {
|
||||
|
@ -101,6 +106,10 @@ impl CanvasContextState {
|
|||
line_join: LineJoinStyle::Miter,
|
||||
miter_limit: 10.0,
|
||||
transform: Matrix2D::identity(),
|
||||
shadow_offset_x: 0.0,
|
||||
shadow_offset_y: 0.0,
|
||||
shadow_blur: 0.0,
|
||||
shadow_color: RGBA { red: 0.0, green: 0.0, blue: 0.0, alpha: 0.0 }, // transparent black
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1056,6 +1065,61 @@ impl<'a> CanvasRenderingContext2DMethods for JSRef<'a, CanvasRenderingContext2D>
|
|||
self.state.borrow_mut().miter_limit = limit;
|
||||
self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetMiterLimit(limit as f32))).unwrap()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsetx
|
||||
fn ShadowOffsetX(self) -> f64 {
|
||||
self.state.borrow().shadow_offset_x
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsetx
|
||||
fn SetShadowOffsetX(self, value: f64) {
|
||||
self.state.borrow_mut().shadow_offset_x = value;
|
||||
self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetX(value))).unwrap()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsety
|
||||
fn ShadowOffsetY(self) -> f64 {
|
||||
self.state.borrow().shadow_offset_y
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowoffsety
|
||||
fn SetShadowOffsetY(self, value: f64) {
|
||||
self.state.borrow_mut().shadow_offset_y = value;
|
||||
self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowOffsetY(value))).unwrap()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowblur
|
||||
fn ShadowBlur(self) -> f64 {
|
||||
self.state.borrow().shadow_blur
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowblur
|
||||
fn SetShadowBlur(self, value: f64) {
|
||||
self.state.borrow_mut().shadow_blur = value;
|
||||
self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowBlur(value))).unwrap()
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowcolor
|
||||
fn ShadowColor(self) -> DOMString {
|
||||
let mut result = String::new();
|
||||
serialize(&self.state.borrow().shadow_color, &mut result).unwrap();
|
||||
result
|
||||
}
|
||||
|
||||
// https://html.spec.whatwg.org/multipage/#dom-context-2d-shadowcolor
|
||||
fn SetShadowColor(self, value: DOMString) {
|
||||
match parse_color(&value) {
|
||||
Ok(rgba) => {
|
||||
self.state.borrow_mut().shadow_color = rgba;
|
||||
self.renderer.send(CanvasMsg::Canvas2d(Canvas2dMsg::SetShadowColor(
|
||||
color::rgba(rgba.red,
|
||||
rgba.green,
|
||||
rgba.blue,
|
||||
rgba.alpha)))).unwrap()
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for CanvasRenderingContext2D {
|
||||
|
|
|
@ -65,10 +65,10 @@ interface CanvasRenderingContext2D {
|
|||
//CanvasPattern createPattern(CanvasImageSource image, [TreatNullAs=EmptyString] DOMString repetition);
|
||||
|
||||
// shadows
|
||||
// attribute unrestricted double shadowOffsetX; // (default 0)
|
||||
// attribute unrestricted double shadowOffsetY; // (default 0)
|
||||
// attribute unrestricted double shadowBlur; // (default 0)
|
||||
// attribute DOMString shadowColor; // (default transparent black)
|
||||
attribute unrestricted double shadowOffsetX; // (default 0)
|
||||
attribute unrestricted double shadowOffsetY; // (default 0)
|
||||
attribute unrestricted double shadowBlur; // (default 0)
|
||||
attribute DOMString shadowColor; // (default transparent black)
|
||||
|
||||
// rects
|
||||
//[LenientFloat]
|
||||
|
|
|
@ -26,6 +26,7 @@ extern crate core;
|
|||
extern crate devtools_traits;
|
||||
extern crate cssparser;
|
||||
extern crate geom;
|
||||
extern crate gfx_traits;
|
||||
extern crate html5ever;
|
||||
extern crate encoding;
|
||||
extern crate fnv;
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
[2d.shadow.attributes.shadowBlur.initial.html]
|
||||
type: testharness
|
||||
[Canvas test: 2d.shadow.attributes.shadowBlur.initial]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.shadow.attributes.shadowColor.initial.html]
|
||||
type: testharness
|
||||
[Canvas test: 2d.shadow.attributes.shadowColor.initial]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.shadow.attributes.shadowColor.valid.html]
|
||||
type: testharness
|
||||
[Canvas test: 2d.shadow.attributes.shadowColor.valid]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.shadow.attributes.shadowOffset.initial.html]
|
||||
type: testharness
|
||||
[Canvas test: 2d.shadow.attributes.shadowOffset.initial]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.state.saverestore.shadowBlur.html]
|
||||
type: testharness
|
||||
[save()/restore() works for shadowBlur]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.state.saverestore.shadowColor.html]
|
||||
type: testharness
|
||||
[save()/restore() works for shadowColor]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.state.saverestore.shadowOffsetX.html]
|
||||
type: testharness
|
||||
[save()/restore() works for shadowOffsetX]
|
||||
expected: FAIL
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
[2d.state.saverestore.shadowOffsetY.html]
|
||||
type: testharness
|
||||
[save()/restore() works for shadowOffsetY]
|
||||
expected: FAIL
|
||||
|
|
@ -6747,18 +6747,6 @@
|
|||
[CanvasRenderingContext2D interface: operation createPattern(CanvasImageSource,DOMString)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: attribute shadowOffsetX]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: attribute shadowOffsetY]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: attribute shadowBlur]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: attribute shadowColor]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: operation drawSystemFocusRing(Element)]
|
||||
expected: FAIL
|
||||
|
||||
|
@ -6855,18 +6843,6 @@
|
|||
[CanvasRenderingContext2D interface: calling createPattern(CanvasImageSource,DOMString) on document.createElement("canvas").getContext("2d") with too few arguments must throw TypeError]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetX" with the proper type (21)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowOffsetY" with the proper type (22)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowBlur" with the proper type (23)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "shadowColor" with the proper type (24)]
|
||||
expected: FAIL
|
||||
|
||||
[CanvasRenderingContext2D interface: document.createElement("canvas").getContext("2d") must inherit property "drawSystemFocusRing" with the proper type (33)]
|
||||
expected: FAIL
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue