Code

Merge from fe-moved
[inkscape.git] / src / libnr / nr-rect.cpp
index d4ba14e1aabb309affe52c70ff2ed705fb6eef56..1e1f3610443513441fea885abae7ebd4bf600d0c 100644 (file)
@@ -17,7 +17,7 @@ NRRect::NRRect(NR::Rect const &rect)
   x1(rect.max()[NR::X]), y1(rect.max()[NR::Y])
 {}
 
-NRRect::NRRect(NR::Maybe<NR::Rect> const &rect) {
+NRRect::NRRect(boost::optional<NR::Rect> const &rect) {
     if (rect) {
         x0 = rect->min()[NR::X];
         y0 = rect->min()[NR::Y];
@@ -28,14 +28,33 @@ NRRect::NRRect(NR::Maybe<NR::Rect> const &rect) {
     }
 }
 
-NR::Maybe<NR::Rect> NRRect::upgrade() const {
-    if (nr_rect_d_test_empty(this)) {
-        return NR::Nothing();
+NRRect::NRRect(Geom::OptRect const &rect) {
+    if (rect) {
+        x0 = rect->min()[Geom::X];
+        y0 = rect->min()[Geom::Y];
+        x1 = rect->max()[Geom::X];
+        y1 = rect->max()[Geom::Y];
+    } else {
+        nr_rect_d_set_empty(this);
+    }
+}
+
+boost::optional<NR::Rect> NRRect::upgrade() const {
+    if (nr_rect_d_test_empty_ptr(this)) {
+        return boost::optional<NR::Rect>();
     } else {
         return NR::Rect(NR::Point(x0, y0), NR::Point(x1, y1));
     }
 }
 
+Geom::OptRect NRRect::upgrade_2geom() const {
+    if (nr_rect_d_test_empty_ptr(this)) {
+        return Geom::OptRect();
+    } else {
+        return Geom::Rect(Geom::Point(x0, y0), Geom::Point(x1, y1));
+    }
+}
+
 /**
  *    \param r0 Rectangle.
  *    \param r1 Another rectangle.
@@ -204,7 +223,7 @@ nr_rect_d_matrix_transform(NRRect *d, NRRect const *const s, NR::Matrix const &m
     using NR::X;
     using NR::Y;
 
-    if (nr_rect_d_test_empty(s)) {
+    if (nr_rect_d_test_empty_ptr(s)) {
         nr_rect_d_set_empty(d);
     } else {
         NR::Point const c00(NR::Point(s->x0, s->y0) * m);
@@ -224,7 +243,7 @@ nr_rect_d_matrix_transform(NRRect *d, NRRect const *const s, NR::Matrix const &m
 }
 
 NRRect *
-nr_rect_d_matrix_transform(NRRect *d, NRRect const *s, NRMatrix const *m)
+nr_rect_d_matrix_transform(NRRect *d, NRRect const *s, NR::Matrix const *m)
 {
     return nr_rect_d_matrix_transform(d, s, *m);
 }
@@ -245,13 +264,7 @@ namespace NR {
 Rect::Rect(const Point &p0, const Point &p1)
 : _min(std::min(p0[X], p1[X]), std::min(p0[Y], p1[Y])),
   _max(std::max(p0[X], p1[X]), std::max(p0[Y], p1[Y]))
-{
-    if (0) {
-    if ( _min[X] == _max[X] || _min[Y] == _max[Y] ) {
-        throw EmptyRectangle();
-    }
-    }
-}
+{}
 
 /** returns the four corners of the rectangle in the correct winding order */
 Point Rect::corner(unsigned i) const {
@@ -272,6 +285,18 @@ Point Rect::midpoint() const {
        return ( _min + _max ) / 2;
 }
 
+Point Rect::cornerFarthestFrom(Point const &p) const {
+    Point m = midpoint();
+    unsigned i = 0;
+    if (p[X] < m[X]) {
+        i = 1;
+    }
+    if (p[Y] < m[Y]) {
+        i = 3 - i;
+    }
+    return corner(i);
+}
+
 /** returns a vector from topleft to bottom right. */
 Point Rect::dimensions() const {
        return _max - _min;
@@ -291,18 +316,28 @@ void Rect::expandTo(Point p) {
        }
 }
 
+void Rect::growBy(double size) {
+  for ( unsigned d = 0 ; d < 2 ; d++ ) {
+    _min[d] -= size;
+    _max[d] += size;
+    if ( _min[d] > _max[d] ) {
+      _min[d] = _max[d] = ( _min[d] + _max[d] ) / 2;
+    }
+  }
+} 
+
 /** Returns the set of points shared by both rectangles. */
-Maybe<Rect> intersection(Maybe<Rect> const & a, Maybe<Rect> const & b) {
+boost::optional<Rect> intersection(boost::optional<Rect> const & a, boost::optional<Rect> const & b) {
     if ( !a || !b ) {
-        return Nothing();
+        return boost::optional<Rect>();
     } else {
         Rect r;
         for ( int i=0 ; i < 2 ; i++ ) {
             r._min[i] = std::max(a->_min[i], b->_min[i]);
             r._max[i] = std::min(a->_max[i], b->_max[i]);
-            if ( r._min[i] >= r._max[i] ) {
-               return Nothing();
-            }
+            if ( r._min[i] > r._max[i] ) {
+            return boost::optional<Rect>();
+        }
        }
        return r;
     }