From 2a0be451aeb3a3fe184c9cf8c6ae44058044009b Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Sun, 25 Aug 2019 15:44:35 +0200 Subject: [PATCH 1/6] Implement Path::contains_point() --- components/canvas/raqote_backend.rs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 279402fa77a..b5bcf100b60 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -11,6 +11,7 @@ use crate::canvas_paint_thread::AntialiasMode; use canvas_traits::canvas::*; use cssparser::RGBA; use euclid::default::{Point2D, Rect, Size2D, Transform2D, Vector2D}; +use raqote::PathOp; use std::marker::PhantomData; pub struct RaqoteBackend; @@ -183,8 +184,28 @@ impl Path { unimplemented!() } - pub fn contains_point(&self, _x: f64, _y: f64, _path_transform: &Transform2D) -> bool { - unimplemented!() + pub fn contains_point(&self, x: f64, y: f64, _path_transform: &Transform2D) -> bool { + for op in self.as_raqote().ops.iter() { + match op { + PathOp::MoveTo(point) | PathOp::LineTo(point) => { + if point.x as f64 == x && point.y as f64 == y { + return true; + } + }, + PathOp::QuadTo(_, point) => { + if point.x as f64 == x && point.y as f64 == y { + return true; + } + }, + PathOp::CubicTo(_, _, point) => { + if point.x as f64 == x && point.y as f64 == y { + return true; + } + }, + _ => {}, + } + } + false } pub fn copy_to_builder(&self) -> Box { From ee7f3dbc468841e196da402bc6d3d607e4dddc35 Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Sun, 25 Aug 2019 16:19:33 +0200 Subject: [PATCH 2/6] Implement PathBuilder::get_current_point() --- components/canvas/raqote_backend.rs | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index b5bcf100b60..137b00e4bf0 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -509,7 +509,19 @@ impl GenericPathBuilder for PathBuilder { unimplemented!(); } fn get_current_point(&mut self) -> Point2D { - unimplemented!(); + let path = self.finish(); + + for op in path.as_raqote().ops.iter().rev() { + match op { + PathOp::MoveTo(point) | PathOp::LineTo(point) => { + return Point2D::new(point.x, point.y) + }, + PathOp::CubicTo(_, _, point) => return Point2D::new(point.x, point.y), + PathOp::QuadTo(_, point) => return Point2D::new(point.x, point.y), + _ => {}, + }; + } + panic!("dead end"); } fn line_to(&mut self, point: Point2D) { self.0.as_mut().unwrap().line_to(point.x, point.y); From 89b8bd516fb2173ecd0f7eef98dc3744a0ddccc3 Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Sun, 25 Aug 2019 16:43:29 +0200 Subject: [PATCH 3/6] Refactor Path::contains_point() using any() --- components/canvas/raqote_backend.rs | 29 ++++++++--------------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 137b00e4bf0..7dc84610809 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -185,27 +185,14 @@ impl Path { } pub fn contains_point(&self, x: f64, y: f64, _path_transform: &Transform2D) -> bool { - for op in self.as_raqote().ops.iter() { - match op { - PathOp::MoveTo(point) | PathOp::LineTo(point) => { - if point.x as f64 == x && point.y as f64 == y { - return true; - } - }, - PathOp::QuadTo(_, point) => { - if point.x as f64 == x && point.y as f64 == y { - return true; - } - }, - PathOp::CubicTo(_, _, point) => { - if point.x as f64 == x && point.y as f64 == y { - return true; - } - }, - _ => {}, - } - } - false + self.as_raqote().ops.iter().any(|op| match op { + PathOp::MoveTo(point) | PathOp::LineTo(point) => { + point.x as f64 == x && point.y as f64 == y + }, + PathOp::QuadTo(_, point) => point.x as f64 == x && point.y as f64 == y, + PathOp::CubicTo(_, _, point) => point.x as f64 == x && point.y as f64 == y, + _ => false, + }) } pub fn copy_to_builder(&self) -> Box { From 7c81d20869bf9cbb475553bcfca386277fc1c58c Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Thu, 29 Aug 2019 14:17:03 +0200 Subject: [PATCH 4/6] Implement create_gradient_stops() --- components/canvas/canvas_data.rs | 4 ++-- components/canvas/raqote_backend.rs | 16 ++++++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/components/canvas/canvas_data.rs b/components/canvas/canvas_data.rs index f2df5bf179d..78c32b4d813 100644 --- a/components/canvas/canvas_data.rs +++ b/components/canvas/canvas_data.rs @@ -302,14 +302,14 @@ pub enum GradientStop { #[cfg(feature = "canvas2d-azure")] Azure(azure::AzGradientStop), #[cfg(feature = "canvas2d-raqote")] - Raqote(()), + Raqote(raqote::GradientStop), } pub enum GradientStops { #[cfg(feature = "canvas2d-azure")] Azure(azure::azure_hl::GradientStops), #[cfg(feature = "canvas2d-raqote")] - Raqote(()), + Raqote(Vec), } #[derive(Clone)] diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 7dc84610809..1bbc23a983f 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -246,10 +246,14 @@ impl GenericDrawTarget for raqote::DrawTarget { } fn create_gradient_stops( &self, - _gradient_stops: Vec, + gradient_stops: Vec, _extend_mode: ExtendMode, ) -> GradientStops { - unimplemented!(); + let stops = gradient_stops + .into_iter() + .map(|item| item.as_raqote().clone()) + .collect(); + GradientStops::Raqote(stops) } fn create_path_builder(&self) -> Box { Box::new(PathBuilder::new()) @@ -679,3 +683,11 @@ impl SourceSurface { } } } + +impl GradientStop { + fn as_raqote(&self) -> &raqote::GradientStop { + match self { + GradientStop::Raqote(s) => s, + } + } +} From 47a6129332b81665389fc6cf796816df1a646ad8 Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Sun, 1 Sep 2019 19:22:20 +0200 Subject: [PATCH 5/6] Use raqote's implementation of Path::contains_point() --- Cargo.lock | 2 +- components/canvas/raqote_backend.rs | 10 ++-------- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 268d829cedb..f5704962d55 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3712,7 +3712,7 @@ dependencies = [ [[package]] name = "raqote" version = "0.6.2-alpha.0" -source = "git+https://github.com/jrmuizel/raqote#b3675e6cc1ac1d854605918f6613b64636d5e47b" +source = "git+https://github.com/jrmuizel/raqote#b1437ce88d27d376520485a1f8d60c5a480be5c1" dependencies = [ "euclid 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", "font-kit 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 1bbc23a983f..4534077b0dd 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -185,14 +185,8 @@ impl Path { } pub fn contains_point(&self, x: f64, y: f64, _path_transform: &Transform2D) -> bool { - self.as_raqote().ops.iter().any(|op| match op { - PathOp::MoveTo(point) | PathOp::LineTo(point) => { - point.x as f64 == x && point.y as f64 == y - }, - PathOp::QuadTo(_, point) => point.x as f64 == x && point.y as f64 == y, - PathOp::CubicTo(_, _, point) => point.x as f64 == x && point.y as f64 == y, - _ => false, - }) + let path = self.as_raqote(); + path.contains_point(0.1, path.winding, x as f32, y as f32) } pub fn copy_to_builder(&self) -> Box { From d24568218b2046560be29f35daa67cbf405e9281 Mon Sep 17 00:00:00 2001 From: pylbrecht Date: Sun, 1 Sep 2019 19:26:04 +0200 Subject: [PATCH 6/6] Don't use catch all in match --- components/canvas/raqote_backend.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 4534077b0dd..bd25b5fb9de 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -503,7 +503,7 @@ impl GenericPathBuilder for PathBuilder { }, PathOp::CubicTo(_, _, point) => return Point2D::new(point.x, point.y), PathOp::QuadTo(_, point) => return Point2D::new(point.x, point.y), - _ => {}, + PathOp::Close => {}, }; } panic!("dead end");