From 473afdb196f5fa3eb4680c853e5a288f904d3f22 Mon Sep 17 00:00:00 2001 From: Hyowon Kim Date: Thu, 4 Jun 2015 17:12:41 +0900 Subject: [PATCH] Add attributes for canvas shadows. --- components/canvas/canvas_paint_task.rs | 30 ++++++++- components/canvas_traits/lib.rs | 6 +- components/script/Cargo.toml | 3 + .../script/dom/canvasrenderingcontext2d.rs | 64 +++++++++++++++++++ .../webidls/CanvasRenderingContext2D.webidl | 8 +-- components/script/lib.rs | 1 + ...dow.attributes.shadowBlur.initial.html.ini | 5 -- ...ow.attributes.shadowColor.initial.html.ini | 5 -- ...adow.attributes.shadowColor.valid.html.ini | 5 -- ...w.attributes.shadowOffset.initial.html.ini | 5 -- .../2d.state.saverestore.shadowBlur.html.ini | 5 -- .../2d.state.saverestore.shadowColor.html.ini | 5 -- ...d.state.saverestore.shadowOffsetX.html.ini | 5 -- ...d.state.saverestore.shadowOffsetY.html.ini | 5 -- .../wpt/metadata/html/dom/interfaces.html.ini | 24 ------- 15 files changed, 106 insertions(+), 70 deletions(-) delete mode 100644 tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowBlur.initial.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.initial.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.valid.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowOffset.initial.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowBlur.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowColor.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetX.html.ini delete mode 100644 tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetY.html.ini diff --git a/components/canvas/canvas_paint_task.rs b/components/canvas/canvas_paint_task.rs index 4b478f029b8..df2624d5417 100644 --- a/components/canvas/canvas_paint_task.rs +++ b/components/canvas/canvas_paint_task.rs @@ -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, + 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 diff --git a/components/canvas_traits/lib.rs b/components/canvas_traits/lib.rs index d0ad89ce284..9fc093cefaf 100644 --- a/components/canvas_traits/lib.rs +++ b/components/canvas_traits/lib.rs @@ -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), + SetShadowOffsetX(f64), + SetShadowOffsetY(f64), + SetShadowBlur(f64), + SetShadowColor(AzColor), } #[derive(Clone)] diff --git a/components/script/Cargo.toml b/components/script/Cargo.toml index a7bc559ba7a..cf3a2c7f397 100644 --- a/components/script/Cargo.toml +++ b/components/script/Cargo.toml @@ -39,6 +39,9 @@ path = "../style" [dependencies.gfx] path = "../gfx" +[dependencies.gfx_traits] +path = "../gfx_traits" + [dependencies.canvas] path = "../canvas" diff --git a/components/script/dom/canvasrenderingcontext2d.rs b/components/script/dom/canvasrenderingcontext2d.rs index 5cda56f085d..4902bf6ed14 100644 --- a/components/script/dom/canvasrenderingcontext2d.rs +++ b/components/script/dom/canvasrenderingcontext2d.rs @@ -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, + 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 { diff --git a/components/script/dom/webidls/CanvasRenderingContext2D.webidl b/components/script/dom/webidls/CanvasRenderingContext2D.webidl index e9ce0aa78e1..c8816864afb 100644 --- a/components/script/dom/webidls/CanvasRenderingContext2D.webidl +++ b/components/script/dom/webidls/CanvasRenderingContext2D.webidl @@ -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] diff --git a/components/script/lib.rs b/components/script/lib.rs index a51d10fea35..d250a065e2e 100644 --- a/components/script/lib.rs +++ b/components/script/lib.rs @@ -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; diff --git a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowBlur.initial.html.ini b/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowBlur.initial.html.ini deleted file mode 100644 index 656c915e09e..00000000000 --- a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowBlur.initial.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.shadow.attributes.shadowBlur.initial.html] - type: testharness - [Canvas test: 2d.shadow.attributes.shadowBlur.initial] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.initial.html.ini b/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.initial.html.ini deleted file mode 100644 index 62b49e7faad..00000000000 --- a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.initial.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.shadow.attributes.shadowColor.initial.html] - type: testharness - [Canvas test: 2d.shadow.attributes.shadowColor.initial] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.valid.html.ini b/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.valid.html.ini deleted file mode 100644 index f44dd1df35d..00000000000 --- a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowColor.valid.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.shadow.attributes.shadowColor.valid.html] - type: testharness - [Canvas test: 2d.shadow.attributes.shadowColor.valid] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowOffset.initial.html.ini b/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowOffset.initial.html.ini deleted file mode 100644 index 4566136259b..00000000000 --- a/tests/wpt/metadata/2dcontext/shadows/2d.shadow.attributes.shadowOffset.initial.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.shadow.attributes.shadowOffset.initial.html] - type: testharness - [Canvas test: 2d.shadow.attributes.shadowOffset.initial] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowBlur.html.ini b/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowBlur.html.ini deleted file mode 100644 index 9ff47aacc2a..00000000000 --- a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowBlur.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.state.saverestore.shadowBlur.html] - type: testharness - [save()/restore() works for shadowBlur] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowColor.html.ini b/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowColor.html.ini deleted file mode 100644 index 355e874c45e..00000000000 --- a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowColor.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.state.saverestore.shadowColor.html] - type: testharness - [save()/restore() works for shadowColor] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetX.html.ini b/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetX.html.ini deleted file mode 100644 index e77591be6f6..00000000000 --- a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetX.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.state.saverestore.shadowOffsetX.html] - type: testharness - [save()/restore() works for shadowOffsetX] - expected: FAIL - diff --git a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetY.html.ini b/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetY.html.ini deleted file mode 100644 index 23b0fdd1133..00000000000 --- a/tests/wpt/metadata/2dcontext/the-canvas-state/2d.state.saverestore.shadowOffsetY.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[2d.state.saverestore.shadowOffsetY.html] - type: testharness - [save()/restore() works for shadowOffsetY] - expected: FAIL - diff --git a/tests/wpt/metadata/html/dom/interfaces.html.ini b/tests/wpt/metadata/html/dom/interfaces.html.ini index edd9b210e49..daf3c5687aa 100644 --- a/tests/wpt/metadata/html/dom/interfaces.html.ini +++ b/tests/wpt/metadata/html/dom/interfaces.html.ini @@ -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