diff options
author | Alan Jeffrey <ajeffrey@mozilla.com> | 2017-06-23 11:07:02 -0500 |
---|---|---|
committer | Alan Jeffrey <ajeffrey@mozilla.com> | 2017-07-20 17:25:50 -0500 |
commit | caa35852197cd96e6c6ece42d346c45b36ff14f2 (patch) | |
tree | 722ba1e0e3d2dd196bbe290546d9cb8eb0463060 /components/script/dom/paintrenderingcontext2d.rs | |
parent | e19fefcb474ea6593a684a1ca4ce616e61188ff0 (diff) | |
download | servo-caa35852197cd96e6c6ece42d346c45b36ff14f2.tar.gz servo-caa35852197cd96e6c6ece42d346c45b36ff14f2.zip |
Fixed scaling artefacts in paint worklets caused by zoom and hidpi.
Diffstat (limited to 'components/script/dom/paintrenderingcontext2d.rs')
-rw-r--r-- | components/script/dom/paintrenderingcontext2d.rs | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/components/script/dom/paintrenderingcontext2d.rs b/components/script/dom/paintrenderingcontext2d.rs index dd91ec0960e..48ae1b18637 100644 --- a/components/script/dom/paintrenderingcontext2d.rs +++ b/components/script/dom/paintrenderingcontext2d.rs @@ -2,7 +2,6 @@ * 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 app_units::Au; use canvas_traits::CanvasData; use canvas_traits::CanvasMsg; use canvas_traits::FromLayoutMsg; @@ -26,12 +25,18 @@ use dom::canvaspattern::CanvasPattern; use dom::canvasrenderingcontext2d::CanvasRenderingContext2D; use dom::paintworkletglobalscope::PaintWorkletGlobalScope; use dom_struct::dom_struct; +use euclid::ScaleFactor; use euclid::Size2D; +use euclid::TypedSize2D; use ipc_channel::ipc::IpcSender; +use std::cell::Cell; +use style_traits::CSSPixel; +use style_traits::DevicePixel; #[dom_struct] pub struct PaintRenderingContext2D { context: CanvasRenderingContext2D, + device_pixel_ratio: Cell<ScaleFactor<f32, CSSPixel, DevicePixel>>, } impl PaintRenderingContext2D { @@ -39,6 +44,7 @@ impl PaintRenderingContext2D { let size = Size2D::zero(); PaintRenderingContext2D { context: CanvasRenderingContext2D::new_inherited(global.upcast(), None, size), + device_pixel_ratio: Cell::new(ScaleFactor::new(1.0)), } } @@ -53,9 +59,21 @@ impl PaintRenderingContext2D { let _ = self.context.ipc_renderer().send(msg); } - pub fn set_bitmap_dimensions(&self, size: Size2D<Au>) { - let size = Size2D::new(size.width.to_px(), size.height.to_px()); - self.context.set_bitmap_dimensions(size); + pub fn set_bitmap_dimensions(&self, + size: TypedSize2D<f32, CSSPixel>, + device_pixel_ratio: ScaleFactor<f32, CSSPixel, DevicePixel>) + { + let size = size * device_pixel_ratio; + self.device_pixel_ratio.set(device_pixel_ratio); + self.context.set_bitmap_dimensions(size.to_untyped().to_i32()); + self.scale_by_device_pixel_ratio(); + } + + fn scale_by_device_pixel_ratio(&self) { + let device_pixel_ratio = self.device_pixel_ratio.get().get() as f64; + if device_pixel_ratio != 1.0 { + self.Scale(device_pixel_ratio, device_pixel_ratio); + } } } @@ -92,12 +110,14 @@ impl PaintRenderingContext2DMethods for PaintRenderingContext2D { // https://html.spec.whatwg.org/multipage/#dom-context-2d-settransform fn SetTransform(&self, a: f64, b: f64, c: f64, d: f64, e: f64, f: f64) { - self.context.SetTransform(a, b, c, d, e, f) + self.context.SetTransform(a, b, c, d, e, f); + self.scale_by_device_pixel_ratio(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-resettransform fn ResetTransform(&self) { - self.context.ResetTransform() + self.context.ResetTransform(); + self.scale_by_device_pixel_ratio(); } // https://html.spec.whatwg.org/multipage/#dom-context-2d-globalalpha |