From: Matthew Fernandez Date: Thu, 24 Nov 2022 17:40:02 +0000 (-0800) Subject: ortho: use a bit array for trapezoid 'visited' array X-Git-Tag: 7.0.4~2^2~7 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d67eed3962135cf75498311e1a11849c7919326f;p=graphviz ortho: use a bit array for trapezoid 'visited' array Slightly reduces memory usage. --- diff --git a/lib/ortho/partition.c b/lib/ortho/partition.c index adbc6e4ae..9a54c03e7 100644 --- a/lib/ortho/partition.c +++ b/lib/ortho/partition.c @@ -10,6 +10,7 @@ #include "config.h" #include +#include #include #include #include @@ -313,19 +314,19 @@ make_new_monotone_poly (int mcur, int v0, int v1) } /* recursively visit all the trapezoids */ -static int traverse_polygon(int *visited, boxf *decomp, int size, +static int traverse_polygon(bitarray_t *visited, boxf *decomp, int size, segment_t *seg, traps_t *tr, int mcur, int trnum, int from, int flip, int dir) { trap_t *t; int mnew; int v0, v1; - if (trnum <= 0 || visited[trnum]) + if (trnum <= 0 || bitarray_get(*visited, trnum)) return size; t = &tr->data[trnum]; - visited[trnum] = TRUE; + bitarray_set(visited, trnum, true); if (t->hi.y > t->lo.y + C_EPS && FP_EQUAL(seg[t->lseg].v0.x, seg[t->lseg].v1.x) && FP_EQUAL(seg[t->rseg].v0.x, seg[t->rseg].v1.x)) { @@ -596,7 +597,7 @@ monotonate_trapezoids(int nsegs, segment_t *seg, traps_t *tr, { int i, size; int tr_start; - int* visited = gv_calloc(tr->length, sizeof(int)); + bitarray_t visited = bitarray_new_or_exit(tr->length); mchain = gv_calloc(tr->length, sizeof(monchain_t)); vert = gv_calloc(nsegs + 1, sizeof(vertexchain_t)); @@ -628,15 +629,15 @@ monotonate_trapezoids(int nsegs, segment_t *seg, traps_t *tr, /* traverse the polygon */ if (tr->data[tr_start].u0 > 0) - size = traverse_polygon(visited, decomp, 0, seg, tr, 0, tr_start, + size = traverse_polygon(&visited, decomp, 0, seg, tr, 0, tr_start, tr->data[tr_start].u0, flip, TR_FROM_UP); else if (tr->data[tr_start].d0 > 0) - size = traverse_polygon(visited, decomp, 0, seg, tr, 0, tr_start, + size = traverse_polygon(&visited, decomp, 0, seg, tr, 0, tr_start, tr->data[tr_start].d0, flip, TR_FROM_DN); else size = 0; - free (visited); + bitarray_reset(&visited); free (mchain); free (vert); free (mon);