Add attributes for canvas shadows.

This commit is contained in:
Hyowon Kim 2015-06-04 17:12:41 +09:00
parent 37fcced0fa
commit 473afdb196
15 changed files with 106 additions and 70 deletions

View file

@ -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

View file

@ -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)]

View file

@ -39,6 +39,9 @@ path = "../style"
[dependencies.gfx]
path = "../gfx"
[dependencies.gfx_traits]
path = "../gfx_traits"
[dependencies.canvas]
path = "../canvas"

View file

@ -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 {

View file

@ -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]

View file

@ -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;

View file

@ -1,5 +0,0 @@
[2d.shadow.attributes.shadowBlur.initial.html]
type: testharness
[Canvas test: 2d.shadow.attributes.shadowBlur.initial]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.shadow.attributes.shadowColor.initial.html]
type: testharness
[Canvas test: 2d.shadow.attributes.shadowColor.initial]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.shadow.attributes.shadowColor.valid.html]
type: testharness
[Canvas test: 2d.shadow.attributes.shadowColor.valid]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.shadow.attributes.shadowOffset.initial.html]
type: testharness
[Canvas test: 2d.shadow.attributes.shadowOffset.initial]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.state.saverestore.shadowBlur.html]
type: testharness
[save()/restore() works for shadowBlur]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.state.saverestore.shadowColor.html]
type: testharness
[save()/restore() works for shadowColor]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.state.saverestore.shadowOffsetX.html]
type: testharness
[save()/restore() works for shadowOffsetX]
expected: FAIL

View file

@ -1,5 +0,0 @@
[2d.state.saverestore.shadowOffsetY.html]
type: testharness
[save()/restore() works for shadowOffsetY]
expected: FAIL

View file

@ -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