[librsvg/librsvg-2.52: 4/21] Revert "Path::to_cairo - strip out paths composed only of MoveTo"




commit 8742a8e8211d46b2f387dd24f2a598cde19a0368
Author: Federico Mena Quintero <federico gnome org>
Date:   Fri Mar 4 21:31:45 2022 -0600

    Revert "Path::to_cairo - strip out paths composed only of MoveTo"
    
    This reverts commit 0615983c493b7e1fda19c21da48f315d23f8c10f.
    
    Part-of: <https://gitlab.gnome.org/GNOME/librsvg/-/merge_requests/672>

 src/drawing_ctx.rs | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)
---
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs
index 3946a6fed..3b8e28321 100644
--- a/src/drawing_ctx.rs
+++ b/src/drawing_ctx.rs
@@ -2233,11 +2233,17 @@ impl Path {
     fn from_cairo(cairo_path: cairo::Path) -> Path {
         let mut builder = PathBuilder::default();
 
-        // Cairo has the habit of appending a MoveTo to some paths, but we don't want a
-        // path for empty text to generate that lone point.  So, strip out paths composed
-        // only of MoveTo.
+        // First, see if the path is a single MoveTo(0, 0).  Cairo does this when the code that
+        // generated the path didn't include any commands, due to the way it appends a MoveTo to
+        // some paths.
+        //
+        // Only do the conversion if the path is not empty; otherwise
+        // really return a librsvg path with no commands.
 
-        if !cairo_path_is_only_move_tos(&cairo_path) {
+        if !cairo_path
+            .iter()
+            .eq([cairo::PathSegment::MoveTo((0.0, 0.0))])
+        {
             for segment in cairo_path.iter() {
                 match segment {
                     cairo::PathSegment::MoveTo((x, y)) => builder.move_to(x, y),
@@ -2254,10 +2260,6 @@ impl Path {
     }
 }
 
-fn cairo_path_is_only_move_tos(path: &cairo::Path) -> bool {
-    path.iter().all(|seg| matches!(seg, cairo::PathSegment::MoveTo((_, _))))
-}
-
 impl PathCommand {
     fn to_cairo(&self, cr: &cairo::Context) {
         match *self {
@@ -2352,14 +2354,14 @@ mod tests {
         let layout = pango::Layout::new(&context);
         layout.set_text("");
 
-        let path = pango_layout_to_path(10.0, 20.0, &layout, pango::Gravity::Auto).unwrap();
+        let path = pango_layout_to_path(0.0, 0.0, &layout, pango::Gravity::Auto).unwrap();
         assert!(path.is_empty());
 
         // only whitespace
 
         layout.set_text(" ");
 
-        let path = pango_layout_to_path(10.0, 20.0, &layout, pango::Gravity::Auto).unwrap();
+        let path = pango_layout_to_path(0.0, 0.0, &layout, pango::Gravity::Auto).unwrap();
         assert!(path.is_empty());
     }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]