[librsvg: 4/6] rect: handle intersection of disjoint rects
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 4/6] rect: handle intersection of disjoint rects
- Date: Tue, 15 May 2018 15:08:53 +0000 (UTC)
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(¬_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]