+#ifndef lint
+static char *sccsid = "har.c (CWI) 1.1 85/03/01";
+#endif
+
+#include "idfilt.h"
+
+#define RESOLUTION 1445.0
+
+float xscale, yscale;
+
+void idjusttext (str)
+char *str;
+{
+ if (
+ strncmp (str, ".IE", 3) &&
+ strncmp (str, "...knot", 7) &&
+ strncmp (str, "...endspline", 12) &&
+ strncmp (str, "...left", 7) &&
+ strncmp (str, "...center", 9) &&
+ strncmp (str, "...right", 8)
+ )
+ fputs (str, stdout);
+}
+
+void idstart ()
+{
+}
+
+void idendbound ()
+{
+ if (boundset)
+ return;
+ idminx (-6.0);
+ idmaxy (6.0);
+ idmaxx (6.0);
+ idminy (-6.0);
+ if (maxx - minx < 0.2) {
+ maxx += 1;
+ minx -= 1;
+ }
+ if (maxy - miny < 0.2) {
+ maxy += 1;
+ miny -= 1;
+ }
+ xscale = width*RESOLUTION/(maxx - minx);
+ yscale = - xscale;
+ minx -= 0.5*(colwid - width)*RESOLUTION/xscale;
+ maxx += 0.5*(colwid - width)*RESOLUTION/xscale;
+ boundset = TRUE;
+ printf (".ne %4.2fi\n", yscale*(miny - maxy)/RESOLUTION);
+}
+
+void idline (x1, y1, x2, y2)
+float x1;
+float y1;
+float x2;
+float y2;
+{
+ long int X1, Y1, X2, Y2;
+ boolean shortvert, shorthoriz, nonrectilinear;
+ X1 = round(xscale*x1);
+ Y1 = round(yscale*y1);
+ X2 = round(xscale*x2);
+ Y2 = round(yscale*y2);
+ shortvert = X1 == X2 && abs(Y1-Y2) < RESOLUTION/2;
+ shorthoriz = Y1 == Y2 && abs(X1-X2) < RESOLUTION/2;
+ nonrectilinear = X1 != X2 && Y1 != Y2;
+ if (wantquality || shortvert || shorthoriz || nonrectilinear)
+ printf ("\\h'%du'\\v'%du'\\D'l %du %du'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(x1-minx)),
+ round(yscale*(y1-maxy)),
+ round(xscale*(x2-x1)),
+ round(yscale*(y2-y1)),
+ round(-xscale*(x2-minx)),
+ round(-yscale*(y2-maxy))
+ );
+ else {
+ if (Y1 == Y2)
+ printf ("\\h'%du'\\v'%du'\\l'%du'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(x1-minx)),
+ round(yscale*(y1-maxy)),
+ round(xscale*(x2-x1)),
+ round(-xscale*(x2-minx)),
+ round(-yscale*(y2-maxy))
+ );
+ if (X1 == X2)
+ printf ("\\h'%du'\\v'%du'\\L'%du'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(x1-minx)),
+ round(yscale*(y1-maxy)),
+ round(yscale*(y2-y1)),
+ round(-xscale*(x2-minx)),
+ round(-yscale*(y2-maxy))
+ );
+ }
+}
+
+void idcircle (x0, y0, r)
+float x0;
+float y0;
+float r;
+{
+ printf ("\\h'%du'\\v'%du'\\D'c %du'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(x0-r-minx)),
+ round(yscale*(y0-maxy)),
+ round(2*xscale*r),
+ round(-xscale*(x0+r-minx)),
+ round(-yscale*(y0-maxy))
+ );
+}
+
+void idarc (x0, y0, x1, y1, x2, y2, t1, t2, r)
+float x0;
+float y0;
+float x1;
+float y1;
+float x2;
+float y2;
+float t1;
+float t2;
+float r;
+{
+ if (xscale*r > 30000.0)
+ idline (x1, y1, x2, y2);
+ else {
+ printf ("\\h'%du'\\v'%du'\\D'a %du %du %du %du'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(x1-minx)),
+ round(yscale*(y1-maxy)),
+ round(xscale*(x0-x1)),
+ round(yscale*(y0-y1)),
+ round(xscale*(x2-x0)),
+ round(yscale*(y2-y0)),
+ round(-xscale*(x2-minx)),
+ round(-yscale*(y2-maxy))
+ );
+ }
+}
+
+void idleft (x, y, str)
+float x;
+float y;
+char *str;
+{
+ str == ++str;
+ printf ("\\h'%du'\\v'%du'%s\\h'-\\w'%s'u'\n.sp -1\n",
+ round(xscale*(x-minx)),
+ round(yscale*(y-maxy)),
+ str,
+ str
+ );
+}
+
+void idcenter (x, y, str)
+float x;
+float y;
+char *str;
+{
+ str = ++str;
+ printf ("\\h'%du'\\v'%du'\\h'-\\w'%s'u/2u'%s\\h'-\\w'%s'u/2u'\n.sp -1\n",
+ round(xscale*(x-minx)),
+ round(yscale*(y-maxy)),
+ str,
+ str,
+ str
+ );
+}
+
+void idright (x, y, str)
+float x;
+float y;
+char *str;
+{
+ str = ++str;
+ printf ("\\h'%du'\\v'%du'\\h'-\\w'%s'u'%s\\h'-\\w'%s'u'\n.sp -1\n",
+ round(xscale*(x-minx)),
+ round(yscale*(y-maxy)),
+ str,
+ str,
+ str
+ );
+}
+
+void idendE ()
+{
+ if (boundset)
+ printf (".sp %du\n.sp 1\n.sp 1\n",
+ round(yscale*(miny-maxy))
+ );
+ printf (".IE\n");
+}
+
+void idendF ()
+{
+}
+
+float osplx, osply;
+
+void idspline (sx, sy)
+float sx, sy;
+{
+ osplx = sx;
+ osply = sy;
+ printf ("\\h'%du'\\v'%du'\\D'~",
+ round(xscale*(osplx-minx)),
+ round(yscale*(osply-maxy))
+ );
+}
+
+void idknot (sx, sy)
+float sx, sy;
+{
+ printf (" %du %du",
+ round(xscale*(sx-osplx)),
+ round(yscale*(sy-osply))
+ );
+ osplx = sx;
+ osply = sy;
+}
+
+void idendspline ()
+{
+ printf ("'\\h'%du'\\v'%du'\n.sp -1\n",
+ round(xscale*(minx-osplx)),
+ round(yscale*(maxy-osply))
+ );
+}
+
+void idnoerase ()
+{
+}
+
+
+void idyeserase ()
+{
+}