[librsvg: 4/6] rect: handle intersection of disjoint rects



commit b8c00b62e2fd3600e464f0185e11983e90c5f689
Author: Paolo Borelli <pborelli gnome org>
Date:   Tue May 15 09:20:41 2018 +0200

    rect: handle intersection of disjoint rects
    
    Let's return an empty rect in that case.

 rsvg_internals/src/rect.rs | 52 +++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 47 insertions(+), 5 deletions(-)
---
diff --git a/rsvg_internals/src/rect.rs b/rsvg_internals/src/rect.rs
index 06209f6c..1a6a6fa9 100644
--- a/rsvg_internals/src/rect.rs
+++ b/rsvg_internals/src/rect.rs
@@ -1,6 +1,11 @@
 use cairo;
 use cairo::MatrixTrait;
 
+#[allow(dead_code)]
+pub fn is_empty(r: &cairo::Rectangle) -> bool {
+    r.width == 0.0 || r.height == 0.0
+}
+
 pub fn intersect(r1: &cairo::Rectangle, r2: &cairo::Rectangle) -> cairo::Rectangle {
     let (x1, y1, x2, y2) = (
         r1.x.max(r2.x),
@@ -9,11 +14,20 @@ pub fn intersect(r1: &cairo::Rectangle, r2: &cairo::Rectangle) -> cairo::Rectang
         (r1.y + r1.height).min(r2.y + r2.height),
     );
 
-    cairo::Rectangle {
-        x: x1,
-        y: y1,
-        width: x2 - x1,
-        height: y2 - y1,
+    if x2 > x1 && y2 > y1 {
+        cairo::Rectangle {
+            x: x1,
+            y: y1,
+            width: x2 - x1,
+            height: y2 - y1,
+        }
+    } else {
+        cairo::Rectangle {
+            x: 0.0,
+            y: 0.0,
+            width: 0.0,
+            height: 0.0,
+        }
     }
 }
 
@@ -80,6 +94,25 @@ mod tests {
     use super::*;
     use float_eq_cairo::ApproxEqCairo;
 
+    #[test]
+    fn empty_rect() {
+        let empty = cairo::Rectangle {
+            x: 0.42,
+            y: 0.42,
+            width: 0.0,
+            height: 0.0,
+        };
+        let not_empty = cairo::Rectangle {
+            x: 0.22,
+            y: 0.22,
+            width: 3.14,
+            height: 3.14,
+        };
+
+        assert!(is_empty(&empty));
+        assert!(!is_empty(&not_empty));
+    }
+
     #[test]
     fn intersect_rects() {
         let r1 = cairo::Rectangle {
@@ -94,12 +127,21 @@ mod tests {
             width: 3.14,
             height: 3.14,
         };
+        let r3 = cairo::Rectangle {
+            x: 10.0,
+            y: 10.0,
+            width: 3.14,
+            height: 3.14,
+        };
 
         let r = intersect(&r1, &r2);
         assert_approx_eq_cairo!(0.42_f64, r.x);
         assert_approx_eq_cairo!(0.42_f64, r.y);
         assert_approx_eq_cairo!(2.94_f64, r.width);
         assert_approx_eq_cairo!(2.94_f64, r.height);
+
+        let r = intersect(&r1, &r3);
+        assert!(is_empty(&r));
     }
 
     #[test]


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