12
12
#include "nr-rect-l.h"
15
NRRect::NRRect(NR::Rect const &rect)
16
: x0(rect.min()[NR::X]), y0(rect.min()[NR::Y]),
17
x1(rect.max()[NR::X]), y1(rect.max()[NR::Y])
20
NRRect::NRRect(NR::Maybe<NR::Rect> const &rect) {
22
x0 = rect->min()[NR::X];
23
y0 = rect->min()[NR::Y];
24
x1 = rect->max()[NR::X];
25
y1 = rect->max()[NR::Y];
27
nr_rect_d_set_empty(this);
31
NR::Maybe<NR::Rect> NRRect::upgrade() const {
32
if (nr_rect_d_test_empty(this)) {
35
return NR::Rect(NR::Point(x0, y0), NR::Point(x1, y1));
15
40
* \param r0 Rectangle.
73
// returns minimal rect which covers all of r0 not covered by r1
75
nr_rect_l_subtract(NRRectL *d, NRRectL const *r0, NRRectL const *r1)
77
bool inside1 = nr_rect_l_test_inside(r1, r0->x0, r0->y0);
78
bool inside2 = nr_rect_l_test_inside(r1, r0->x1, r0->y0);
79
bool inside3 = nr_rect_l_test_inside(r1, r0->x1, r0->y1);
80
bool inside4 = nr_rect_l_test_inside(r1, r0->x0, r0->y1);
82
if (inside1 && inside2 && inside3) {
83
nr_rect_l_set_empty (d);
85
} else if (inside1 && inside2) {
91
} else if (inside2 && inside3) {
97
} else if (inside3 && inside4) {
103
} else if (inside4 && inside1) {
119
NR::ICoord nr_rect_l_area(NRRectL *r)
121
if (!r || NR_RECT_DFLS_TEST_EMPTY (r)) {
124
return ((r->x1 - r->x0) * (r->y1 - r->y0));
49
128
nr_rect_d_union (NRRect *d, const NRRect *r0, const NRRect *r1)
150
229
return nr_rect_d_matrix_transform(d, s, *m);
232
/** Enlarges the rectangle given amount of pixels to all directions */
234
nr_rect_l_enlarge(NRRectL *d, int amount)
155
245
Rect::Rect(const Point &p0, const Point &p1)
156
: _min(MIN(p0[X], p1[X]), MIN(p0[Y], p1[Y])),
157
_max(MAX(p0[X], p1[X]), MAX(p0[Y], p1[Y])) {}
246
: _min(std::min(p0[X], p1[X]), std::min(p0[Y], p1[Y])),
247
_max(std::max(p0[X], p1[X]), std::max(p0[Y], p1[Y]))
159
250
/** returns the four corners of the rectangle in the correct winding order */
160
251
Point Rect::corner(unsigned i) const {
189
292
/** Makes this rectangle large enough to include the point p. */
190
293
void Rect::expandTo(Point p) {
191
294
for ( int i=0 ; i < 2 ; i++ ) {
192
_min[i] = MIN(_min[i], p[i]);
193
_max[i] = MAX(_max[i], p[i]);
295
_min[i] = std::min(_min[i], p[i]);
296
_max[i] = std::max(_max[i], p[i]);
300
void Rect::growBy(double size) {
301
for ( unsigned d = 0 ; d < 2 ; d++ ) {
304
if ( _min[d] > _max[d] ) {
305
_min[d] = _max[d] = ( _min[d] + _max[d] ) / 2;
197
310
/** Returns the set of points shared by both rectangles. */
198
Maybe<Rect> Rect::intersection(const Rect &a, const Rect &b) {
200
for ( int i=0 ; i < 2 ; i++ ) {
201
r._min[i] = MAX(a._min[i], b._min[i]);
202
r._max[i] = MIN(a._max[i], b._max[i]);
204
if ( r._min[i] > r._max[i] ) {
311
Maybe<Rect> intersection(Maybe<Rect> const & a, Maybe<Rect> const & b) {
316
for ( int i=0 ; i < 2 ; i++ ) {
317
r._min[i] = std::max(a->_min[i], b->_min[i]);
318
r._max[i] = std::min(a->_max[i], b->_max[i]);
319
if ( r._min[i] > r._max[i] ) {
211
327
/** returns the smallest rectangle containing both rectangles */
212
Rect Rect::union_bounds(const Rect &a, const Rect &b) {
214
for ( int i=0; i < 2 ; i++ ) {
215
r._min[i] = MIN(a._min[i], b._min[i]);
216
r._max[i] = MAX(a._max[i], b._max[i]);
328
Rect union_bounds(Rect const &a, Rect const &b) {
330
for ( int i=0 ; i < 2 ; i++ ) {
331
r._min[i] = std::min(a._min[i], b._min[i]);
332
r._max[i] = std::max(a._max[i], b._max[i]);
221
337
} // namespace NR