summaryrefslogtreecommitdiffstats
path: root/src/libnr/nr-rect.cpp
diff options
context:
space:
mode:
authorbulia byak <buliabyak@gmail.com>2006-10-16 06:41:07 +0000
committerbuliabyak <buliabyak@users.sourceforge.net>2006-10-16 06:41:07 +0000
commitfc9793730d8c73a72daf8c0bff66e14bcb5cb7d4 (patch)
tree21ba63a63d3c53050ad38c9651a8e9e174003428 /src/libnr/nr-rect.cpp
parentreally add video templates (diff)
downloadinkscape-fc9793730d8c73a72daf8c0bff66e14bcb5cb7d4.tar.gz
inkscape-fc9793730d8c73a72daf8c0bff66e14bcb5cb7d4.zip
some more NRRectL goodies for canvas optimizations
(bzr r1804)
Diffstat (limited to 'src/libnr/nr-rect.cpp')
-rw-r--r--src/libnr/nr-rect.cpp54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/libnr/nr-rect.cpp b/src/libnr/nr-rect.cpp
index 6d881e7b0..460816021 100644
--- a/src/libnr/nr-rect.cpp
+++ b/src/libnr/nr-rect.cpp
@@ -45,6 +45,60 @@ nr_rect_d_intersect (NRRect *d, const NRRect *r0, const NRRect *r1)
return d;
}
+// returns minimal rect which covers all of r0 not covered by r1
+NRRectL *
+nr_rect_l_subtract(NRRectL *d, NRRectL const *r0, NRRectL const *r1)
+{
+ bool inside1 = nr_rect_l_test_inside(r1, r0->x0, r0->y0);
+ bool inside2 = nr_rect_l_test_inside(r1, r0->x1, r0->y0);
+ bool inside3 = nr_rect_l_test_inside(r1, r0->x1, r0->y1);
+ bool inside4 = nr_rect_l_test_inside(r1, r0->x0, r0->y1);
+
+ if (inside1 && inside2 && inside3) {
+ nr_rect_l_set_empty (d);
+
+ } else if (inside1 && inside2) {
+ d->x0 = r0->x0;
+ d->y0 = r1->y1;
+
+ d->x1 = r0->x1;
+ d->y1 = r0->y1;
+ } else if (inside2 && inside3) {
+ d->x0 = r0->x0;
+ d->y0 = r0->y0;
+
+ d->x1 = r1->x0;
+ d->y1 = r0->y1;
+ } else if (inside3 && inside4) {
+ d->x0 = r0->x0;
+ d->y0 = r0->y0;
+
+ d->x1 = r0->x1;
+ d->y1 = r1->y0;
+ } else if (inside4 && inside1) {
+ d->x0 = r1->x1;
+ d->y0 = r0->y0;
+
+ d->x1 = r0->x1;
+ d->y1 = r0->y1;
+ } else {
+ d->x0 = r0->x0;
+ d->y0 = r0->y0;
+
+ d->x1 = r0->x1;
+ d->y1 = r0->y1;
+ }
+ return d;
+}
+
+NR::ICoord nr_rect_l_area(NRRectL *r)
+{
+ if (!r || NR_RECT_DFLS_TEST_EMPTY (r)) {
+ return 0;
+ }
+ return ((r->x1 - r->x0) * (r->y1 - r->y0));
+}
+
NRRect *
nr_rect_d_union (NRRect *d, const NRRect *r0, const NRRect *r1)
{