X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Flibnr%2Fnr-rect.cpp;h=1e1f3610443513441fea885abae7ebd4bf600d0c;hb=6c3e745a94ef6b25a4ef9f018d350a7535aa45af;hp=76d7fff8dd8ce956bc4f6b326d698a0992821253;hpb=50b21b29fcfca7cc52aa9b53552abc6376b1cc07;p=inkscape.git diff --git a/src/libnr/nr-rect.cpp b/src/libnr/nr-rect.cpp index 76d7fff8d..1e1f36104 100644 --- a/src/libnr/nr-rect.cpp +++ b/src/libnr/nr-rect.cpp @@ -10,6 +10,50 @@ */ #include "nr-rect-l.h" +#include + +NRRect::NRRect(NR::Rect const &rect) +: x0(rect.min()[NR::X]), y0(rect.min()[NR::Y]), + x1(rect.max()[NR::X]), y1(rect.max()[NR::Y]) +{} + +NRRect::NRRect(boost::optional const &rect) { + if (rect) { + x0 = rect->min()[NR::X]; + y0 = rect->min()[NR::Y]; + x1 = rect->max()[NR::X]; + y1 = rect->max()[NR::Y]; + } else { + nr_rect_d_set_empty(this); + } +} + +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 NRRect::upgrade() const { + if (nr_rect_d_test_empty_ptr(this)) { + return boost::optional(); + } 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. @@ -179,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); @@ -199,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); } @@ -218,8 +262,9 @@ nr_rect_l_enlarge(NRRectL *d, int amount) namespace NR { Rect::Rect(const Point &p0, const Point &p1) -: _min(MIN(p0[X], p1[X]), MIN(p0[Y], p1[Y])), - _max(MAX(p0[X], p1[X]), MAX(p0[Y], p1[Y])) {} +: _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])) +{} /** returns the four corners of the rectangle in the correct winding order */ Point Rect::corner(unsigned i) const { @@ -240,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; @@ -254,34 +311,44 @@ void Rect::offset(Point p) { /** Makes this rectangle large enough to include the point p. */ void Rect::expandTo(Point p) { for ( int i=0 ; i < 2 ; i++ ) { - _min[i] = MIN(_min[i], p[i]); - _max[i] = MAX(_max[i], p[i]); + _min[i] = std::min(_min[i], p[i]); + _max[i] = std::max(_max[i], p[i]); } } +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 const &a, Maybe const &b) { +boost::optional intersection(boost::optional const & a, boost::optional const & b) { if ( !a || !b ) { - return Nothing(); + return boost::optional(); } else { Rect r; for ( int i=0 ; i < 2 ; i++ ) { - r._min[i] = MAX(a->_min[i], b->_min[i]); - r._max[i] = MIN(a->_max[i], b->_max[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(); - } + return boost::optional(); + } } return r; } } /** returns the smallest rectangle containing both rectangles */ -Rect Rect::union_bounds(Rect const &a, Rect const &b) { +Rect union_bounds(Rect const &a, Rect const &b) { Rect r; for ( int i=0 ; i < 2 ; i++ ) { - r._min[i] = MIN(a._min[i], b._min[i]); - r._max[i] = MAX(a._max[i], b._max[i]); + r._min[i] = std::min(a._min[i], b._min[i]); + r._max[i] = std::max(a._max[i], b._max[i]); } return r; }