dp->scaling = late_double(g, agfindgraphattr(g, "overlap_scaling"), -4.0, -1.e10);
}
+/* setScaleValue:
+ * Initialize and set scale value
+ */
+static void
+setScaleValue (Agraph_t* g, char* s, adjust_data* dp)
+{
+ double v;
+ char* p;
+
+ v = strtod (s, &p);
+ if (p == s) /* no number */
+ dp->scaling = 0;
+ else
+ dp->scaling = v;
+}
+
/* getAdjustMode:
* Convert string value to internal value of adjustment mode.
* If s is NULL or empty, return NONE.
dp->print = ap->print;
if (ap->mode == AM_PRISM)
setPrismValues (g, s + ap->len, dp);
+ else if (ap->mode == AM_NSCALE)
+ setScaleValue (g, s + ap->len, dp);
break;
}
ap++;
return (getAdjustMode (G, am ? am : (dflt ? dflt : ""), dp));
}
+/* simpleScaling:
+ */
+static int simpleScale (graph_t* g, double sc)
+{
+ node_t* n;
+
+ if (sc == 1) return 0;
+ for (n = agfstnode(g); n; n = agnxtnode(g,n)) {
+ ND_pos(n)[0] *= sc;
+ ND_pos(n)[1] *= sc;
+ }
+ return 1;
+}
+
/* removeOverlapWith:
* Use adjust_data to determine if and how to remove
* node overlaps.
/* start_timer(); */
switch (am->mode) {
case AM_NSCALE:
- ret = scAdjust(G, 1);
+ if (am->scaling)
+ ret = simpleScale(G, am->scaling);
+ else
+ ret = scAdjust(G, 1);
break;
case AM_SCALEXY:
ret = scAdjust(G, 0);