1 #ifndef lint 2 static char *sccsid = "har.c (CWI) 1.1 85/03/01"; 3 #endif 4 5 #include "idfilt.h" 6 7 #define RESOLUTION 1445.0 8 9 float xscale, yscale; 10 11 void idjusttext (str) 12 char *str; 13 { 14 if ( 15 strncmp (str, ".IE", 3) && 16 strncmp (str, "...knot", 7) && 17 strncmp (str, "...endspline", 12) && 18 strncmp (str, "...left", 7) && 19 strncmp (str, "...center", 9) && 20 strncmp (str, "...right", 8) 21 ) 22 fputs (str, stdout); 23 } 24 25 void idstart () 26 { 27 } 28 29 void idendbound () 30 { 31 if (boundset) 32 return; 33 idminx (-6.0); 34 idmaxy (6.0); 35 idmaxx (6.0); 36 idminy (-6.0); 37 if (maxx - minx < 0.2) { 38 maxx += 1; 39 minx -= 1; 40 } 41 if (maxy - miny < 0.2) { 42 maxy += 1; 43 miny -= 1; 44 } 45 xscale = width*RESOLUTION/(maxx - minx); 46 yscale = - xscale; 47 minx -= 0.5*(colwid - width)*RESOLUTION/xscale; 48 maxx += 0.5*(colwid - width)*RESOLUTION/xscale; 49 boundset = TRUE; 50 printf (".ne %4.2fi\n", yscale*(miny - maxy)/RESOLUTION); 51 } 52 53 void idline (x1, y1, x2, y2) 54 float x1; 55 float y1; 56 float x2; 57 float y2; 58 { 59 long int X1, Y1, X2, Y2; 60 boolean shortvert, shorthoriz, nonrectilinear; 61 X1 = round(xscale*x1); 62 Y1 = round(yscale*y1); 63 X2 = round(xscale*x2); 64 Y2 = round(yscale*y2); 65 shortvert = X1 == X2 && abs(Y1-Y2) < RESOLUTION/2; 66 shorthoriz = Y1 == Y2 && abs(X1-X2) < RESOLUTION/2; 67 nonrectilinear = X1 != X2 && Y1 != Y2; 68 if (wantquality || shortvert || shorthoriz || nonrectilinear) 69 printf ("\\h'%du'\\v'%du'\\D'l %du %du'\\h'%du'\\v'%du'\n.sp -1\n", 70 round(xscale*(x1-minx)), 71 round(yscale*(y1-maxy)), 72 round(xscale*(x2-x1)), 73 round(yscale*(y2-y1)), 74 round(-xscale*(x2-minx)), 75 round(-yscale*(y2-maxy)) 76 ); 77 else { 78 if (Y1 == Y2) 79 printf ("\\h'%du'\\v'%du'\\l'%du'\\h'%du'\\v'%du'\n.sp -1\n", 80 round(xscale*(x1-minx)), 81 round(yscale*(y1-maxy)), 82 round(xscale*(x2-x1)), 83 round(-xscale*(x2-minx)), 84 round(-yscale*(y2-maxy)) 85 ); 86 if (X1 == X2) 87 printf ("\\h'%du'\\v'%du'\\L'%du'\\h'%du'\\v'%du'\n.sp -1\n", 88 round(xscale*(x1-minx)), 89 round(yscale*(y1-maxy)), 90 round(yscale*(y2-y1)), 91 round(-xscale*(x2-minx)), 92 round(-yscale*(y2-maxy)) 93 ); 94 } 95 } 96 97 void idcircle (x0, y0, r) 98 float x0; 99 float y0; 100 float r; 101 { 102 printf ("\\h'%du'\\v'%du'\\D'c %du'\\h'%du'\\v'%du'\n.sp -1\n", 103 round(xscale*(x0-r-minx)), 104 round(yscale*(y0-maxy)), 105 round(2*xscale*r), 106 round(-xscale*(x0+r-minx)), 107 round(-yscale*(y0-maxy)) 108 ); 109 } 110 111 void idarc (x0, y0, x1, y1, x2, y2, t1, t2, r) 112 float x0; 113 float y0; 114 float x1; 115 float y1; 116 float x2; 117 float y2; 118 float t1; 119 float t2; 120 float r; 121 { 122 if (xscale*r > 30000.0) 123 idline (x1, y1, x2, y2); 124 else { 125 printf ("\\h'%du'\\v'%du'\\D'a %du %du %du %du'\\h'%du'\\v'%du'\n.sp -1\n", 126 round(xscale*(x1-minx)), 127 round(yscale*(y1-maxy)), 128 round(xscale*(x0-x1)), 129 round(yscale*(y0-y1)), 130 round(xscale*(x2-x0)), 131 round(yscale*(y2-y0)), 132 round(-xscale*(x2-minx)), 133 round(-yscale*(y2-maxy)) 134 ); 135 } 136 } 137 138 void idleft (x, y, str) 139 float x; 140 float y; 141 char *str; 142 { 143 str == ++str; 144 printf ("\\h'%du'\\v'%du'%s\\h'-\\w'%s'u'\n.sp -1\n", 145 round(xscale*(x-minx)), 146 round(yscale*(y-maxy)), 147 str, 148 str 149 ); 150 } 151 152 void idcenter (x, y, str) 153 float x; 154 float y; 155 char *str; 156 { 157 str = ++str; 158 printf ("\\h'%du'\\v'%du'\\h'-\\w'%s'u/2u'%s\\h'-\\w'%s'u/2u'\n.sp -1\n", 159 round(xscale*(x-minx)), 160 round(yscale*(y-maxy)), 161 str, 162 str, 163 str 164 ); 165 } 166 167 void idright (x, y, str) 168 float x; 169 float y; 170 char *str; 171 { 172 str = ++str; 173 printf ("\\h'%du'\\v'%du'\\h'-\\w'%s'u'%s\\h'-\\w'%s'u'\n.sp -1\n", 174 round(xscale*(x-minx)), 175 round(yscale*(y-maxy)), 176 str, 177 str, 178 str 179 ); 180 } 181 182 void idendE () 183 { 184 if (boundset) 185 printf (".sp %du\n.sp 1\n.sp 1\n", 186 round(yscale*(miny-maxy)) 187 ); 188 printf (".IE\n"); 189 } 190 191 void idendF () 192 { 193 } 194 195 float osplx, osply; 196 197 void idspline (sx, sy) 198 float sx, sy; 199 { 200 osplx = sx; 201 osply = sy; 202 printf ("\\h'%du'\\v'%du'\\D'~", 203 round(xscale*(osplx-minx)), 204 round(yscale*(osply-maxy)) 205 ); 206 } 207 208 void idknot (sx, sy) 209 float sx, sy; 210 { 211 printf (" %du %du", 212 round(xscale*(sx-osplx)), 213 round(yscale*(sy-osply)) 214 ); 215 osplx = sx; 216 osply = sy; 217 } 218 219 void idendspline () 220 { 221 printf ("'\\h'%du'\\v'%du'\n.sp -1\n", 222 round(xscale*(minx-osplx)), 223 round(yscale*(maxy-osply)) 224 ); 225 } 226 227 void idnoerase () 228 { 229 } 230 231 232 void idyeserase () 233 { 234 } 235