From ebd6191b0eec6e23d96c92aaa06212de339207e3 Mon Sep 17 00:00:00 2001
From: ellson <devnull@localhost>
Date: Thu, 11 Sep 2008 02:29:13 +0000
Subject: [PATCH] node_t.coord is now pointf ND_coord_i(n) becomes ND_coord(n)

---
 cmd/tools/gvpack.c           |   4 +-
 lib/common/diagen.c          |  51 +++++---
 lib/common/emit.c            |  20 +--
 lib/common/output.c          |  23 ++--
 lib/common/postproc.c        |  34 ++---
 lib/common/routespl.c        | 234 ++---------------------------------
 lib/common/shapes.c          |  76 ++++++------
 lib/common/splines.c         | 136 ++++++++++----------
 lib/common/types.h           |   4 +-
 lib/common/utils.c           |   2 +-
 lib/dotgen/compound.c        |   8 +-
 lib/dotgen/dotsplines.c      | 206 ++++++++++--------------------
 lib/dotgen/flat.c            |   6 +-
 lib/dotgen/position.c        |  28 ++---
 lib/dotgen/sameport.c        |  16 +--
 lib/neatogen/neatoinit.c     |   4 +-
 lib/neatogen/neatosplines.c  |  44 +++----
 lib/pack/pack.c              |   2 +-
 lib/patchwork/patchwork.c    |   8 +-
 plugin/gd/gvrender_gd_vrml.c |  39 +++---
 20 files changed, 319 insertions(+), 626 deletions(-)

diff --git a/cmd/tools/gvpack.c b/cmd/tools/gvpack.c
index aca6a2e09..578afbf20 100644
--- a/cmd/tools/gvpack.c
+++ b/cmd/tools/gvpack.c
@@ -298,8 +298,8 @@ static void cloneEdge(Agedge_t * old, Agedge_t * new)
 static void cloneNode(Agnode_t * old, Agnode_t * new)
 {
     cloneAttrs(old, new);
-    ND_coord_i(new).x = POINTS(ND_pos(old)[0]);
-    ND_coord_i(new).y = POINTS(ND_pos(old)[1]);
+    ND_coord(new).x = POINTS(ND_pos(old)[0]);
+    ND_coord(new).y = POINTS(ND_pos(old)[1]);
     ND_height(new) = ND_height(old);
     ND_ht_i(new) = ND_ht_i(old);
     ND_width(new) = ND_width(old);
diff --git a/lib/common/diagen.c b/lib/common/diagen.c
index 0ee858d55..2a422619e 100644
--- a/lib/common/diagen.c
+++ b/lib/common/diagen.c
@@ -243,6 +243,20 @@ static pointf diapt(point p)
     return rv;
 }
 
+static pointf diaptf(pointf p)
+{
+    pointf rv;
+
+    if (Rot == 0) {
+	rv.x = PB.LL.x + p.x * Scale + Offset.x;
+	rv.y = PB.UR.y - 1 - p.y * Scale - Offset.y;
+    } else {
+	rv.x = PB.UR.x - 1 - p.y * Scale - Offset.x;
+	rv.y = PB.UR.y - 1 - p.x * Scale - Offset.y;
+    }
+    return rv;
+}
+
 static void dia_grstyle(context_t * cp)
 {
     if (strcmp(cp->pencolor, DEFAULT_COLOR)) {
@@ -677,7 +691,7 @@ int box_connection(node_t * n, pointf p)
     double xsize, ysize, mindist2 = 0.0, dist2;
     polygon_t *poly;
     pointf P, *vertices;
-    static point *A;
+    static pointf *A;
     static int A_size;
 
     poly = (polygon_t *) ND_shape_info(n);
@@ -687,30 +701,27 @@ int box_connection(node_t * n, pointf p)
 
     if (A_size < sides) {
 	A_size = sides + 5;
-	A = ALLOC(A_size, A, point);
+	A = ALLOC(A_size, A, pointf);
     }
 
-    xsize = ((ND_lw_i(n) + ND_rw_i(n)) / POINTS(ND_width(n))) * 16.0;
-    ysize = ((ND_ht_i(n)) / POINTS(ND_height(n))) * 16.0;
+    xsize = (ND_lw_i(n) + ND_rw_i(n)) / POINTS(ND_width(n));
+    ysize = (ND_ht_i(n)) / POINTS(ND_height(n));
 
     for (j = 0; j < peripheries; j++) {
 	for (i = 0; i < sides; i++) {
 	    P = vertices[i + j * sides];
-/* simple rounding produces random results around .5 
- * this trick should clip off the random part. 
- * (note xsize/ysize prescaled by 16.0 above) */
-	    A[i].x = ROUND(P.x * xsize) / 16;
-	    A[i].y = ROUND(P.y * ysize) / 16;
+	    A[i].x = P.x * xsize;
+	    A[i].y = P.y * ysize;
 	    if (sides > 2) {
-		A[i].x += ND_coord_i(n).x;
-		A[i].y += ND_coord_i(n).y;
+		A[i].x += ND_coord(n).x;
+		A[i].y += ND_coord(n).y;
 	    }
 	}
     }
 
     z = 0;
     while (z < i) {
-	dist2 = DIST2(p, diapt(A[z]));
+	dist2 = DIST2(p, diaptf(A[z]));
 	if (z == 0) {
 	    mindist2 = dist2;
 	    conn = 0;
@@ -724,8 +735,8 @@ int box_connection(node_t * n, pointf p)
 
     z = 0;
     while (z < i) {
-	P.x = (diapt(A[z]).x + diapt(A[z + 1]).x) / 2;
-	P.y = (diapt(A[z]).y + diapt(A[z + 1]).y) / 2;
+	P.x = (diaptf(A[z]).x + diaptf(A[z + 1]).x) / 2;
+	P.y = (diaptf(A[z]).y + diaptf(A[z + 1]).y) / 2;
 	dist2 = DIST2(p, P);
 	if (dist2 < mindist2) {
 	    mindist2 = dist2;
@@ -811,10 +822,10 @@ dia_bezier(point * A, int n, int arrow_at_start, int arrow_at_end, int filled)
         }
     
         dia_fputs("      <dia:attribute name=\"conn_endpoints\">\n");
-        dia_printf("        <dia:point val=\"%g,%g\"/>\n", diapt(A[0]).x,
-	           diapt(A[0]).y);
-        dia_printf("        <dia:point val=\"%g,%g\"/>\n", diapt(A[n - 1]).x,
-	           diapt(A[n - 1]).y);
+        dia_printf("        <dia:point val=\"%g,%g\"/>\n",
+		diapt(A[0]).x, diapt(A[0]).y);
+        dia_printf("        <dia:point val=\"%g,%g\"/>\n",
+		diapt(A[n - 1]).x, diapt(A[n - 1]).y);
         dia_fputs("      </dia:attribute>\n");
         dia_fputs("      <dia:connections>\n");
     
@@ -822,7 +833,7 @@ dia_bezier(point * A, int n, int arrow_at_start, int arrow_at_end, int filled)
         if ((strcmp(shape_t, "ellipse") == 0)
 	    || (strcmp(shape_t, "circle") == 0)
 	    || (strcmp(shape_t, "doublecircle") == 0)) {
-	    cp_h = diapt(ND_coord_i(head));
+	    cp_h = diaptf(ND_coord(head));
 	    if (AG_IS_DIRECTED(Rootgraph))
 	        conn_h = ellipse_connection(cp_h, diapt(A[n - 1]));
 	    else
@@ -838,7 +849,7 @@ dia_bezier(point * A, int n, int arrow_at_start, int arrow_at_end, int filled)
         if ((strcmp(shape_t, "ellipse") == 0)
 	    || (strcmp(shape_t, "circle") == 0)
 	    || (strcmp(shape_t, "doublecircle") == 0)) {
-	    cp_t = diapt(ND_coord_i(tail));
+	    cp_t = diaptf(ND_coord(tail));
 	    if (AG_IS_DIRECTED(Rootgraph))
 	        conn_t = ellipse_connection(cp_t, diapt(A[0]));
 	    else
diff --git a/lib/common/emit.c b/lib/common/emit.c
index c6ed11dfe..37703b2ba 100644
--- a/lib/common/emit.c
+++ b/lib/common/emit.c
@@ -1027,7 +1027,7 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
     int sides, peripheries, i, j, filled = 0, rect = 0, shape, nump = 0;
     polygon_t *poly = NULL;
     pointf *vertices, ldimen, *p = NULL;
-    point coord;
+    pointf coord;
     char *s;
 
     obj = push_obj_state(job);
@@ -1049,7 +1049,7 @@ static void emit_begin_node(GVJ_t * job, node_t * n)
         /* checking shape of node */
         shape = shapeOf(n);
         /* node coordinate */
-        coord = ND_coord_i(n);
+        coord = ND_coord(n);
         /* checking if filled style has been set for node */
         filled = ifFilled(n);
 
@@ -2017,8 +2017,8 @@ static void init_job_viewport(GVJ_t * job, graph_t * g)
 	if (rv == 4) {
 	    n = agfindnode(g->root, nodename);
 	    if (n) {
-		x = ND_coord_i(n).x;
-		y = ND_coord_i(n).y;
+		x = ND_coord(n).x;
+		y = ND_coord(n).y;
 	    }
 	}
 	else {
@@ -2026,8 +2026,8 @@ static void init_job_viewport(GVJ_t * job, graph_t * g)
 	    if (rv == 4) {
                 n = agfindnode(g->root, nodename);
                 if (n) {
-                    x = ND_coord_i(n).x;
-                    y = ND_coord_i(n).y;
+                    x = ND_coord(n).x;
+                    y = ND_coord(n).y;
 		}
 	    }
 	    else {
@@ -2723,10 +2723,10 @@ static void init_bb_node(graph_t *g, node_t *n)
 {
     edge_t *e;
 
-    ND_bb(n).LL.x = ND_coord_i(n).x - ND_lw_i(n);
-    ND_bb(n).LL.y = ND_coord_i(n).y - ND_ht_i(n) / 2.;
-    ND_bb(n).UR.x = ND_coord_i(n).x + ND_rw_i(n);
-    ND_bb(n).UR.y = ND_coord_i(n).y + ND_ht_i(n) / 2.;
+    ND_bb(n).LL.x = ND_coord(n).x - ND_lw_i(n);
+    ND_bb(n).LL.y = ND_coord(n).y - ND_ht_i(n) / 2.;
+    ND_bb(n).UR.x = ND_coord(n).x + ND_rw_i(n);
+    ND_bb(n).UR.y = ND_coord(n).y + ND_ht_i(n) / 2.;
 
     for (e = agfstout(g, n); e; e = agnxtout(g, e))
         init_bb_edge(e);
diff --git a/lib/common/output.c b/lib/common/output.c
index ba92159fa..123faa812 100644
--- a/lib/common/output.c
+++ b/lib/common/output.c
@@ -23,11 +23,6 @@
 int Y_off;           /* ymin + ymax */
 double YF_off;       /* Y_off in inches */
 
-static void printpt(FILE * f, point pt)
-{
-    fprintf(f, " %.3g %.3g", PS2INCH(pt.x), PS2INCH(YDIR(pt.y)));
-}
-
 static void printptf(FILE * f, pointf pt)
 {
     fprintf(f, " %.3g %.3g", PS2INCH(pt.x), PS2INCH(YDIR(pt.y)));
@@ -95,7 +90,7 @@ void write_plain(GVJ_t * job, graph_t * g, FILE * f, boolean extend)
 	if (IS_CLUST_NODE(n))
 	    continue;
 	fprintf(f, "node %s ", agcanonical(n->name));
-	printpt(f, ND_coord_i(n));
+	printptf(f, ND_coord(n));
 	if (ND_label(n)->html)   /* if html, get original text */
 	    lbl = agcanonical (agxget(n, N_label->index));
 	else
@@ -149,10 +144,10 @@ static void set_record_rects(node_t * n, field_t * f, agxbuf * xb)
 
     if (f->n_flds == 0) {
 	sprintf(buf, "%.3g,%.3g,%.3g,%.3g ",
-		f->b.LL.x + (double)(ND_coord_i(n).x),
-		YFDIR(f->b.LL.y + (double)(ND_coord_i(n).y)),
-		f->b.UR.x + (double)(ND_coord_i(n).x),
-		YFDIR(f->b.UR.y + (double)(ND_coord_i(n).y)));
+		f->b.LL.x + ND_coord(n).x,
+		YFDIR(f->b.LL.y + ND_coord(n).y),
+		f->b.UR.x + ND_coord(n).x,
+		YFDIR(f->b.UR.y + ND_coord(n).y));
 	agxbput(xb, buf);
     }
     for (i = 0; i < f->n_flds; i++)
@@ -215,14 +210,14 @@ void attach_attrs_and_arrows(graph_t* g, int* sp, int* ep)
     safe_dcl(g, g, "bb", "", agraphattr);
     for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
 	if (dim3) {
-	    sprintf(buf, "%d,%d,%d", ND_coord_i(n).x, YDIR(ND_coord_i(n).y), POINTS(ND_pos(n)[2]));
+	    sprintf(buf, "%.3g,%.3g,%d", ND_coord(n).x, YDIR(ND_coord(n).y), POINTS(ND_pos(n)[2]));
 	} else {
-	    sprintf(buf, "%d,%d", ND_coord_i(n).x, YDIR(ND_coord_i(n).y));
+	    sprintf(buf, "%.3g,%.3g", ND_coord(n).x, YDIR(ND_coord(n).y));
 	}
 	agset(n, "pos", buf);
-	sprintf(buf, "%.2f", PS2INCH(ND_ht_i(n)));
+	sprintf(buf, "%.3g", PS2INCH(ND_ht_i(n)));
 	agxset(n, N_height->index, buf);
-	sprintf(buf, "%.2f", PS2INCH(ND_lw_i(n) + ND_rw_i(n)));
+	sprintf(buf, "%.3g", PS2INCH(ND_lw_i(n) + ND_rw_i(n)));
 	agxset(n, N_width->index, buf);
 	if (strcmp(ND_shape(n)->name, "record") == 0) {
 	    set_record_rects(n, ND_shape_info(n), &xb);
diff --git a/lib/common/postproc.c b/lib/common/postproc.c
index 84f018042..46913bb14 100644
--- a/lib/common/postproc.c
+++ b/lib/common/postproc.c
@@ -82,17 +82,9 @@ static void place_flip_graph_label(graph_t * g);
     closepath stroke\n\
 } def\n"
 
-static pointf map_pointf(pointf p)
+static pointf map_point(pointf p)
 {
     p = ccwrotatepf(p, Rankdir*90);
-    p.x -= (double)Offset.x;
-    p.y -= (double)Offset.y;
-    return p;
-}
-
-static point map_point(point p)
-{
-    p = ccwrotatep(p, Rankdir*90);
     p.x -= Offset.x;
     p.y -= Offset.y;
     return p;
@@ -112,19 +104,19 @@ static void map_edge(edge_t * e)
     for (j = 0; j < ED_spl(e)->size; j++) {
 	bz = ED_spl(e)->list[j];
 	for (k = 0; k < bz.size; k++)
-	    bz.list[k] = map_pointf(bz.list[k]);
+	    bz.list[k] = map_point(bz.list[k]);
 	if (bz.sflag)
-	    ED_spl(e)->list[j].sp = map_pointf(ED_spl(e)->list[j].sp);
+	    ED_spl(e)->list[j].sp = map_point(ED_spl(e)->list[j].sp);
 	if (bz.eflag)
-	    ED_spl(e)->list[j].ep = map_pointf(ED_spl(e)->list[j].ep);
+	    ED_spl(e)->list[j].ep = map_point(ED_spl(e)->list[j].ep);
     }
     if (ED_label(e))
-	ED_label(e)->pos = map_pointf(ED_label(e)->pos);
+	ED_label(e)->pos = map_point(ED_label(e)->pos);
     /* vladimir */
     if (ED_head_label(e))
-	ED_head_label(e)->pos = map_pointf(ED_head_label(e)->pos);
+	ED_head_label(e)->pos = map_point(ED_head_label(e)->pos);
     if (ED_tail_label(e))
-	ED_tail_label(e)->pos = map_pointf(ED_tail_label(e)->pos);
+	ED_tail_label(e)->pos = map_point(ED_tail_label(e)->pos);
 }
 
 void translate_bb(graph_t * g, int rankdir)
@@ -134,15 +126,15 @@ void translate_bb(graph_t * g, int rankdir)
 
     bb = GD_bb(g);
     if (rankdir == RANKDIR_LR || rankdir == RANKDIR_BT) {
-	new_bb.LL = map_pointf(pointfof(bb.LL.x, bb.UR.y));
-	new_bb.UR = map_pointf(pointfof(bb.UR.x, bb.LL.y));
+	new_bb.LL = map_point(pointfof(bb.LL.x, bb.UR.y));
+	new_bb.UR = map_point(pointfof(bb.UR.x, bb.LL.y));
     } else {
-	new_bb.LL = map_pointf(pointfof(bb.LL.x, bb.LL.y));
-	new_bb.UR = map_pointf(pointfof(bb.UR.x, bb.UR.y));
+	new_bb.LL = map_point(pointfof(bb.LL.x, bb.LL.y));
+	new_bb.UR = map_point(pointfof(bb.UR.x, bb.UR.y));
     }
     GD_bb(g) = new_bb;
     if (GD_label(g)) {
-	GD_label(g)->pos = map_pointf(GD_label(g)->pos);
+	GD_label(g)->pos = map_point(GD_label(g)->pos);
     }
     for (c = 1; c <= GD_n_cluster(g); c++)
 	translate_bb(GD_clust(g)[c], rankdir);
@@ -185,7 +177,7 @@ static void translate_drawing(graph_t * g)
     for (v = agfstnode(g); v; v = agnxtnode(g, v)) {
 	if (Rankdir) dot_nodesize(v, FALSE);
 	if (shift) {
-	    ND_coord_i(v) = map_point(ND_coord_i(v));
+	    ND_coord(v) = map_point(ND_coord(v));
 	    if (State == GVSPLINES)
 		for (e = agfstout(g, v); e; e = agnxtout(g, e))
 		    map_edge(e);
diff --git a/lib/common/routespl.c b/lib/common/routespl.c
index 5d2e64b18..e970a31da 100644
--- a/lib/common/routespl.c
+++ b/lib/common/routespl.c
@@ -45,9 +45,6 @@ static int edgen;             /* size of edges[] */
 static void checkpath(int, boxf*, path*);
 static void mkspacep(int size);
 static void printpath(path * pp);
-#ifdef OBSOLETE
-static int append(path * path, int bi, point p0, point p1, int);
-#endif
 #ifdef DEBUG
 static void printboxes(int boxn, box* boxes)
 {
@@ -223,21 +220,6 @@ static int debugleveln(edge_t* realedge, int i)
 }
 #endif  /* DEBUG */
 
-#ifdef OBSOLETE
-static point mkpt(int x, int y)
-{
-    point rv;
-    rv.x = x;
-    rv.y = y;
-    return rv;
-}
-
-static int pteq(point p, point q)
-{
-    return ((p.x == q.x) && (p.y == q.y));
-}
-#endif
-
 /* routesplinesinit:
  * Data initialized once until matching call to routeplineterm
  * Allows recursive calls to dot
@@ -246,13 +228,6 @@ void
 routesplinesinit()
 {
     if (++routeinit > 1) return;
-#ifdef UNUSED
-    if (!(bs = N_GNEW(BINC, box))) {
-	agerr(AGERR, "cannot allocate bs\n");
-	abort();
-    }
-    maxbn = BINC;
-#endif
     if (!(ps = N_GNEW(PINC, pointf))) {
 	agerr(AGERR, "cannot allocate ps\n");
 	abort();
@@ -295,7 +270,7 @@ static pointf *_routesplines(path * pp, int *npoints, int polyline)
     Ppoint_t eps[2];
     Pvector_t evs[2];
     int edgei, prev, next;
-    point sp[4];
+    pointf sp[4];
     int pi, bi, si;
     double t;
     boxf *boxes;
@@ -340,7 +315,7 @@ static pointf *_routesplines(path * pp, int *npoints, int polyline)
     if ((boxn > 1) && (boxes[0].LL.y > boxes[1].LL.y)) {
         flip = 1;
 	for (bi = 0; bi < boxn; bi++) {
-	    int v = boxes[bi].UR.y;
+	    double v = boxes[bi].UR.y;
 	    boxes[bi].UR.y = -1*boxes[bi].LL.y;
 	    boxes[bi].LL.y = -v;
 	}
@@ -422,40 +397,9 @@ static pointf *_routesplines(path * pp, int *npoints, int polyline)
 		polypoints[pi++].y = boxes[bi].LL.y;
 	    }
 	}
-    } 
+    }
     else {
-#ifdef OBSOLETE
-	/* new, more generalized approach for self-edges.  We do not
-	   assume any monotonicity about the box path, only that it
-	   is simply connected.  We build up the constraint poly by
-	   walking the box path from one end to the other and back
-	   in the recursive function append(). A better approach to all
-	   of this might be to dispense with the box paths altogether
-	   and just compute the constraint poly directly, but this
-	   needs to be done as part of a more thorough overhaul. */
-	point p0, p1;
-	box b0, b1;
-	b0 = pp->boxes[0];
-	b1 = pp->boxes[1];
-	/* determine 'starting' segment (side of b0) for box path search */
-	if (b0.UR.x == b1.LL.x) {
-	    p0 = b0.LL;
-	    p1 = mkpt(b0.LL.x, b0.UR.y);
-	} else if (b0.LL.y == b1.UR.y) {
-	    p0 = mkpt(b0.LL.x, b0.UR.y);
-	    p1 = b0.UR;
-	} else if (b0.LL.x == b1.UR.x) {
-	    p0 = b0.UR;
-	    p1 = mkpt(b0.UR.x, b0.LL.y);
-	} else if (b0.UR.y == b1.LL.y) {
-	    p0 = mkpt(b0.UR.x, b0.LL.y);
-	    p1 = b0.LL;
-	} else
-	    abort();
-	pi = append(pp, 0, p0, p1, 0);
-#else
 	abort();
-#endif
     }
 
     if (flip) {
@@ -521,17 +465,17 @@ static pointf *_routesplines(path * pp, int *npoints, int polyline)
 	boxes[bi].UR.x = INT_MIN;
     }
     for (splinepi = 0; splinepi < spl.pn; splinepi++) {
-	P2PF(spl.ps[splinepi], ps[splinepi]);
+	ps[splinepi] = spl.ps[splinepi];
     }
 REDO:
     for (splinepi = 0; splinepi + 3 < spl.pn; splinepi += 3) {
 	int num_div = delta * boxn;
 	for (si = 0; si <= num_div; si++) {
 	    t = si / ((double)num_div);
-	    PF2P(ps[splinepi], sp[0]);
-	    PF2P(ps[splinepi + 1], sp[1]);
-	    PF2P(ps[splinepi + 2], sp[2]);
-	    PF2P(ps[splinepi + 3], sp[3]);
+	    sp[0] = ps[splinepi];
+	    sp[1] = ps[splinepi + 1];
+	    sp[2] = ps[splinepi + 2];
+	    sp[3] = ps[splinepi + 3];
 	    sp[0].x = sp[0].x + t * (sp[1].x - sp[0].x);
 	    sp[0].y = sp[0].y + t * (sp[1].y - sp[0].y);
 	    sp[1].x = sp[1].x + t * (sp[2].x - sp[1].x);
@@ -559,7 +503,7 @@ REDO:
      * Therefore, we make the sample finer until all boxes have
      * valid values. cf. bug 456. Would making sp[] pointfs help?
      */
-    for (bi = 0; bi < boxn; bi++) {
+    for (bi = 0; bi < boxn; bi++) {  /* FIXME - fp equality tests */
 	if ((boxes[bi].LL.x == INT_MAX) || (boxes[bi].UR.x == INT_MIN)) {
 	    delta *= 2;
 	    goto REDO;
@@ -621,9 +565,9 @@ static void checkpath(int boxn, boxf* boxes, path* thepath)
     /* remove degenerate boxes. */
     i = 0;
     for (bi = 0; bi < boxn; bi++) {
-	if (boxes[bi].LL.y == boxes[bi].UR.y)
+	if (ABS(boxes[bi].LL.y - boxes[bi].UR.y) < .01)
 	    continue;
-	if (boxes[bi].LL.x == boxes[bi].UR.x)
+	if (ABS(boxes[bi].LL.x - boxes[bi].UR.x) < .01)
 	    continue;
 	if (i != bi)
 	    boxes[i] = boxes[bi];
@@ -777,162 +721,6 @@ static void mkspacep(int size)
     }
 }
 
-#ifdef OBSOLETE
-/* new code to create poly from box list
- * given that we entered the box b on segment p0,p1 (p0==p1 allowed) 
- * then add successive points to the constraint poly
- */
-
-#define BOXLEFT 0
-#define BOXTOP 1
-#define BOXRIGHT 2
-#define BOXBOTTOM 3
-static box B;
-
-static int sideofB(point p, box B)
-{
-    if (p.x == B.LL.x)
-	return BOXLEFT;
-    if (p.y == B.UR.y)
-	return BOXTOP;
-    if (p.x == B.UR.x)
-	return BOXRIGHT;
-    if (p.y == B.LL.y)
-	return BOXBOTTOM;
-    abort();
-    return 0;
-}
-
-static int appendpt(point p, int polysz)
-{
-    polypoints[polysz].x = p.x;
-    polypoints[polysz].y = p.y;
-    return (polysz+1);
-}
-
-static int cmpf(const void *pp0, const void *pp1)
-{
-    point p0, p1;
-    int s0, s1;
-
-    p0 = *(point *) pp0;
-    p1 = *(point *) pp1;
-    s0 = sideofB(p0, B);
-    s1 = sideofB(p1, B);
-
-    if (s0 != s1)
-	return s1 - s0;
-    switch (s0) {
-    case BOXLEFT:
-	return p1.y - p0.y;
-    case BOXTOP:
-	return p1.x - p0.x;
-    case BOXRIGHT:
-	return p0.y - p1.y;
-    case BOXBOTTOM:
-	return p0.x - p1.x;
-    default:
-	abort();
-    }
-    return 0;			/* not reached */
-}
-
-/* append:
- */
-static int 
-append(path * path, int bi, point p0, point p1, int polysz)
-{
-    point v[8];		/* worst case 4 corners + 2 segs * 2 points each */
-    point w[8];
-    box b = path->boxes[bi];
-    box bb;
-    int i, i0, npw, delta;
-    point q0 = { 0, 0 }, q1 = { 0, 0}, r;
-    int pn;
-
-    /* v = 4 corners of b, p0 and p1 */
-    pn = 0;
-    v[pn++] = b.LL;
-    v[pn++] = mkpt(b.UR.x, b.LL.y);
-    v[pn++] = b.UR;
-    v[pn++] = mkpt(b.LL.x, b.UR.y);
-    v[pn++] = p0;
-    v[pn++] = p1;
-
-    if (bi + 1 < path->nbox) {
-	bb = path->boxes[bi + 1];
-	/* determine points q0,q1 where b and bb touch and append to v */
-	if (b.UR.x == bb.LL.x) {
-	    q0.x = q1.x = b.UR.x;
-	    q0.y = MIN(b.UR.y, bb.UR.y);
-	    q1.y = MAX(b.LL.y, bb.LL.y);
-	} else if (b.LL.x == bb.UR.x) {
-	    q0.x = q1.x = b.LL.x;
-	    q0.y = MIN(b.UR.y, bb.UR.y);
-	    q1.y = MAX(b.LL.y, bb.LL.y);
-	} else if (b.UR.y == bb.LL.y) {
-	    q0.y = q1.y = b.UR.y;
-	    q0.x = MIN(b.UR.x, bb.UR.x);
-	    q1.x = MAX(b.LL.x, bb.LL.x);
-	} else if (b.LL.y == bb.UR.y) {
-	    q0.y = q1.y = b.LL.y;
-	    q0.x = MIN(b.UR.x, bb.UR.x);
-	    q1.x = MAX(b.LL.x, bb.LL.x);
-	} else
-	    abort();
-	v[pn++] = q0;
-	v[pn++] = q1;
-    }
-
-    /* sort v so that the cyclic order is p0, all other points, p1  */
-    B = b;
-    qsort(v, pn, sizeof(v[0]), cmpf);
-
-    /* eliminate duplicates and record i0 = index of p0 in w */
-    w[0] = v[0];
-    npw = 1;
-    i0 = -1;
-    for (i = 0; i < pn; i++) {
-	if (pteq(w[npw - 1], p0))
-	    i0 = npw - 1;
-	if (!pteq(v[i], w[npw - 1]))
-	    w[npw++] = v[i];
-    }
-
-    i = i0;
-    if (bi == 0)
-	polysz = appendpt(p0, polysz);
-    if (pteq(p1, w[(i0 + 1) % npw]))
-	delta = -1;
-    else if (pteq(p1, w[(i0 - 1 + npw) % npw]))
-	delta = 1;
-    else
-	abort();
-    do {
-	i = (i + delta + npw) % npw;	/* go to the next point in order */
-	r = w[i];		/* call it r */
-
-	/* append r to current poly, except p0 and p1 are special cases */
-	if ((bi == 0) || (!pteq(r, p0) && !pteq(r, p1)))
-	    polysz = appendpt(r, polysz);
-	if (pteq(r, p1))
-	    break;
-	if (bi + 1 < path->nbox) {	/* recur when we hit the next box */
-	    if (pteq(r, q0)) {
-		polysz = append(path, bi + 1, q0, q1, polysz);
-		polysz = appendpt(q1, polysz);	/* assumes q1 != p0 and p1 */
-		i += delta;	/* skip q1 */
-	    } else if (pteq(r, q1)) {
-		polysz = append(path, bi + 1, q1, q0, polysz);
-		polysz = appendpt(q0, polysz);
-		i += delta;
-	    }
-	}
-    } while (i != i0);
-    return polysz;
-}
-#endif
-
 static void printpath(path * pp)
 {
     int bi;
diff --git a/lib/common/shapes.c b/lib/common/shapes.c
index f020842ef..51f3410fc 100644
--- a/lib/common/shapes.c
+++ b/lib/common/shapes.c
@@ -347,15 +347,14 @@ static int stylenode(GVJ_t * job, node_t * n)
 static void Mcircle_hack(GVJ_t * job, node_t * n)
 {
     double x, y;
-    pointf AF[2], p, coord;
+    pointf AF[2], p;
 
     y = .7500;
     x = .6614;			/* x^2 + y^2 = 1.0 */
     p.y = y * ND_ht_i(n) / 2.0;
     p.x = ND_rw_i(n) * x;	/* assume node is symmetric */
 
-    P2PF(ND_coord_i(n), coord);
-    AF[0] = add_pointfs(p, coord);
+    AF[0] = add_pointfs(p, ND_coord(n));
     AF[1].y = AF[0].y;
     AF[1].x = AF[0].x - 2 * p.x;
     gvrender_polyline(job, AF, 2);
@@ -1506,7 +1505,7 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     }
 
     /* nominal label position in the center of the node */
-    P2PF(ND_coord_i(n), ND_label(n)->pos);
+    ND_label(n)->pos = ND_coord(n);
 
     xsize = (double)(ND_lw_i(n) + ND_rw_i(n)) / POINTS(ND_width(n));
     ysize = (double)ND_ht_i(n) / POINTS(ND_height(n));
@@ -1574,8 +1573,8 @@ static void poly_gencode(GVJ_t * job, node_t * n)
 	/* get coords of innermost periphery */
 	for (i = 0; i < sides; i++) {
 	    P = vertices[i];
-	    AF[i].x = P.x * xsize + (double)ND_coord_i(n).x;
-	    AF[i].y = P.y * ysize + (double)ND_coord_i(n).y;
+	    AF[i].x = P.x * xsize + ND_coord(n).x;
+	    AF[i].y = P.y * ysize + ND_coord(n).y;
 	}
 	/* lay down fill first */
 	if (filled && pfilled) {
@@ -1597,8 +1596,8 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     for (j = 0; j < peripheries; j++) {
 	for (i = 0; i < sides; i++) {
 	    P = vertices[i + j * sides];
-	    AF[i].x = P.x * xsize + (double)ND_coord_i(n).x;
-	    AF[i].y = P.y * ysize + (double)ND_coord_i(n).y;
+	    AF[i].x = P.x * xsize + ND_coord(n).x;
+	    AF[i].y = P.y * ysize + ND_coord(n).y;
 	}
 	if (sides <= 2) {
 	    gvrender_ellipse(job, AF, sides, filled);
@@ -1786,8 +1785,8 @@ static void point_gencode(GVJ_t * job, node_t * n)
     for (j = 0; j < peripheries; j++) {
 	for (i = 0; i < sides; i++) {
 	    P = vertices[i + j * sides];
-	    AF[i].x = P.x + (double)ND_coord_i(n).x;
-	    AF[i].y = P.y + (double)ND_coord_i(n).y;
+	    AF[i].x = P.x + ND_coord(n).x;
+	    AF[i].y = P.y + ND_coord(n).y;
 	}
 	gvrender_ellipse(job, AF, sides, filled);
 	/* fill innermost periphery only */
@@ -2246,7 +2245,7 @@ record_inside(inside_t * inside_context, pointf p)
 static int record_path(node_t* n, port* prt, int side, boxf rv[], int *kptr)
 {
     int i, ls, rs;
-    pointf p, np;
+    pointf p;
     field_t *info;
 
     if (!prt->defined) return 0;
@@ -2264,14 +2263,13 @@ static int record_path(node_t* n, port* prt, int side, boxf rv[], int *kptr)
 	if (BETWEEN(ls, p.x, rs)) {
 	    /* FIXME: I don't understand this code */
 	    if (GD_flip(n->graph)) {
-		P2PF(ND_coord_i(n), np);
-		rv[0] = flip_rec_boxf(info->fld[i]->b, np);
+		rv[0] = flip_rec_boxf(info->fld[i]->b, ND_coord(n));
 	    } else {
-		rv[0].LL.x = ND_coord_i(n).x + ls;
-		rv[0].LL.y = ND_coord_i(n).y - ND_ht_i(n) / 2.;
-		rv[0].UR.x = ND_coord_i(n).x + rs;
+		rv[0].LL.x = ND_coord(n).x + ls;
+		rv[0].LL.y = ND_coord(n).y - (ND_ht_i(n) / 2);
+		rv[0].UR.x = ND_coord(n).x + rs;
 	    }
-	    rv[0].UR.y = ND_coord_i(n).y + ND_ht_i(n) / 2;
+	    rv[0].UR.y = ND_coord(n).y + (ND_ht_i(n) / 2);
 	    *kptr = 1;
 	    break;
 	}
@@ -2285,8 +2283,8 @@ static void gen_fields(GVJ_t * job, node_t * n, field_t * f)
     pointf AF[2], coord;
 
     if (f->lp) {
-	coord.x = (f->b.LL.x + f->b.UR.x) / 2.0 + ND_coord_i(n).x;
-	coord.y = (f->b.LL.y + f->b.UR.y) / 2.0 + ND_coord_i(n).y;
+	coord.x = (f->b.LL.x + f->b.UR.x) / 2. + ND_coord(n).x;
+	coord.y = (f->b.LL.y + f->b.UR.y) / 2. + ND_coord(n).y;
 	f->lp->pos = coord;
 	emit_label(job, EMIT_NLABEL, f->lp);
         pencolor(job, n);
@@ -2295,15 +2293,15 @@ static void gen_fields(GVJ_t * job, node_t * n, field_t * f)
     for (i = 0; i < f->n_flds; i++) {
 	if (i > 0) {
 	    if (f->LR) {
-		P2PF(f->fld[i]->b.LL, AF[0]);
+		AF[0] = f->fld[i]->b.LL;
 		AF[1].x = AF[0].x;
-		AF[1].y = (double)(f->fld[i]->b.UR.y);
+		AF[1].y = f->fld[i]->b.UR.y;
 	    } else {
-		P2PF(f->fld[i]->b.UR, AF[1]);
-		AF[0].x = (double)(f->fld[i]->b.LL.x);
+		AF[1] = f->fld[i]->b.UR;
+		AF[0].x = f->fld[i]->b.LL.x;
 		AF[0].y = AF[1].y;
 	    }
-	    P2PF(ND_coord_i(n), coord);
+	    coord = ND_coord(n);
 	    AF[0] = add_pointfs(AF[0], coord);
 	    AF[1] = add_pointfs(AF[1], coord);
 	    gvrender_polyline(job, AF, 2);
@@ -2322,11 +2320,11 @@ static void record_gencode(GVJ_t * job, node_t * n)
     int doMap = (obj->url || obj->explicit_tooltip);
 
     f = (field_t *) ND_shape_info(n);
-    B2BF(f->b, BF);
-    BF.LL.x += (double)(ND_coord_i(n).x);
-    BF.LL.y += (double)(ND_coord_i(n).y);
-    BF.UR.x += (double)(ND_coord_i(n).x);
-    BF.UR.y += (double)(ND_coord_i(n).y);
+    BF = f->b;
+    BF.LL.x += ND_coord(n).x;
+    BF.LL.y += ND_coord(n).y;
+    BF.UR.x += ND_coord(n).x;
+    BF.UR.y += ND_coord(n).y;
     
     if (doMap && !(job->flags & EMIT_CLUSTERS_LAST))
         gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target);
@@ -2440,10 +2438,10 @@ static void epsf_gencode(GVJ_t * job, node_t * n)
     gvrender_begin_context(job);
     if (desc)
 	fprintf(job->output_file,
-		"%d %d translate newpath user_shape_%d\n",
-		ND_coord_i(n).x + desc->offset.x,
-		ND_coord_i(n).y + desc->offset.y, desc->macro_id);
-    P2PF(ND_coord_i(n), ND_label(n)->pos);
+		"%.3g %.3g translate newpath user_shape_%d\n",
+		ND_coord(n).x + desc->offset.x,
+		ND_coord(n).y + desc->offset.y, desc->macro_id);
+    ND_label(n)->pos = ND_coord(n);
     gvrender_end_context(job);
 
     emit_label(job, EMIT_NLABEL, ND_label(n));
@@ -2457,9 +2455,10 @@ static void epsf_gencode(GVJ_t * job, node_t * n)
 static char* side_port[] = {"s", "e", "n", "w"};
 
 static point
-cvtPt (point p, int rankdir)
+cvtPt (pointf p, int rankdir)
 {
-    point q = {0, 0};
+    pointf q = {0, 0};
+    point Q;
 
     switch (rankdir) {
     case RANKDIR_TB :
@@ -2478,7 +2477,8 @@ cvtPt (point p, int rankdir)
 	q.x = p.y;
 	break;
     }
-    return q;
+    PF2P(q, Q);
+    return Q;
 }
 
 static char* closestSide (node_t*  n, node_t* other, port* oldport)
@@ -2486,8 +2486,8 @@ static char* closestSide (node_t*  n, node_t* other, port* oldport)
     boxf b;
     int rkd = GD_rankdir(n->graph->root);
     point p = {0, 0};
-    point pt = cvtPt (ND_coord_i(n), rkd);
-    point opt = cvtPt (ND_coord_i(other), rkd);
+    point pt = cvtPt (ND_coord(n), rkd);
+    point opt = cvtPt (ND_coord(other), rkd);
     int sides = oldport->side;
     char* rv = NULL;
     int i, d, mind = 0;
diff --git a/lib/common/splines.c b/lib/common/splines.c
index 4095273ec..a50c92d63 100644
--- a/lib/common/splines.c
+++ b/lib/common/splines.c
@@ -159,16 +159,16 @@ shape_clip0(inside_t * inside_context, node_t * n, pointf curve[4],
 
     save_real_size = ND_rw_i(n);
     for (i = 0; i < 4; i++) {
-	c[i].x = curve[i].x - ND_coord_i(n).x;
-	c[i].y = curve[i].y - ND_coord_i(n).y;
+	c[i].x = curve[i].x - ND_coord(n).x;
+	c[i].y = curve[i].y - ND_coord(n).y;
     }
 
     bezier_clip(inside_context, ND_shape(n)->fns->insidefn, c,
 		left_inside);
 
     for (i = 0; i < 4; i++) {
-	curve[i].x = c[i].x + ND_coord_i(n).x;
-	curve[i].y = c[i].y + ND_coord_i(n).y;
+	curve[i].x = c[i].x + ND_coord(n).x;
+	curve[i].y = c[i].y + ND_coord(n).y;
     }
     ND_rw_i(n) = save_real_size;
 }
@@ -198,8 +198,8 @@ void shape_clip(node_t * n, pointf curve[4])
     inside_context.s.n = n;
     inside_context.s.bp = NULL;
     save_real_size = ND_rw_i(n);
-    c.x = curve[0].x - ND_coord_i(n).x;
-    c.y = curve[0].y - ND_coord_i(n).y;
+    c.x = curve[0].x - ND_coord(n).x;
+    c.y = curve[0].y - ND_coord(n).y;
     left_inside = ND_shape(n)->fns->insidefn(&inside_context, c);
     ND_rw_i(n) = save_real_size;
     shape_clip0(&inside_context, n, curve, left_inside);
@@ -274,8 +274,8 @@ clip_and_install(edge_t * fe, node_t * hn, pointf * ps, int pn,
 	inside_context.s.n = tn;
 	inside_context.s.bp = tbox;
 	for (start = 0; start < pn - 4; start += 3) {
-	    p2.x = ps[start + 3].x - ND_coord_i(tn).x;
-	    p2.y = ps[start + 3].y - ND_coord_i(tn).y;
+	    p2.x = ps[start + 3].x - ND_coord(tn).x;
+	    p2.y = ps[start + 3].y - ND_coord(tn).y;
 	    if (ND_shape(tn)->fns->insidefn(&inside_context, p2) == FALSE)
 		break;
 	}
@@ -286,8 +286,8 @@ clip_and_install(edge_t * fe, node_t * hn, pointf * ps, int pn,
 	inside_context.s.n = hn;
 	inside_context.s.bp = hbox;
 	for (end = pn - 4; end > 0; end -= 3) {
-	    p2.x = ps[end].x - ND_coord_i(hn).x;
-	    p2.y = ps[end].y - ND_coord_i(hn).y;
+	    p2.x = ps[end].x - ND_coord(hn).x;
+	    p2.y = ps[end].y - ND_coord(hn).y;
 	    if (ND_shape(hn)->fns->insidefn(&inside_context, p2) == FALSE)
 		break;
 	}
@@ -331,14 +331,14 @@ conc_slope(node_t* n)
 
     s_in = s_out = 0.0;
     for (cnt_in = 0; (e = ND_in(n).list[cnt_in]); cnt_in++)
-	s_in += ND_coord_i(e->tail).x;
+	s_in += ND_coord(e->tail).x;
     for (cnt_out = 0; (e = ND_out(n).list[cnt_out]); cnt_out++)
-	s_out += ND_coord_i(e->head).x;
-    p.x = ND_coord_i(n).x - (s_in / cnt_in);
-    p.y = ND_coord_i(n).y - ND_coord_i(ND_in(n).list[0]->tail).y;
+	s_out += ND_coord(e->head).x;
+    p.x = ND_coord(n).x - (s_in / cnt_in);
+    p.y = ND_coord(n).y - ND_coord(ND_in(n).list[0]->tail).y;
     m_in = atan2(p.y, p.x);
-    p.x = (s_out / cnt_out) - ND_coord_i(n).x;
-    p.y = ND_coord_i(ND_out(n).list[0]->head).y - ND_coord_i(n).y;
+    p.x = (s_out / cnt_out) - ND_coord(n).x;
+    p.y = ND_coord(ND_out(n).list[0]->head).y - ND_coord(n).y;
     m_out = atan2(p.y, p.x);
     return ((m_in + m_out) / 2.0);
 }
@@ -386,7 +386,6 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 {
     int side, mask;
     node_t *n;
-    pointf np;
     int (*pboxfn) (node_t*, port*, int, boxf*, int*);
 
     n = e->tail;
@@ -397,8 +396,7 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	pboxfn = ND_shape(n)->fns->pboxfn;
     else
 	pboxfn = NULL;
-    P2PF(ND_coord_i(n), np);
-    P->start.p = add_pointfs(np, ED_tail_port(e).p);
+    P->start.p = add_pointfs(ND_coord(n), ED_tail_port(e).p);
     if (merge) {
 	/*P->start.theta = - M_PI / 2; */
 	P->start.theta = conc_slope(e->tail);
@@ -418,15 +416,15 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	boxf b0, b = endp->nb;
 	if (side & TOP) {
 	    endp->sidemask = TOP;
-	    if (P->start.p.x < ND_coord_i(n).x) { /* go left */
+	    if (P->start.p.x < ND_coord(n).x) { /* go left */
 		b0.LL.x = b.LL.x - 1;
-		/* b0.LL.y = ND_coord_i(n).y + ND_ht_i(n)/2; */
+		/* b0.LL.y = ND_coord(n).y + ND_ht_i(n)/2; */
 		b0.LL.y = P->start.p.y;
 		b0.UR.x = b.UR.x;
-		b0.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2 + GD_ranksep(n->graph)/2;
-		b.UR.x = ND_coord_i(n).x - ND_lw_i(n) - (FUDGE-2);
+		b0.UR.y = ND_coord(n).y + ND_ht_i(n)/2 + GD_ranksep(n->graph)/2;
+		b.UR.x = ND_coord(n).x - ND_lw_i(n) - (FUDGE-2);
 		b.UR.y = b0.LL.y;
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.LL.x -= 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -434,12 +432,12 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	    else {
 		b0.LL.x = b.LL.x;
 		b0.LL.y = P->start.p.y;
-		/* b0.LL.y = ND_coord_i(n).y + ND_ht_i(n)/2; */
+		/* b0.LL.y = ND_coord(n).y + ND_ht_i(n)/2; */
 		b0.UR.x = b.UR.x+1;
-		b0.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2 + GD_ranksep(n->graph)/2;
-		b.LL.x = ND_coord_i(n).x + ND_rw_i(n) + (FUDGE-2);
+		b0.UR.y = ND_coord(n).y + ND_ht_i(n)/2 + GD_ranksep(n->graph)/2;
+		b.LL.x = ND_coord(n).x + ND_rw_i(n) + (FUDGE-2);
 		b.UR.y = b0.LL.y;
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.UR.x += 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -457,7 +455,7 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else if (side & LEFT) {
 	    endp->sidemask = LEFT;
 	    b.UR.x = P->start.p.x;
-	    b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+	    b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 	    b.UR.y = P->start.p.y;
 	    endp->boxes[0] = b;
 	    endp->boxn = 1;
@@ -466,7 +464,7 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else {
 	    endp->sidemask = RIGHT;
 	    b.LL.x = P->start.p.x;
-	    b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+	    b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 	    b.UR.y = P->start.p.y;
 	    endp->boxes[0] = b;
 	    endp->boxn = 1;
@@ -489,13 +487,13 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	}
 	else if (side & BOTTOM) {
 	    if (endp->sidemask == TOP) {
-		b0.UR.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b0.UR.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b0.UR.x = b.UR.x+1;
 		b0.LL.x = P->start.p.x;
 		b0.LL.y = b0.UR.y - GD_ranksep(n->graph)/2;
-		b.LL.x = ND_coord_i(n).x + ND_rw_i(n) + (FUDGE-2);
+		b.LL.x = ND_coord(n).x + ND_rw_i(n) + (FUDGE-2);
 		b.LL.y = b0.UR.y;
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.UR.x += 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -510,11 +508,11 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else if (side & LEFT) {
 	    b.UR.x = P->start.p.x+1;
 	    if (endp->sidemask == TOP) {
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.y = P->start.p.y-1;
 	    }
 	    else {
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.UR.y = P->start.p.y+1;
 	    }
 	    endp->boxes[0] = b;
@@ -523,11 +521,11 @@ beginpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else {
 	    b.LL.x = P->start.p.x;
 	    if (endp->sidemask == TOP) {
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.y = P->start.p.y;
 	    }
 	    else {
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.UR.y = P->start.p.y+1;
 	    }
 	    endp->boxes[0] = b;
@@ -579,7 +577,6 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 {
     int side, mask;
     node_t *n;
-    pointf np;
     int (*pboxfn) (node_t* n, port*, int, boxf*, int*);
 
     n = e->head;
@@ -590,8 +587,7 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	pboxfn = ND_shape(n)->fns->pboxfn;
     else
 	pboxfn = NULL;
-    P2PF(ND_coord_i(n), np);
-    P->end.p = add_pointfs(np, ED_head_port(e).p);
+    P->end.p = add_pointfs(ND_coord(n), ED_head_port(e).p);
     if (merge) {
 	/*P->end.theta = M_PI / 2; */
 	P->end.theta = conc_slope(e->head) + M_PI;
@@ -617,15 +613,15 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	}
 	else if (side & BOTTOM) {
 	    endp->sidemask = BOTTOM;
-	    if (P->end.p.x < ND_coord_i(n).x) { /* go left */
+	    if (P->end.p.x < ND_coord(n).x) { /* go left */
 		b0.LL.x = b.LL.x-1;
-		/* b0.UR.y = ND_coord_i(n).y - ND_ht_i(n)/2; */
+		/* b0.UR.y = ND_coord(n).y - ND_ht_i(n)/2; */
 		b0.UR.y = P->end.p.y;
 		b0.UR.x = b.UR.x;
-		b0.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2 - GD_ranksep(n->graph)/2;
-		b.UR.x = ND_coord_i(n).x - ND_lw_i(n) - (FUDGE-2);
+		b0.LL.y = ND_coord(n).y - ND_ht_i(n)/2 - GD_ranksep(n->graph)/2;
+		b.UR.x = ND_coord(n).x - ND_lw_i(n) - (FUDGE-2);
 		b.LL.y = b0.UR.y;
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.x -= 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -633,12 +629,12 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	    else {
 		b0.LL.x = b.LL.x;
 		b0.UR.y = P->end.p.y;
-		/* b0.UR.y = ND_coord_i(n).y - ND_ht_i(n)/2; */
+		/* b0.UR.y = ND_coord(n).y - ND_ht_i(n)/2; */
 		b0.UR.x = b.UR.x+1;
-		b0.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2 - GD_ranksep(n->graph)/2;
-		b.LL.x = ND_coord_i(n).x + ND_rw_i(n) + (FUDGE-2);
+		b0.LL.y = ND_coord(n).y - ND_ht_i(n)/2 - GD_ranksep(n->graph)/2;
+		b.LL.x = ND_coord(n).x + ND_rw_i(n) + (FUDGE-2);
 		b.LL.y = b0.UR.y;
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.UR.x += 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -649,7 +645,7 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else if (side & LEFT) {
 	    endp->sidemask = LEFT;
 	    b.UR.x = P->end.p.x;
-	    b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+	    b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 	    b.LL.y = P->end.p.y;
 	    endp->boxes[0] = b;
 	    endp->boxn = 1;
@@ -658,7 +654,7 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	else {
 	    endp->sidemask = RIGHT;
 	    b.LL.x = P->end.p.x;
-	    b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+	    b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 	    b.LL.y = P->end.p.y;
 	    endp->boxes[0] = b;
 	    endp->boxn = 1;
@@ -680,11 +676,11 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	case LEFT:
 	    b.UR.x = P->end.p.x;
 	    if (endp->sidemask == TOP) {
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.y = P->end.p.y;
 	    }
 	    else {
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.UR.y = P->end.p.y;
 	    }
 	    endp->boxes[0] = b;
@@ -693,11 +689,11 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	case RIGHT:
 	    b.LL.x = P->end.p.x-1;
 	    if (endp->sidemask == TOP) {
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.y = P->end.p.y-1;
 	    }
 	    else {
-		b.LL.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b.LL.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b.UR.y = P->end.p.y;
 	    }
 	    endp->boxes[0] = b;
@@ -711,12 +707,12 @@ void endpath(path * P, edge_t * e, int et, pathend_t * endp, boolean merge)
 	case BOTTOM:
 	    if (endp->sidemask == TOP) {
 		b0.LL.x = b.LL.x-1;
-		b0.UR.y = ND_coord_i(n).y - ND_ht_i(n)/2;
+		b0.UR.y = ND_coord(n).y - ND_ht_i(n)/2;
 		b0.UR.x = P->end.p.x;
 		b0.LL.y = b0.UR.y - GD_ranksep(n->graph)/2;
-		b.UR.x = ND_coord_i(n).x - ND_lw_i(n) - 2;
+		b.UR.x = ND_coord(n).x - ND_lw_i(n) - 2;
 		b.LL.y = b0.UR.y;
-		b.UR.y = ND_coord_i(n).y + ND_ht_i(n)/2;
+		b.UR.y = ND_coord(n).y + ND_ht_i(n)/2;
 		b.LL.x -= 1;
 		endp->boxes[0] = b0;
 		endp->boxes[1] = b;
@@ -787,7 +783,7 @@ static void selfBottom (edge_t* edges[], int ind, int cnt,
     stepx = (sizex / 2.) / cnt;
     stepx = MAX(stepx,2.);
     pointn = 0;
-    P2PF(ND_coord_i(n), np);
+    np = ND_coord(n);
     tp = ED_tail_port(e).p;
     tp.x += np.x;
     tp.y += np.y;
@@ -818,8 +814,8 @@ static void selfBottom (edge_t* edges[], int ind, int cnt,
     	    width = ED_label(e)->dimen.x;
     	    height = ED_label(e)->dimen.y;
     	}
-    	ED_label(e)->pos.y = ND_coord_i(n).y - dy - height / 2.0;
-    	ED_label(e)->pos.x = ND_coord_i(n).x;
+    	ED_label(e)->pos.y = ND_coord(n).y - dy - height / 2.0;
+    	ED_label(e)->pos.x = ND_coord(n).x;
     	ED_label(e)->set = TRUE;
     	if (height > stepy)
     	    dy += height - stepy;
@@ -853,7 +849,7 @@ selfTop (edge_t* edges[], int ind, int cnt, double sizex, double stepy,
     stepx = (sizex / 2.) / cnt;
     stepx = MAX(stepx, 2.);
     pointn = 0;
-    P2PF(ND_coord_i(n), np);
+    np = ND_coord(n);
     tp = ED_tail_port(e).p;
     tp.x += np.x;
     tp.y += np.y;
@@ -884,8 +880,8 @@ selfTop (edge_t* edges[], int ind, int cnt, double sizex, double stepy,
 		width = ED_label(e)->dimen.x;
 		height = ED_label(e)->dimen.y;
 	    }
-	    ED_label(e)->pos.y = ND_coord_i(n).y + dy + height / 2.0;
-	    ED_label(e)->pos.x = ND_coord_i(n).x;
+	    ED_label(e)->pos.y = ND_coord(n).y + dy + height / 2.0;
+	    ED_label(e)->pos.x = ND_coord(n).x;
 	    ED_label(e)->set = TRUE;
 	    if (height > stepy)
 		dy += height - stepy;
@@ -919,7 +915,7 @@ selfRight (edge_t* edges[], int ind, int cnt, double stepx, double sizey,
     stepy = (sizey / 2.) / cnt;
     stepy = MAX(stepy, 2.);
     pointn = 0;
-    P2PF(ND_coord_i(n), np);
+    np = ND_coord(n);
     tp = ED_tail_port(e).p;
     tp.x += np.x;
     tp.y += np.y;
@@ -950,8 +946,8 @@ selfRight (edge_t* edges[], int ind, int cnt, double stepx, double sizey,
 		width = ED_label(e)->dimen.x;
 		height = ED_label(e)->dimen.y;
 	    }
-	    ED_label(e)->pos.x = ND_coord_i(n).x + dx + width / 2.0;
-	    ED_label(e)->pos.y = ND_coord_i(n).y;
+	    ED_label(e)->pos.x = ND_coord(n).x + dx + width / 2.0;
+	    ED_label(e)->pos.y = ND_coord(n).y;
 	    ED_label(e)->set = TRUE;
 	    if (width > stepx)
 		dx += width - stepx;
@@ -985,7 +981,7 @@ selfLeft (edge_t* edges[], int ind, int cnt, double stepx, double sizey,
     stepy = (sizey / 2.) / cnt;
     stepy = MAX(stepy,2.);
     pointn = 0;
-    P2PF(ND_coord_i(n), np);
+    np = ND_coord(n);
     tp = ED_tail_port(e).p;
     tp.x += np.x;
     tp.y += np.y;
@@ -1016,8 +1012,8 @@ selfLeft (edge_t* edges[], int ind, int cnt, double stepx, double sizey,
     	    width = ED_label(e)->dimen.x;
     	    height = ED_label(e)->dimen.y;
     	}
-    	ED_label(e)->pos.x = ND_coord_i(n).x - dx - width / 2.0;
-    	ED_label(e)->pos.y = ND_coord_i(n).y;
+    	ED_label(e)->pos.x = ND_coord(n).x - dx - width / 2.0;
+    	ED_label(e)->pos.y = ND_coord(n).y;
     	ED_label(e)->set = TRUE;
     	if (width > stepx)
     	    dx += width - stepx;
diff --git a/lib/common/types.h b/lib/common/types.h
index d2bcf4be9..c428843fd 100644
--- a/lib/common/types.h
+++ b/lib/common/types.h
@@ -430,7 +430,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
     typedef struct Agnodeinfo_t {
 	shape_desc *shape;
 	void *shape_info;
-	point coord;
+	pointf coord;
 	double width, height;
 	boxf bb;
 	int ht, lw, rw;
@@ -483,7 +483,7 @@ typedef enum {NATIVEFONTS,PSFONTS,SVGFONTS} fontname_kind;
 #define ND_alg(n) (n)->u.alg
 #define ND_bb(n) (n)->u.bb
 #define ND_clust(n) (n)->u.clust
-#define ND_coord_i(n) (n)->u.coord
+#define ND_coord(n) (n)->u.coord
 #define ND_dist(n) (n)->u.dist
 #define ND_flat_in(n) (n)->u.flat_in
 #define ND_flat_out(n) (n)->u.flat_out
diff --git a/lib/common/utils.c b/lib/common/utils.c
index e24691da4..8a2621549 100644
--- a/lib/common/utils.c
+++ b/lib/common/utils.c
@@ -1420,7 +1420,7 @@ boolean overlap_node(node_t *n, boxf b)
     if (! OVERLAP(b, bb))
         return FALSE;
 
-    P2PF(ND_coord_i(n),p);
+    p = ND_coord(n);
 
 /*  FIXME - need to do something better about CLOSEENOUGH */
     p.x -= (b.UR.x + b.LL.x) / 2.;
diff --git a/lib/dotgen/compound.c b/lib/dotgen/compound.c
index 7f0a30a6f..34fc44dd9 100644
--- a/lib/dotgen/compound.c
+++ b/lib/dotgen/compound.c
@@ -373,7 +373,7 @@ static void makeCompoundEdge(graph_t * g, edge_t * e)
     fixed = 0;
     if (lh) {
 	bb = &(GD_bb(lh));
-	if (!inBox(ND_coord_i(head), bb)) {
+	if (!inBoxf(ND_coord(head), bb)) {
 	    agerr(AGWARN, "%s -> %s: head not inside head cluster %s\n",
 		  e->tail->name, e->head->name, agget(e, "lhead"));
 	} else {
@@ -383,7 +383,7 @@ static void makeCompoundEdge(graph_t * g, edge_t * e)
 	     * crosses box.
 	     */
 	    if (inBoxf(bez->list[0], bb)) {
-		if (inBox(ND_coord_i(tail), bb)) {
+		if (inBoxf(ND_coord(tail), bb)) {
 		    agerr(AGWARN,
 			  "%s -> %s: tail is inside head cluster %s\n",
 			  e->tail->name, e->head->name, agget(e, "lhead"));
@@ -433,7 +433,7 @@ static void makeCompoundEdge(graph_t * g, edge_t * e)
     fixed = 0;
     if (lt) {
 	bb = &(GD_bb(lt));
-	if (!inBox(ND_coord_i(tail), bb)) {
+	if (!inBoxf(ND_coord(tail), bb)) {
 	    agerr(AGWARN, "%s -> %s: tail not inside tail cluster %s\n",
 		  e->tail->name, head->name, agget(e, "ltail"));
 	} else {
@@ -443,7 +443,7 @@ static void makeCompoundEdge(graph_t * g, edge_t * e)
 	     * arrow head crosses box.
 	     */
 	    if (inBoxf(bez->list[endi], bb)) {
-		if (inBox(ND_coord_i(head), bb)) {
+		if (inBoxf(ND_coord(head), bb)) {
 		    agerr(AGWARN,
 			  "%s -> %s: head is inside tail cluster %s\n",
 			  e->tail->name, e->head->name, agget(e, "ltail"));
diff --git a/lib/dotgen/dotsplines.c b/lib/dotgen/dotsplines.c
index 13aa8882f..9515474cb 100644
--- a/lib/dotgen/dotsplines.c
+++ b/lib/dotgen/dotsplines.c
@@ -50,7 +50,6 @@
 	ED_to_orig(newp) = old; \
 }
 
-#define P2PF(p, pf) (pf.x = p.x, pf.y = p.y)
 #define AVG(a, b) ((a + b) / 2)
 
 static boxf boxes[1000];
@@ -236,9 +235,9 @@ static void _dot_splines(graph_t * g, int normalize)
     for (i = GD_minrank(g); i <= GD_maxrank(g); i++) {
 	n_nodes += GD_rank(g)[i].n;
 	if ((n = GD_rank(g)[i].v[0]))
-	    sd.LeftBound = MIN(sd.LeftBound, (ND_coord_i(n).x - ND_lw_i(n)));
+	    sd.LeftBound = MIN(sd.LeftBound, (ND_coord(n).x - ND_lw_i(n)));
 	if (GD_rank(g)[i].n && (n = GD_rank(g)[i].v[GD_rank(g)[i].n - 1]))
-	    sd.RightBound = MAX(sd.RightBound, (ND_coord_i(n).x + ND_rw_i(n)));
+	    sd.RightBound = MAX(sd.RightBound, (ND_coord(n).x + ND_rw_i(n)));
 	sd.LeftBound -= MINW;
 	sd.RightBound += MINW;
 
@@ -250,7 +249,7 @@ static void _dot_splines(graph_t * g, int normalize)
 	    if (ND_alg(n)) {
 		edge_t* fe = (edge_t*)ND_alg(n);
 		assert (ED_label(fe));
-		P2PF(ND_coord_i(n), ED_label(fe)->pos);
+		ED_label(fe)->pos = ND_coord(n);
 	    }
 	    if ((ND_node_type(n) != NORMAL) &&
 		(sinfo.splineMerge(n) == FALSE))
@@ -350,16 +349,16 @@ static void _dot_splines(graph_t * g, int normalize)
 	    r = ND_rank(n);
 	    if (r == GD_maxrank(g)) {
 		if (r > 0)
-		    sizey = ND_coord_i(GD_rank(g)[r-1].v[0]).y - ND_coord_i(n).y;
+		    sizey = ND_coord(GD_rank(g)[r-1].v[0]).y - ND_coord(n).y;
 		else
 		    sizey = ND_ht_i(n);
 	    }
 	    else if (r == GD_minrank(g)) {
-		sizey = ND_coord_i(n).y - ND_coord_i(GD_rank(g)[r+1].v[0]).y;
+		sizey = ND_coord(n).y - ND_coord(GD_rank(g)[r+1].v[0]).y;
 	    }
 	    else {
-		int upy = ND_coord_i(GD_rank(g)[r-1].v[0]).y - ND_coord_i(n).y;
-		int dwny = ND_coord_i(n).y - ND_coord_i(GD_rank(g)[r+1].v[0]).y;
+		int upy = ND_coord(GD_rank(g)[r-1].v[0]).y - ND_coord(n).y;
+		int dwny = ND_coord(n).y - ND_coord(GD_rank(g)[r+1].v[0]).y;
 		sizey = MIN(upy, dwny);
 	    }
 	    makeSelfEdge(P, edges, ind, cnt, sd.Multisep, sizey/2, &sinfo);
@@ -453,8 +452,8 @@ place_vnlabel(node_t * n)
 	 e = ED_to_orig(e));
     dimen = ED_label(e)->dimen;
     width = GD_flip(n->graph) ? dimen.y : dimen.x;
-    ED_label(e)->pos.x = ND_coord_i(n).x + width / 2.0;
-    ED_label(e)->pos.y = ND_coord_i(n).y;
+    ED_label(e)->pos.x = ND_coord(n).x + width / 2.0;
+    ED_label(e)->pos.y = ND_coord(n).y;
 }
 
 static void 
@@ -516,8 +515,8 @@ static int edgecmp(edge_t** ptr0, edge_t** ptr1)
     v1 = ND_rank(le1->tail) - ND_rank(le1->head), v1 = ABS(v1);
     if (v0 != v1)
 	return (v0 - v1);
-    v0 = ND_coord_i(le0->tail).x - ND_coord_i(le0->head).x, v0 = ABS(v0);
-    v1 = ND_coord_i(le1->tail).x - ND_coord_i(le1->head).x, v1 = ABS(v1);
+    v0 = ND_coord(le0->tail).x - ND_coord(le0->head).x, v0 = ABS(v0);
+    v1 = ND_coord(le1->tail).x - ND_coord(le1->head).x, v1 = ABS(v1);
     if (v0 != v1)
 	return (v0 - v1);
     /* This provides a cheap test for edges having the same set of endpoints.
@@ -686,15 +685,12 @@ static void
 makeSimpleFlat (node_t* tn, node_t* hn, edge_t** edges, int ind, int cnt, int et)
 {
     edge_t* e = edges[ind];
-    pointf points[10], np, tp, hp;
+    pointf points[10], tp, hp;
     int i, pointn;
     double stepy, dy;
 
-    P2PF(ND_coord_i(tn), np);
-    tp = add_pointfs(np, ED_tail_port(e).p);
-
-    P2PF(ND_coord_i(hn), np);
-    hp = add_pointfs(np, ED_head_port(e).p);
+    tp = add_pointfs(ND_coord(tn), ED_tail_port(e).p);
+    hp = add_pointfs(ND_coord(hn), ED_head_port(e).p);
 
     stepy = (cnt > 1) ? ND_ht_i(tn) / (double)(cnt - 1) : 0.;
     dy = tp.y - ((cnt > 1) ? ND_ht_i(tn) / 2. : 0.);
@@ -765,8 +761,8 @@ make_flat_adj_edges(path* P, edge_t** edges, int ind, int cnt, edge_t* e0,
     auxg = cloneGraph (g);
     subg = agsubg (auxg, "xxx");
     agset (subg, "rank", "source");
-    rightx = ND_coord_i(hn).x;
-    leftx = ND_coord_i(tn).x;
+    rightx = ND_coord(hn).x;
+    leftx = ND_coord(tn).x;
     if (GD_flip(g)) {
         node_t* n;
         n = tn;
@@ -800,18 +796,18 @@ make_flat_adj_edges(path* P, edge_t** edges, int ind, int cnt, edge_t* e0,
     dot_position(auxg);
     
     /* reposition */
-    midx = (ND_coord_i(tn).x - ND_rw_i(tn) + ND_coord_i(hn).x + ND_lw_i(hn))/2;
-    midy = (ND_coord_i(auxt).x + ND_coord_i(auxh).x)/2;
+    midx = (ND_coord(tn).x - ND_rw_i(tn) + ND_coord(hn).x + ND_lw_i(hn))/2;
+    midy = (ND_coord(auxt).x + ND_coord(auxh).x)/2;
     for (n = GD_nlist(auxg); n; n = ND_next(n)) {
 	if (n == auxt) {
-	    ND_coord_i(n).y = rightx;
-	    ND_coord_i(n).x = midy;
+	    ND_coord(n).y = rightx;
+	    ND_coord(n).x = midy;
 	}
 	else if (n == auxh) {
-	    ND_coord_i(n).y = leftx;
-	    ND_coord_i(n).x = midy;
+	    ND_coord(n).y = leftx;
+	    ND_coord(n).x = midy;
 	}
-	else ND_coord_i(n).y = midx;
+	else ND_coord(n).y = midx;
     }
     dot_sameports(auxg);
     _dot_splines(auxg, 0);
@@ -819,12 +815,12 @@ make_flat_adj_edges(path* P, edge_t** edges, int ind, int cnt, edge_t* e0,
 
        /* copy splines */
     if (GD_flip(g)) {
-	del.x = ND_coord_i(tn).x - ND_coord_i(auxt).y;
-	del.y = ND_coord_i(tn).y + ND_coord_i(auxt).x;
+	del.x = ND_coord(tn).x - ND_coord(auxt).y;
+	del.y = ND_coord(tn).y + ND_coord(auxt).x;
     }
     else {
-	del.x = ND_coord_i(tn).x - ND_coord_i(auxt).x;
-	del.y = ND_coord_i(tn).y - ND_coord_i(auxt).y;
+	del.x = ND_coord(tn).x - ND_coord(auxt).x;
+	del.y = ND_coord(tn).y - ND_coord(auxt).y;
     }
     for (i = 0; i < cnt; i++) {
 	bezier* auxbz;
@@ -884,7 +880,7 @@ makeFlatEnd (spline_info_t* sp, path* P, node_t* n, edge_t* e, pathend_t* endp,
     else endpath(P, e, FLATEDGE, endp, FALSE);
     b.UR.y = endp->boxes[endp->boxn - 1].UR.y;
     b.LL.y = endp->boxes[endp->boxn - 1].LL.y;
-    b = makeregularend(b, TOP, ND_coord_i(n).y + GD_rank(g)[ND_rank(n)].ht2);
+    b = makeregularend(b, TOP, ND_coord(n).y + GD_rank(g)[ND_rank(n)].ht2);
     if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	endp->boxes[endp->boxn++] = b;
 }
@@ -903,7 +899,7 @@ makeBottomFlatEnd (spline_info_t* sp, path* P, node_t* n, edge_t* e,
     else endpath(P, e, FLATEDGE, endp, FALSE);
     b.UR.y = endp->boxes[endp->boxn - 1].UR.y;
     b.LL.y = endp->boxes[endp->boxn - 1].LL.y;
-    b = makeregularend(b, BOTTOM, ND_coord_i(n).y - GD_rank(g)[ND_rank(n)].ht2);
+    b = makeregularend(b, BOTTOM, ND_coord(n).y - GD_rank(g)[ND_rank(n)].ht2);
     if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	endp->boxes[endp->boxn++] = b;
 }
@@ -929,16 +925,13 @@ make_flat_labeled_edge(spline_info_t* sp, path* P, edge_t* e, int et)
 
     for (f = ED_to_virt(e); ED_to_virt(f); f = ED_to_virt(f));
     ln = f->tail;
-    P2PF(ND_coord_i(ln), ED_label(e)->pos);
+    ED_label(e)->pos = ND_coord(ln);
 
     if (et == ET_LINE) {
-	pointf np, startp, endp, lp;
-
-        P2PF(ND_coord_i(tn), np);
-	startp = add_pointfs(np, ED_tail_port(e).p);
+	pointf startp, endp, lp;
 
-        P2PF(ND_coord_i(hn), np);
-	endp = add_pointfs(np, ED_head_port(e).p);
+	startp = add_pointfs(ND_coord(tn), ED_tail_port(e).p);
+	endp = add_pointfs(ND_coord(hn), ED_head_port(e).p);
 
         lp = ED_label(e)->pos;
 	lp.y -= (ED_label(e)->dimen.y)/2.0;
@@ -949,11 +942,11 @@ make_flat_labeled_edge(spline_info_t* sp, path* P, edge_t* e, int et)
 	pn = 7;
     }
     else {
-	lb.LL.x = ND_coord_i(ln).x - ND_lw_i(ln);
-	lb.UR.x = ND_coord_i(ln).x + ND_rw_i(ln);
-	lb.UR.y = ND_coord_i(ln).y + ND_ht_i(ln)/2;
-	ydelta = ND_coord_i(ln).y - GD_rank(g)[ND_rank(tn)].ht1 -
-		ND_coord_i(tn).y + GD_rank(g)[ND_rank(tn)].ht2;
+	lb.LL.x = ND_coord(ln).x - ND_lw_i(ln);
+	lb.UR.x = ND_coord(ln).x + ND_rw_i(ln);
+	lb.UR.y = ND_coord(ln).y + ND_ht_i(ln)/2;
+	ydelta = ND_coord(ln).y - GD_rank(g)[ND_rank(tn)].ht1 -
+		ND_coord(tn).y + GD_rank(g)[ND_rank(tn)].ht2;
 	ydelta /= 6.;
 	lb.LL.y = lb.UR.y - MAX(5.,ydelta); 
 
@@ -1007,8 +1000,8 @@ make_flat_bottom_edges(spline_info_t* sp, path * P, edge_t ** edges, int
     r = ND_rank(tn);
     if (r < GD_maxrank(g)) {
 	nextr = GD_rank(g) + (r+1);
-	vspace = ND_coord_i(tn).y - GD_rank(g)[r].pht1 -
-		(ND_coord_i(nextr->v[0]).y + nextr->pht2);
+	vspace = ND_coord(tn).y - GD_rank(g)[r].pht1 -
+		(ND_coord(nextr->v[0]).y + nextr->pht2);
     }
     else {
 	vspace = GD_ranksep(g);
@@ -1113,7 +1106,7 @@ make_flat_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt, i
 	    prevr = GD_rank(g) + (r-2);
 	else
 	    prevr = GD_rank(g) + (r-1);
-	vspace = ND_coord_i(prevr->v[0]).y - prevr->ht1 - ND_coord_i(tn).y - GD_rank(g)[r].ht2;
+	vspace = ND_coord(prevr->v[0]).y - prevr->ht1 - ND_coord(tn).y - GD_rank(g)[r].ht2;
     }
     else {
 	vspace = GD_ranksep(g);
@@ -1196,7 +1189,7 @@ makeLineEdge(edge_t* fe, pointf* points, node_t** hp)
     node_t* hn;
     node_t* tn;
     edge_t* e = fe;
-    pointf np, startp, endp, lp;
+    pointf startp, endp, lp;
     pointf dimen;
     double width, height;
 
@@ -1209,17 +1202,13 @@ makeLineEdge(edge_t* fe, pointf* points, node_t** hp)
 	return 0;
     if (fe->tail == e->tail) {
 	*hp = hn;
-	P2PF(ND_coord_i(tn), np);
-	startp = add_pointfs(np, ED_tail_port(e).p);
-	P2PF(ND_coord_i(hn), np);
-	endp = add_pointfs(np, ED_head_port(e).p);
+	startp = add_pointfs(ND_coord(tn), ED_tail_port(e).p);
+	endp = add_pointfs(ND_coord(hn), ED_head_port(e).p);
     }
     else {
  	*hp = tn; 
-	P2PF(ND_coord_i(hn), np);
-	startp = add_pointfs(np, ED_head_port(e).p);
-	P2PF(ND_coord_i(tn), np);
-	endp = add_pointfs(np, ED_tail_port(e).p);
+	startp = add_pointfs(ND_coord(hn), ED_head_port(e).p);
+	endp = add_pointfs(ND_coord(tn), ED_tail_port(e).p);
     }
 
     if (ED_label(e)) {
@@ -1320,7 +1309,7 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
 	b.UR.y = tend.boxes[tend.boxn - 1].UR.y;
 	b.LL.y = tend.boxes[tend.boxn - 1].LL.y;
 	b = makeregularend(b, BOTTOM,
-	    	   ND_coord_i(tn).y - GD_rank(tn->graph)[ND_rank(tn)].ht1);
+	    	   ND_coord(tn).y - GD_rank(tn->graph)[ND_rank(tn)].ht1);
 	if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	    tend.boxes[tend.boxn++] = b;
 	longedge = 0;
@@ -1345,7 +1334,7 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
 	    hend.nb = maximal_bbox(sp, hn, e, ND_out(hn).list[0]);
 	    endpath(P, e, REGULAREDGE, &hend, spline_merge(e->head));
 	    b = makeregularend(hend.boxes[hend.boxn - 1], TOP,
-	    	       ND_coord_i(hn).y + GD_rank(hn->graph)[ND_rank(hn)].ht2);
+	    	       ND_coord(hn).y + GD_rank(hn->graph)[ND_rank(hn)].ht2);
 	    if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	        hend.boxes[hend.boxn++] = b;
 	    P->end.theta = M_PI / 2, P->end.constrained = TRUE;
@@ -1373,7 +1362,7 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
 	    tend.nb = maximal_bbox(sp, tn, ND_in(tn).list[0], e);
 	    beginpath(P, e, REGULAREDGE, &tend, spline_merge(e->tail));
 	    b = makeregularend(tend.boxes[tend.boxn - 1], BOTTOM,
-	    	       ND_coord_i(tn).y - GD_rank(tn->graph)[ND_rank(tn)].ht1);
+	    	       ND_coord(tn).y - GD_rank(tn->graph)[ND_rank(tn)].ht1);
 	    if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	        tend.boxes[tend.boxn++] = b;
 	    P->start.theta = -M_PI / 2, P->start.constrained = TRUE;
@@ -1386,7 +1375,7 @@ make_regular_edge(spline_info_t* sp, path * P, edge_t ** edges, int ind, int cnt
 	b.UR.y = hend.boxes[hend.boxn - 1].UR.y;
 	b.LL.y = hend.boxes[hend.boxn - 1].LL.y;
 	b = makeregularend(b, TOP,
-	    	   ND_coord_i(hn).y + GD_rank(hn->graph)[ND_rank(hn)].ht2);
+	    	   ND_coord(hn).y + GD_rank(hn->graph)[ND_rank(hn)].ht2);
 	if (b.LL.x < b.UR.x && b.LL.y < b.UR.y)
 	    hend.boxes[hend.boxn++] = b;
 	completeregularpath(P, segfirst, e, &tend, &hend, boxes, boxn,
@@ -1738,9 +1727,9 @@ static boxf rank_box(spline_info_t* sp, graph_t * g, int r)
 	left1 = GD_rank(g)[r + 1].v[0];
 	/* right1 = GD_rank(g)[r + 1].v[GD_rank(g)[r + 1].n - 1]; */
 	b.LL.x = sp->LeftBound;
-	b.LL.y = ND_coord_i(left1).y + GD_rank(g)[r + 1].ht2;
+	b.LL.y = ND_coord(left1).y + GD_rank(g)[r + 1].ht2;
 	b.UR.x = sp->RightBound;
-	b.UR.y = ND_coord_i(left0).y - GD_rank(g)[r].ht1;
+	b.UR.y = ND_coord(left0).y - GD_rank(g)[r].ht1;
 	sp->Rank_box[r] = b;
     }
     return b;
@@ -1759,7 +1748,7 @@ static int straight_len(node_t * n)
 	    break;
 	if ((ND_out(v).size != 1) || (ND_in(v).size != 1))
 	    break;
-	if (ND_coord_i(v).x != ND_coord_i(n).x)
+	if (ND_coord(v).x != ND_coord(n).x)
 	    break;
 	cnt++;
     }
@@ -1775,7 +1764,7 @@ static edge_t *straight_path(edge_t * e, int cnt, pointf * plist, int *np)
 	f = ND_out(f->head).list[0];
     plist[(*np)++] = plist[n - 1];
     plist[(*np)++] = plist[n - 1];
-    P2PF(ND_coord_i(f->tail), plist[(*np)]); /* will be overwritten by next spline */
+    plist[(*np)] = ND_coord(f->tail);  /* will be overwritten by next spline */
 
     return f;
 }
@@ -1789,11 +1778,11 @@ static void recover_slack(edge_t * e, path * p)
     for (vn = e->head;
 	 ND_node_type(vn) == VIRTUAL && !sinfo.splineMerge(vn);
 	 vn = ND_out(vn).list[0]->head) {
-	while ((b < p->nbox) && (p->boxes[b].LL.y > ND_coord_i(vn).y))
+	while ((b < p->nbox) && (p->boxes[b].LL.y > ND_coord(vn).y))
 	    b++;
 	if (b >= p->nbox)
 	    break;
-	if (p->boxes[b].UR.y < ND_coord_i(vn).y)
+	if (p->boxes[b].UR.y < ND_coord(vn).y)
 	    continue;
 	if (ND_label(vn))
 	    resize_vn(vn, p->boxes[b].LL.x, p->boxes[b].UR.x,
@@ -1809,7 +1798,7 @@ static void resize_vn(vn, lx, cx, rx)
 node_t *vn;
 int lx, cx, rx;
 {
-    ND_coord_i(vn).x = cx;
+    ND_coord(vn).x = cx;
     ND_lw_i(vn) = cx - lx, ND_rw_i(vn) = rx - cx;
 }
 
@@ -1858,75 +1847,12 @@ static edge_t *bot_bound(edge_t * e, int side)
     return ans;
 }
 
-#if 0
-/* not used */
-
-point closest(splines * spl, point p)
-{
-    int i, j, k, besti, bestj;
-    double bestdist2, d2, dlow2, dhigh2; /* squares of distance */
-    double low, high, t;
-    pointf c[4], pt2, pt;
-    point rv;
-    bezier bz;
-
-    besti = bestj = -1;
-    bestdist2 = 1e+38;
-    P2PF(p, pt);
-    for (i = 0; i < spl->size; i++) {
-	bz = spl->list[i];
-	for (j = 0; j < bz.size; j++) {
-	    pointf b;
-
-	    b.x = bz.list[j].x;
-	    b.y = bz.list[j].y;
-	    d2 = DIST2(b, pt);
-	    if ((bestj == -1) || (d2 < bestdist2)) {
-		besti = i;
-		bestj = j;
-		bestdist2 = d2;
-	    }
-	}
-    }
-
-    bz = spl->list[besti];
-    j = bestj / 3;
-    if (j >= spl->size)
-	j--;
-    for (k = 0; k < 4; k++) {
-	c[k].x = bz.list[j + k].x;
-	c[k].y = bz.list[j + k].y;
-    }
-    low = 0.0;
-    high = 1.0;
-    dlow2 = DIST2(c[0], pt);
-    dhigh2 = DIST2(c[3], pt);
-    do {
-	t = (low + high) / 2.0;
-	pt2 = Bezier(c, 3, t, NULL, NULL);
-	if (fabs(dlow2 - dhigh2) < 1.0)
-	    break;
-	if (fabs(high - low) < .00001)
-	    break;
-	if (dlow2 < dhigh2) {
-	    high = t;
-	    dhigh2 = DIST2(pt2, pt);
-	} else {
-	    low = t;
-	    dlow2 = DIST2(pt2, pt);
-	}
-    } while (1);
-    PF2P(pt2, rv);
-    return rv;
-}
-#endif
-
 /* common routines */
 
 static int cl_vninside(graph_t * cl, node_t * n)
 {
-    return (BETWEEN(GD_bb(cl).LL.x, (double)(ND_coord_i(n).x), GD_bb(cl).UR.x) &&
-	    BETWEEN(GD_bb(cl).LL.y, (double)(ND_coord_i(n).y), GD_bb(cl).UR.y));
+    return (BETWEEN(GD_bb(cl).LL.x, (double)(ND_coord(n).x), GD_bb(cl).UR.x) &&
+	    BETWEEN(GD_bb(cl).LL.y, (double)(ND_coord(n).y), GD_bb(cl).UR.y));
 }
 
 /* returns the cluster of (adj) that interferes with n,
@@ -1983,12 +1909,12 @@ static boxf maximal_bbox(spline_info_t* sp, node_t* vn, edge_t* ie, edge_t* oe)
     left_cl = right_cl = NULL;
 
     /* give this node all the available space up to its neighbors */
-    b = (double)(ND_coord_i(vn).x - ND_lw_i(vn) - FUDGE);
+    b = (double)(ND_coord(vn).x - ND_lw_i(vn) - FUDGE);
     if ((left = neighbor(vn, ie, oe, -1))) {
 	if ((left_cl = cl_bound(vn, left)))
 	    nb = GD_bb(left_cl).UR.x + (double)(sp->Splinesep);
 	else {
-	    nb = (double)(ND_coord_i(left).x + ND_mval(left));
+	    nb = (double)(ND_coord(left).x + ND_mval(left));
 	    if (ND_node_type(left) == NORMAL)
 		nb += GD_nodesep(g) / 2.;
 	    else
@@ -2002,14 +1928,14 @@ static boxf maximal_bbox(spline_info_t* sp, node_t* vn, edge_t* ie, edge_t* oe)
 
     /* we have to leave room for our own label! */
     if ((ND_node_type(vn) == VIRTUAL) && (ND_label(vn)))
-	b = (double)(ND_coord_i(vn).x + 10);
+	b = (double)(ND_coord(vn).x + 10);
     else
-	b = (double)(ND_coord_i(vn).x + ND_rw_i(vn) + FUDGE);
+	b = (double)(ND_coord(vn).x + ND_rw_i(vn) + FUDGE);
     if ((right = neighbor(vn, ie, oe, 1))) {
 	if ((right_cl = cl_bound(vn, right)))
 	    nb = GD_bb(right_cl).LL.x - (double)(sp->Splinesep);
 	else {
-	    nb = ND_coord_i(right).x - ND_lw_i(right);
+	    nb = ND_coord(right).x - ND_lw_i(right);
 	    if (ND_node_type(right) == NORMAL)
 		nb -= GD_nodesep(g) / 2.;
 	    else
@@ -2024,8 +1950,8 @@ static boxf maximal_bbox(spline_info_t* sp, node_t* vn, edge_t* ie, edge_t* oe)
     if ((ND_node_type(vn) == VIRTUAL) && (ND_label(vn)))
 	rv.UR.x -= ND_rw_i(vn);
 
-    rv.LL.y = ND_coord_i(vn).y - GD_rank(g)[ND_rank(vn)].ht1;
-    rv.UR.y = ND_coord_i(vn).y + GD_rank(g)[ND_rank(vn)].ht2;
+    rv.LL.y = ND_coord(vn).y - GD_rank(g)[ND_rank(vn)].ht1;
+    rv.UR.y = ND_coord(vn).y + GD_rank(g)[ND_rank(vn)].ht2;
     return rv;
 }
 
diff --git a/lib/dotgen/flat.c b/lib/dotgen/flat.c
index 494d4ca1c..aeb9395ee 100644
--- a/lib/dotgen/flat.c
+++ b/lib/dotgen/flat.c
@@ -152,10 +152,10 @@ flat_node(edge_t * e)
     place = flat_limits(g, e);
     /* grab ypos = LL.y of label box before make_vn_slot() */
     if ((n = GD_rank(g)[r - 1].v[0]))
-	ypos = ND_coord_i(n).y - GD_rank(g)[r - 1].ht1;
+	ypos = ND_coord(n).y - GD_rank(g)[r - 1].ht1;
     else {
 	n = GD_rank(g)[r].v[0];
-	ypos = ND_coord_i(n).y + GD_rank(g)[r].ht2 + GD_ranksep(g);
+	ypos = ND_coord(n).y + GD_rank(g)[r].ht2 + GD_ranksep(g);
     }
     vn = make_vn_slot(g, r - 1, place);
     dimen = ED_label(e)->dimen;
@@ -168,7 +168,7 @@ flat_node(edge_t * e)
     h2 = ND_ht_i(vn) / 2;
     ND_lw_i(vn) = ND_rw_i(vn) = dimen.x / 2;
     ND_label(vn) = ED_label(e);
-    ND_coord_i(vn).y = ypos + h2;
+    ND_coord(vn).y = ypos + h2;
     ve = virtual_edge(vn, e->tail, e);	/* was NULL? */
     ED_tail_port(ve).p.x = -ND_lw_i(vn);
     ED_head_port(ve).p.x = ND_rw_i(e->tail);
diff --git a/lib/dotgen/position.c b/lib/dotgen/position.c
index 56bdf8122..4e6a370d0 100644
--- a/lib/dotgen/position.c
+++ b/lib/dotgen/position.c
@@ -16,7 +16,7 @@
 
 
 /*
- * position(g): set ND_coord_i(n) (x and y) for all nodes n of g, using GD_rank(g).
+ * position(g): set ND_coord(n) (x and y) for all nodes n of g, using GD_rank(g).
  * (the graph may be modified by merging certain edges with a common endpoint.)
  * the coordinates are computed by constructing and ranking an auxiliary graph.
  * then leaf nodes are inserted in the fast graph.  cluster boundary nodes are
@@ -574,7 +574,7 @@ set_xcoords(graph_t * g)
     for (i = GD_minrank(g); i <= GD_maxrank(g); i++) {
 	for (j = 0; j < rank[i].n; j++) {
 	    v = rank[i].v[j];
-	    ND_coord_i(v).x = ND_rank(v);
+	    ND_coord(v).x = ND_rank(v);
 	    ND_rank(v) = i;
 	}
     }
@@ -711,8 +711,7 @@ static void adjustRanks(graph_t * g, int equal)
 	lht = MAX(GD_border(g)[LEFT_IX].y, GD_border(g)[RIGHT_IX].y);
 	maxr = GD_maxrank(g);
 	minr = GD_minrank(g);
-	rht =
-	    ND_coord_i(rank[minr].v[0]).y - ND_coord_i(rank[maxr].v[0]).y;
+	rht = ND_coord(rank[minr].v[0]).y - ND_coord(rank[maxr].v[0]).y;
 	delta = lht - (rht + ht1 + ht2);
 	if (delta > 0) {
 	    if (equal)
@@ -857,7 +856,7 @@ static void set_ycoords(graph_t * g)
 
     /* copy ycoord assignment from leftmost nodes to others */
     for (n = GD_nlist(g); n; n = ND_next(n))
-	ND_coord_i(n).y = rank[ND_rank(n)].v[0]->u.coord.y;
+	ND_coord(n).y = rank[ND_rank(n)].v[0]->u.coord.y;
 }
 
 /* dot_compute_bb:
@@ -886,7 +885,7 @@ static void dot_compute_bb(graph_t * g, graph_t * root)
 	    for (c = 1; (ND_node_type(v) != NORMAL) && c < rnkn; c++)
 		v = GD_rank(g)[r].v[c];
 	    if (ND_node_type(v) == NORMAL) {
-		x = (double)(ND_coord_i(v).x - ND_lw_i(v));
+		x = ND_coord(v).x - ND_lw_i(v);
 		LL.x = MIN(LL.x, x);
 	    }
 	    else continue;
@@ -894,7 +893,7 @@ static void dot_compute_bb(graph_t * g, graph_t * root)
 	    v = GD_rank(g)[r].v[rnkn - 1];
 	    for (c = rnkn-2; ND_node_type(v) != NORMAL; c--)
 		v = GD_rank(g)[r].v[c];
-	    x = (double)(ND_coord_i(v).x + ND_rw_i(v));
+	    x = ND_coord(v).x + ND_rw_i(v);
 	    UR.x = MAX(UR.x, x);
 	}
 	offset = CL_OFFSET;
@@ -1014,8 +1013,8 @@ static void set_aspect(graph_t * g)
 		yf = t;
 	    }
 	    for (n = GD_nlist(g); n; n = ND_next(n)) {
-		ND_coord_i(n).x = ND_coord_i(n).x * xf;
-		ND_coord_i(n).y = ND_coord_i(n).y * yf;
+		ND_coord(n).x = ROUND(ND_coord(n).x * xf);
+		ND_coord(n).y = ROUND(ND_coord(n).y * yf);
 	    }
 	    scale_bb(g, g, xf, yf);
 	}
@@ -1025,10 +1024,9 @@ static void set_aspect(graph_t * g)
 static point resize_leaf(node_t * leaf, point lbound)
 {
     dot_nodesize(leaf, GD_flip(leaf->graph));
-    ND_coord_i(leaf).y = lbound.y;
-    ND_coord_i(leaf).x = lbound.x + ND_lw_i(leaf);
-    lbound.x =
-	lbound.x + ND_lw_i(leaf) + ND_rw_i(leaf) + GD_nodesep(leaf->graph);
+    ND_coord(leaf).y = lbound.y;
+    ND_coord(leaf).x = lbound.x + ND_lw_i(leaf);
+    lbound.x = lbound.x + ND_lw_i(leaf) + ND_rw_i(leaf) + GD_nodesep(leaf->graph);
     return lbound;
 }
 
@@ -1083,8 +1081,8 @@ static void do_leaves(graph_t * g, node_t * leader)
 
     if (ND_UF_size(leader) <= 1)
 	return;
-    lbound.x = ND_coord_i(leader).x - ND_lw_i(leader);
-    lbound.y = ND_coord_i(leader).y;
+    lbound.x = ND_coord(leader).x - ND_lw_i(leader);
+    lbound.y = ND_coord(leader).y;
     lbound = resize_leaf(leader, lbound);
     if (ND_out(leader).size > 0) {	/* in-edge leaves */
 	n = ND_out(leader).list[0]->head;
diff --git a/lib/dotgen/sameport.c b/lib/dotgen/sameport.c
index aca7cc057..c2a827175 100644
--- a/lib/dotgen/sameport.c
+++ b/lib/dotgen/sameport.c
@@ -125,8 +125,8 @@ static void sameport(node_t * u, elist * l, double arr_len)
 	    v = e->tail;
 	else
 	    v = e->head;
-	x1 = ND_coord_i(v).x - ND_coord_i(u).x;
-	y1 = ND_coord_i(v).y - ND_coord_i(u).y;
+	x1 = ND_coord(v).x - ND_coord(u).x;
+	y1 = ND_coord(v).y - ND_coord(u).y;
 	r = hypot(x1, y1);
 	x += x1 / r;
 	y += y1 / r;
@@ -136,11 +136,11 @@ static void sameport(node_t * u, elist * l, double arr_len)
     y /= r;
 
     /* (x1,y1),(x2,y2) is a segment that must cross the node boundary */
-    x1 = ND_coord_i(u).x;
-    y1 = ND_coord_i(u).y;	/* center of node */
+    x1 = ND_coord(u).x;
+    y1 = ND_coord(u).y;	/* center of node */
     r = MAX(ND_lw_i(u) + ND_rw_i(u), ND_ht_i(u) + GD_ranksep(u->graph));	/* far away */
-    x2 = x * r + ND_coord_i(u).x;
-    y2 = y * r + ND_coord_i(u).y;
+    x2 = x * r + ND_coord(u).x;
+    y2 = y * r + ND_coord(u).y;
     {				/* now move (x1,y1) to the node boundary */
 	pointf curve[4];		/* bezier control points for a straight line */
 	curve[0].x = x1;
@@ -153,8 +153,8 @@ static void sameport(node_t * u, elist * l, double arr_len)
 	curve[3].y = y2;
 
 	shape_clip(u, curve);
-	x1 = curve[0].x - ND_coord_i(u).x;
-	y1 = curve[0].y - ND_coord_i(u).y;
+	x1 = curve[0].x - ND_coord(u).x;
+	y1 = curve[0].y - ND_coord(u).y;
     }
 
     /* compute PORT on the boundary */
diff --git a/lib/neatogen/neatoinit.c b/lib/neatogen/neatoinit.c
index 21ad4cecd..814715670 100644
--- a/lib/neatogen/neatoinit.c
+++ b/lib/neatogen/neatoinit.c
@@ -628,8 +628,8 @@ int init_nop(Agraph_t * g, int adjust)
 	node_t *n;
 	State = GVSPLINES;
 	for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
-	    ND_coord_i(n).x = POINTS(ND_pos(n)[0]);
-	    ND_coord_i(n).y = POINTS(ND_pos(n)[1]);
+	    ND_coord(n).x = POINTS(ND_pos(n)[0]);
+	    ND_coord(n).y = POINTS(ND_pos(n)[1]);
 	}
     }
     else if (posEdges != AllEdges)
diff --git a/lib/neatogen/neatosplines.c b/lib/neatogen/neatosplines.c
index bf5828525..a6f226483 100644
--- a/lib/neatogen/neatosplines.c
+++ b/lib/neatogen/neatosplines.c
@@ -88,7 +88,7 @@ make_barriers(Ppoly_t ** poly, int npoly, int pp, int qp,
 
 /* genPt:
  */
-static Ppoint_t genPt(double x, double y, point c)
+static Ppoint_t genPt(double x, double y, pointf c)
 {
     Ppoint_t p;
 
@@ -100,7 +100,7 @@ static Ppoint_t genPt(double x, double y, point c)
 
 /* recPt:
  */
-static Ppoint_t recPt(double x, double y, point c, expand_t* m)
+static Ppoint_t recPt(double x, double y, pointf c, expand_t* m)
 {
     Ppoint_t p;
 
@@ -428,14 +428,10 @@ makeStraightEdge(graph_t * g, edge_t * e, int doPolyline)
     int i, j, xstep, dx;
     double l_perp;
     pointf dumber[4];
-    pointf p, q, np;
-
-    P2PF(ND_coord_i(n), np);
-    p = dumb[1] = dumb[0] = add_pointfs(np, ED_tail_port(e).p);
-
-    P2PF(ND_coord_i(head), np);
-    q = dumb[2] = dumb[3] = add_pointfs(np, ED_head_port(e).p);
+    pointf p, q;
 
+    p = dumb[1] = dumb[0] = add_pointfs(ND_coord(n), ED_tail_port(e).p);
+    q = dumb[2] = dumb[3] = add_pointfs(ND_coord(head), ED_head_port(e).p);
     if (e_cnt == 1) {
 	clip_and_install(e, e->head, dumb, 4, &sinfo);
 	addEdgeLabels(e, p, q);
@@ -523,7 +519,7 @@ Ppoly_t *makeObstacle(node_t * n, expand_t* pmargin)
     int j, sides;
     pointf polyp;
     boxf b;
-    point pt;
+    pointf pt;
     field_t *fld;
     epsf_t *desc;
 
@@ -590,8 +586,8 @@ Ppoly_t *makeObstacle(node_t * n, expand_t* pmargin)
 		    polyp.y = pmargin->y * s * ND_ht_i(n) / 2.0;
 		}
 	    }
-	    obs->ps[sides - j - 1].x = polyp.x + ND_coord_i(n).x;
-	    obs->ps[sides - j - 1].y = polyp.y + ND_coord_i(n).y;
+	    obs->ps[sides - j - 1].x = polyp.x + ND_coord(n).x;
+	    obs->ps[sides - j - 1].y = polyp.y + ND_coord(n).y;
 	}
 	break;
     case SH_RECORD:
@@ -601,7 +597,7 @@ Ppoly_t *makeObstacle(node_t * n, expand_t* pmargin)
 	obs->pn = 4;
 	obs->ps = N_NEW(4, Ppoint_t);
 	/* CW order */
-	pt = ND_coord_i(n);
+	pt = ND_coord(n);
 	if (pmargin->doAdd) {
 	    obs->ps[0] = genPt(b.LL.x-pmargin->x, b.LL.y-pmargin->y, pt);
 	    obs->ps[1] = genPt(b.LL.x-pmargin->x, b.UR.y+pmargin->y, pt);
@@ -621,7 +617,7 @@ Ppoly_t *makeObstacle(node_t * n, expand_t* pmargin)
 	obs->pn = 4;
 	obs->ps = N_NEW(4, Ppoint_t);
 	/* CW order */
-	pt = ND_coord_i(n);
+	pt = ND_coord(n);
 	if (pmargin->doAdd) {
 	    obs->ps[0] = genPt(-ND_lw_i(n)-pmargin->x, -ND_ht_i(n)-pmargin->y,pt);
 	    obs->ps[1] = genPt(-ND_lw_i(n)-pmargin->x, ND_ht_i(n)+pmargin->y,pt);
@@ -658,12 +654,9 @@ getPath(edge_t * e, vconfig_t * vconfig, int chkPts, Ppoly_t ** obs,
     Ppolyline_t line;
     int pp, qp;
     Ppoint_t p, q;
-    pointf tp, hp;
 
-    P2PF(ND_coord_i(e->tail), tp);
-    p = add_pointfs(tp, ED_tail_port(e).p);
-    P2PF(ND_coord_i(e->head), hp);
-    q = add_pointfs(hp, ED_head_port(e).p);
+    p = add_pointfs(ND_coord(e->tail), ED_tail_port(e).p);
+    q = add_pointfs(ND_coord(e->head), ED_head_port(e).p);
 
     /* determine the polygons (if any) that contain the endpoints */
     pp = qp = POLYID_NONE;
@@ -822,12 +815,9 @@ static int _spline_edges(graph_t * g, expand_t* pmargin, int edgetype)
 /* fprintf (stderr, "%s -- %s %d\n", e->tail->name, e->head->name, ED_count(e)); */
 	    node_t *head = e->head;
 	    if (useEdges && ED_spl(e)) {
-		pointf np, hp;
-		P2PF(ND_coord_i(n), np);
-		P2PF(ND_coord_i(head), hp);
 		addEdgeLabels(e,
-			      add_pointfs(np, ED_tail_port(e).p),
-			      add_pointfs(hp, ED_head_port(e).p));
+			      add_pointfs(ND_coord(n), ED_tail_port(e).p),
+			      add_pointfs(ND_coord(head), ED_head_port(e).p));
 	    } 
 	    else if (ED_count(e) == 0) continue;  /* only do representative */
 	    else if (n == head) {    /* self arc */
@@ -1169,7 +1159,7 @@ static void _neato_set_aspect(graph_t * g)
 /* neato_set_aspect:
  * Sets aspect ratio if necessary; real work done in _neato_set_aspect;
  * This also copies the internal layout coordinates (ND_pos) to the 
- * external ones (ND_coord_i).
+ * external ones (ND_coord).
  */
 void neato_set_aspect(graph_t * g)
 {
@@ -1177,8 +1167,8 @@ void neato_set_aspect(graph_t * g)
 
     _neato_set_aspect(g);
     for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
-	ND_coord_i(n).x = POINTS(ND_pos(n)[0]);
-	ND_coord_i(n).y = POINTS(ND_pos(n)[1]);
+	ND_coord(n).x = POINTS(ND_pos(n)[0]);
+	ND_coord(n).y = POINTS(ND_pos(n)[1]);
     }
 }
 
diff --git a/lib/pack/pack.c b/lib/pack/pack.c
index 2a5f861f3..0a9e4b626 100644
--- a/lib/pack/pack.c
+++ b/lib/pack/pack.c
@@ -781,7 +781,7 @@ shiftGraphs(int ng, Agraph_t ** gs, point * pp, Agraph_t * root,
 	for (n = agfstnode(g); n; n = agnxtnode(g, n)) {
 	    ND_pos(n)[0] += fx;
 	    ND_pos(n)[1] += fy;
-	    MOVEPT(ND_coord_i(n));
+	    MOVEPT(ND_coord(n));
 	    if (doSplines) {
 		for (e = agfstout(eg, n); e; e = agnxtout(eg, e))
 		    shiftEdge(e, dx, dy);
diff --git a/lib/patchwork/patchwork.c b/lib/patchwork/patchwork.c
index 118c0521d..56c403125 100644
--- a/lib/patchwork/patchwork.c
+++ b/lib/patchwork/patchwork.c
@@ -163,7 +163,7 @@ static rect_t walker(treenode_t *tree)
 {
 	treenode_t	*p;
 	Agnode_t	*n;
-	point		center;
+	pointf		center;
     rect_t      r, rr;
 
 	switch(tree->kind) {
@@ -176,13 +176,13 @@ static rect_t walker(treenode_t *tree)
 			center.y = (tree->r.UR.y + tree->r.LL.y) / 2.0;
 
 			n = tree->u.n;
-			ND_coord_i(n) = center;
+			ND_coord(n) = center;
 			ND_height(n) = PS2INCH(tree->r.UR.y - tree->r.LL.y);
 			ND_width(n) = PS2INCH(tree->r.UR.x - tree->r.LL.x);
 			gv_nodesize(n,GD_flip(n->graph));
 			finishNode (n);
-			/*fprintf(stderr,"%s coord %d %d ht %d width %d\n",
-				n->name, ND_coord_i(n).x, ND_coord_i(n).y, ND_ht_i(n),
+			/*fprintf(stderr,"%s coord %.3g %.3g ht %d width %d\n",
+				n->name, ND_coord(n).x, ND_coord(n).y, ND_ht_i(n),
 				ND_rw_i(n)+ND_lw_i(n));*/
 			break;
 		default: abort();
diff --git a/plugin/gd/gvrender_gd_vrml.c b/plugin/gd/gvrender_gd_vrml.c
index 360d0f76b..67a1bc512 100644
--- a/plugin/gd/gvrender_gd_vrml.c
+++ b/plugin/gd/gvrender_gd_vrml.c
@@ -136,11 +136,11 @@ static pointf vrml_node_point(GVJ_t *job, node_t *n, pointf p)
 
     /* make rv relative to PNG canvas */
     if (job->rotation) {
-	rv.x = ( (p.y - job->pad.y) - ND_coord_i(n).y + ND_lw_i(n)     ) * Scale + NODE_PAD;
-	rv.y = (-(p.x - job->pad.x) + ND_coord_i(n).x + ND_ht_i(n) / 2.) * Scale + NODE_PAD;
+	rv.x = ( (p.y - job->pad.y) - ND_coord(n).y + ND_lw_i(n)     ) * Scale + NODE_PAD;
+	rv.y = (-(p.x - job->pad.x) + ND_coord(n).x + ND_ht_i(n) / 2.) * Scale + NODE_PAD;
     } else {
-	rv.x = ( (p.x - job->pad.x) - ND_coord_i(n).x + ND_lw_i(n)     ) * Scale + NODE_PAD;
-	rv.y = (-(p.y - job->pad.y) + ND_coord_i(n).y + ND_ht_i(n) / 2.) * Scale + NODE_PAD;
+	rv.x = ( (p.x - job->pad.x) - ND_coord(n).x + ND_lw_i(n)     ) * Scale + NODE_PAD;
+	rv.y = (-(p.y - job->pad.y) + ND_coord(n).y + ND_ht_i(n) / 2.) * Scale + NODE_PAD;
     }
     return rv;
 }
@@ -292,8 +292,8 @@ static void vrml_begin_edge(GVJ_t *job)
 static void
 finishSegment (FILE *out, edge_t *e)
 {
-    point p0 = ND_coord_i(e->tail);
-    point p1 = ND_coord_i(e->head);
+    pointf p0 = ND_coord(e->tail);
+    pointf p1 = ND_coord(e->head);
     double o_x, o_y, o_z;
     double x, y, y0, z, theta;
 
@@ -429,7 +429,7 @@ straight (pointf * A, int n)
 }
 
 static void
-doSegment (GVJ_t *job, pointf* A, point p0, double z0, point p1, double z1)
+doSegment (GVJ_t *job, pointf* A, pointf p0, double z0, pointf p1, double z1)
 {
     FILE *out = job->output_file;
     obj_state_t *obj = job->obj;
@@ -477,7 +477,7 @@ vrml_bezier(GVJ_t *job, pointf * A, int n, int arrow_at_start, int arrow_at_end,
     assert(e);
 
     if (straight(A,n)) {
-	doSegment (job, A, ND_coord_i(e->tail),Fstz,ND_coord_i(e->head),Sndz);
+	doSegment (job, A, ND_coord(e->tail),Fstz,ND_coord(e->head),Sndz);
 	return;
     }
 
@@ -522,7 +522,6 @@ static void doArrowhead (GVJ_t *job, pointf * A)
     edge_t *e = obj->u.e;
     double rad, ht, y;
     pointf p0;      /* center of triangle base */
-    point  tp,hp;
 
     p0.x = (A[0].x + A[2].x)/2.0;
     p0.y = (A[0].y + A[2].y)/2.0;
@@ -531,10 +530,8 @@ static void doArrowhead (GVJ_t *job, pointf * A)
 
     y = (CylHt + ht)/2.0;
 
-    tp = ND_coord_i(e->tail);
-    hp = ND_coord_i(e->head);
     fprintf(out, "Transform {\n");
-    if (DIST2(A[1], tp) < DIST2(A[1], hp)) {
+    if (DIST2(A[1], ND_coord(e->tail)) < DIST2(A[1], ND_coord(e->head))) {
 	TailHt = ht;
 	fprintf(out, "  translation 0 %.3f 0\n", -y);
 	fprintf(out, "  rotation 0 0 1 %.3f\n", M_PI);
@@ -611,16 +608,16 @@ static void vrml_polygon(GVJ_t *job, pointf * A, int np, int filled)
 	fprintf(out, "  geometry Extrusion {\n");
 	fprintf(out, "    crossSection [");
 	for (i = 0; i < np; i++) {
-	    p.x = A[i].x - ND_coord_i(n).x;
-	    p.y = A[i].y - ND_coord_i(n).y;
+	    p.x = A[i].x - ND_coord(n).x;
+	    p.y = A[i].y - ND_coord(n).y;
 	    fprintf(out, " %.3f %.3f,", p.x, p.y);
 	}
-	p.x = A[0].x - ND_coord_i(n).x;
-	p.y = A[0].y - ND_coord_i(n).y;
+	p.x = A[0].x - ND_coord(n).x;
+	p.y = A[0].y - ND_coord(n).y;
 	fprintf(out, " %.3f %.3f ]\n", p.x, p.y);
-	fprintf(out, "    spine [ %d %d %.3f, %d %d %.3f ]\n",
-		ND_coord_i(n).x, ND_coord_i(n).y, z - .01,
-		ND_coord_i(n).x, ND_coord_i(n).y, z + .01);
+	fprintf(out, "    spine [ %.3g %.3g %.3g, %.3g %.3g %.3g ]\n",
+		ND_coord(n).x, ND_coord(n).y, z - .01,
+		ND_coord(n).x, ND_coord(n).y, z + .01);
 	fprintf(out, "  }\n");
 	fprintf(out, "}\n");
 	break;
@@ -652,7 +649,7 @@ static void vrml_polygon(GVJ_t *job, pointf * A, int np, int filled)
 		  (A[0].x + A[2].x) / 2.0 - A[1].x) + M_PI / 2.0;
 
 	/* this is gruesome, but how else can we get z coord */
-	if (DIST2(p, ND_coord_i(e->tail)) < DIST2(p, ND_coord_i(e->head)))
+	if (DIST2(p, ND_coord(e->tail)) < DIST2(p, ND_coord(e->head)))
 	    z = obj->tail_z;
 	else
 	    z = obj->head_z;
@@ -783,7 +780,7 @@ static void vrml_ellipse(GVJ_t * job, pointf * A, int filled)
     case EDGE_OBJTYPE:
 	e = obj->u.e;
 	/* this is gruesome, but how else can we get z coord */
-	if (DIST2(A[0], ND_coord_i(e->tail)) < DIST2(A[0], ND_coord_i(e->head)))
+	if (DIST2(A[0], ND_coord(e->tail)) < DIST2(A[0], ND_coord(e->head)))
 	    z = obj->tail_z;
 	else
 	    z = obj->head_z;
-- 
2.40.0