From: erg Date: Tue, 17 Jan 2006 22:56:22 +0000 (+0000) Subject: Fix node adjustment functions to have a return value indicated whether X-Git-Tag: LAST_LIBGRAPH~32^2~6859 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4ddb41cdcdfd3e70377cdaf7d63b1722aec855b2;p=graphviz Fix node adjustment functions to have a return value indicated whether nodes were moved or not. --- diff --git a/lib/neatogen/adjust.c b/lib/neatogen/adjust.c index d79e1b09b..874a79bf3 100644 --- a/lib/neatogen/adjust.c +++ b/lib/neatogen/adjust.c @@ -726,7 +726,7 @@ static adjust_data *getAdjustMode(char *s) * Use flag value to determine if and how to remove * node overlaps. */ -void +int removeOverlapAs(graph_t * G, char* flag) { /* int userWindow = 0; */ @@ -736,13 +736,13 @@ removeOverlapAs(graph_t * G, char* flag) adjust_data *am; if (agnnodes(G) < 2) - return; + return 0; if (flag == NULL) - return; + return 0; am = getAdjustMode(flag); if (am->mode == AM_NONE) - return; + return 0; if (Verbose) fprintf(stderr, "Adjusting %s using %s\n", G->name, am->print); @@ -751,10 +751,10 @@ removeOverlapAs(graph_t * G, char* flag) /* start_timer(); */ switch (am->mode) { case AM_NSCALE: - scAdjust(G, 1); + ret = scAdjust(G, 1); break; case AM_SCALEXY: - scAdjust(G, 0); + ret = scAdjust(G, 0); break; case AM_PUSH: /* scanAdjust (G, 1); */ @@ -773,13 +773,13 @@ removeOverlapAs(graph_t * G, char* flag) cAdjust(G, am->mode); break; case AM_COMPRESS: - scAdjust(G, -1); + ret = scAdjust(G, -1); break; default: /* to silence warnings */ break; } /* fprintf (stderr, "%s %.4f sec\n", am->attrib, elapsed_sec()); */ - return; + return ret; } /* create main array */ @@ -802,22 +802,27 @@ removeOverlapAs(graph_t * G, char* flag) sites = 0; /* fprintf (stderr, "old scale %.4f sec\n", elapsed_sec()); */ + return ret; } /* removeOverlap: */ -void +int removeOverlap(graph_t * G) { - removeOverlapAs(G, agget(G, "overlap")); + return (removeOverlapAs(G, agget(G, "overlap"))); } -void adjustNodes(graph_t * G) +/* adjustNodes: + * Remove node overlap relying on graph's overlap attribute. + * Return non-zero if graph has changed. + */ +int adjustNodes(graph_t * G) { if (agnnodes(G) < 2) - return; + return 0; normalize(G); - removeOverlap (G); + return removeOverlap (G); } /* expFactor: diff --git a/lib/neatogen/adjust.h b/lib/neatogen/adjust.h index dec8d4b45..f2b9c8b5c 100644 --- a/lib/neatogen/adjust.h +++ b/lib/neatogen/adjust.h @@ -31,12 +31,12 @@ typedef enum { } adjust_mode; extern double expFactor(graph_t * G); - extern void adjustNodes(graph_t * G); + extern int adjustNodes(graph_t * G); extern void normalize(graph_t * g); - extern void removeOverlap(graph_t * G); - extern void removeOverlapAs(graph_t*, char*); - extern void cAdjust(graph_t *, int); - extern void scAdjust(graph_t *, int); + extern int removeOverlap(graph_t * G); + extern int removeOverlapAs(graph_t*, char*); + extern int cAdjust(graph_t *, int); + extern int scAdjust(graph_t *, int); #ifdef __cplusplus } diff --git a/lib/neatogen/constraint.c b/lib/neatogen/constraint.c index 387cb03ec..bb900a5a8 100644 --- a/lib/neatogen/constraint.c +++ b/lib/neatogen/constraint.c @@ -621,10 +621,10 @@ static void initItem(node_t * n, nitem * p, double margin) * mode = AM_ORTHO => first X, then Y * mode = AM_ORTHO_YX => first Y, then X */ -void cAdjust(graph_t * g, int mode) +int cAdjust(graph_t * g, int mode) { double margin; - int i, nnodes = agnnodes(g); + int ret, i, nnodes = agnnodes(g); nitem *nlist = N_GNEW(nnodes, nitem); nitem *p = nlist; node_t *n; @@ -680,8 +680,11 @@ void cAdjust(graph_t * g, int mode) ND_pos(n)[1] = PS2INCH(pt.y) / SCALE; p++; } + ret = 1; } + else ret = 0; free(nlist); + return ret; } typedef struct { @@ -853,7 +856,7 @@ static double computeScale(pointf * aarr, int m) * "Removing Node Overlapping in Graph Layout Using Constrained Optimization", * Constraints,8(2):143--172, 2003. */ -void scAdjust(graph_t * g, int equal) +int scAdjust(graph_t * g, int equal) { int nnodes = agnnodes(g); info *nlist = N_GNEW(nnodes, info); @@ -886,7 +889,7 @@ void scAdjust(graph_t * g, int equal) s.x = s.y = compress(nlist, nnodes); if (s.x == 0) { /* overlaps exist */ free(nlist); - return; + return 0; } fprintf(stderr, "compress %g \n", s.x); } else { @@ -895,7 +898,7 @@ void scAdjust(graph_t * g, int equal) if (m == 0) { /* no overlaps */ free(aarr); free(nlist); - return; + return 0; } if (equal) { @@ -914,4 +917,5 @@ void scAdjust(graph_t * g, int equal) } free(nlist); + return 1; }