Remove no longer needed catman periodic via 'make upgrade'.
[dragonfly.git] / contrib / groff / src / devices / grolbp / lbp.h
1 // -*- C -*-
2 /* Copyright (C) 1994, 2000, 2001, 2003, 2004, 2005, 2009
3    Free Software Foundation, Inc.
4      Written by Francisco Andrés Verdú <pandres@dragonet.es>
5
6 groff is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 groff is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
18
19 /*  This file contains a set of utility functions to use canon CAPSL printers
20  *  (lbp-4 and lbp-8 series printers) */
21
22 #ifndef LBP_H
23 #define LBP_H
24
25 #include <stdio.h>
26 #include <stdarg.h>
27
28 static FILE *lbpoutput = NULL;
29 static FILE *vdmoutput = NULL;
30
31
32 static inline void 
33 lbpinit(FILE *outfile)
34 {
35         lbpoutput = outfile;
36 }
37
38
39 static void 
40 lbpprintf(const char *format, ... )
41 { /* Taken from cjet */
42   va_list stuff;
43
44   va_start(stuff, format);
45   vfprintf(lbpoutput, format, stuff);
46   va_end(stuff);
47 }
48
49
50 static inline void
51 lbpputs(const char *data)
52 {
53         fputs(data,lbpoutput);
54 }
55
56
57 static inline void
58 lbpputc(unsigned char c)
59 {
60         fputc(c,lbpoutput);
61 }
62
63
64 static inline void 
65 lbpsavestatus(int idx )
66 {
67         fprintf(lbpoutput,"\033[%d%%y",idx);
68 }
69
70
71 static inline void 
72 lbprestorestatus(int idx )
73 {
74         fprintf(lbpoutput,"\033[%d%cz",idx ,'%');
75 }
76
77
78 static inline void 
79 lbpsavepos(int idx)
80 {
81         fprintf(lbpoutput,"\033[1;%d;0x",idx);
82 }
83
84
85 static inline void 
86 lbprestorepos(int idx)
87 {
88         fprintf(lbpoutput,"\033[0;%d;0x",idx);
89 }
90
91
92 static inline void 
93 lbprestoreposx(int idx)
94 {
95         fprintf(lbpoutput,"\033[0;%d;1x",idx);
96 }
97
98
99 static inline void 
100 lbpmoverel(int despl, char direction)
101 {
102         fprintf(lbpoutput,"\033[%d%c",despl,direction);
103 }
104
105
106 static inline void 
107 lbplinerel(int width,int despl,char direction )
108 {
109         fprintf(lbpoutput,"\033[%d;0;9{\033[%d%c\033[9}",width,despl,direction);
110 }
111
112
113 static inline void 
114 lbpmoveabs(int x, int y)
115 {
116         fprintf(lbpoutput,"\033[%d;%df",y,x);
117 }
118
119
120 static inline void
121 lbplineto(int x,int y, int width )
122 {
123         fprintf(lbpoutput,"\033[%d;0;9{",width);
124         lbpmoveabs(x,y);
125         fprintf(lbpoutput,"\033[9}\n");
126 }
127
128
129 static inline void
130 lbpruleabs(int x, int y, int hsize, int vsize)
131 {
132         lbpmoveabs(x,y);
133         fprintf(lbpoutput,"\033[0;9;000s");
134         lbpmoveabs(x+hsize,y+vsize);
135         fprintf(lbpoutput,"\033[9r");
136 }
137
138
139 static void vdmprintf(const char *format, ... );
140
141
142 static inline char *
143 vdmnum(int num,char *result)
144 {
145   char b1,b2,b3;
146   char *p = result;
147   int nm;
148
149   nm = abs(num);
150   /* First byte 1024 - 32768 */
151   b1 = ((nm >> 10) & 0x3F);
152   if (b1) *p++ = b1 | 0x40;
153
154   /* Second Byte 16 - 1024 */
155   b2 = ((nm >> 4) & 0x3F);
156   if ( b1 || b2) *p++= b2 | 0x40;
157
158   /* Third byte 0 - 15 */
159   b3 = ((nm & 0x0F) | 32);
160   if (num >= 0) b3 |= 16;
161   *p++ = b3;
162   *p = 0x00; /* End of the resulting string */
163   return result;
164 }
165
166
167 static inline void
168 vdmorigin(int newx, int newy)
169 {
170    char nx[4],ny[4];
171
172         vdmprintf("}\"%s%s\x1e",vdmnum(newx,nx),vdmnum(newy,ny));
173 }
174
175
176 static inline FILE *
177 vdminit(FILE *vdmfile)
178 {
179   char scale[4],size[4],lineend[4];
180   
181 /*  vdmoutput = tmpfile();*/
182   vdmoutput = vdmfile;
183   /* Initialize the VDM mode */
184   vdmprintf("\033[0&}#GROLBP\x1e!0%s%s\x1e$\x1e}F%s\x1e",\
185                   vdmnum(-3,scale),vdmnum(1,size),vdmnum(1,lineend));
186   return vdmoutput;
187   
188 }
189
190
191 static inline void
192 vdmend()
193 {
194         vdmprintf("}p\x1e");
195 }
196
197
198 static void 
199 vdmprintf(const char *format, ... )
200 { /* Taken from cjet */
201   va_list stuff;
202   
203   if (vdmoutput == NULL)  vdminit(tmpfile());
204   va_start(stuff, format);
205   vfprintf(vdmoutput, format, stuff);
206   va_end(stuff);
207 }
208
209
210 static inline void
211 vdmsetfillmode(int pattern,int perimeter, int inverted)
212 {
213    char patt[4],perim[4],
214         rot[4], /* rotation */
215         espejo[4], /* espejo */
216         inv[4]; /* Inverted */
217
218         vdmprintf("I%s%s%s%s%s\x1e",vdmnum(pattern,patt),\
219                 vdmnum(perimeter,perim),vdmnum(0,rot),
220                 vdmnum(0,espejo),vdmnum(inverted,inv));
221 }
222
223
224 static inline void
225 vdmcircle(int centerx, int centery, int radius)
226 {
227   char x[4],y[4],rad[4];
228   
229         vdmprintf("5%s%s%s\x1e",vdmnum(centerx,x),vdmnum(centery,y),\
230                         vdmnum(radius,rad));
231 }
232
233
234 static inline void
235 vdmaarc(int centerx, int centery, int radius,int startangle,int angle,int style,int arcopen)
236 {
237   char x[4],y[4],rad[4],stx[4],sty[4],styl[4],op[4];
238   
239         vdmprintf("}6%s%s%s%s%s%s%s\x1e",vdmnum(arcopen,op),\
240                 vdmnum(centerx,x),vdmnum(centery,y),\
241                 vdmnum(radius,rad),vdmnum(startangle,stx),vdmnum(angle,sty),\
242                 vdmnum(style,styl));
243 }
244
245
246 static inline void
247 vdmvarc(int centerx, int centery,int radius, int startx, int starty, int endx, int endy,\
248         int style,int arcopen)
249 {
250   char x[4],y[4],rad[4],stx[4],sty[4],enx[4],eny[4],styl[4],op[4];
251   
252         vdmprintf("}6%s%s%s%s%s%s%s%s%s\x1e",vdmnum(arcopen,op),\
253                 vdmnum(centerx,x),vdmnum(centery,y),\
254                 vdmnum(radius,rad),vdmnum(startx,stx),vdmnum(starty,sty),\
255                 vdmnum(endx,enx),vdmnum(endy,eny),vdmnum(style,styl));
256 }
257
258
259 static inline void
260 vdmellipse(int centerx, int centery, int radiusx, int radiusy,int rotation)
261 {
262   char x[4],y[4],radx[4],rady[4],rotat[4];
263   
264         vdmprintf("}7%s%s%s%s%s\x1e\n",vdmnum(centerx,x),vdmnum(centery,y),\
265                         vdmnum(radiusx,radx),vdmnum(radiusy,rady),\
266                         vdmnum(rotation,rotat));
267 }
268
269
270 static inline void
271 vdmsetlinetype(int lintype)
272 {
273   char ltyp[4], expfact[4];
274
275   vdmprintf("E1%s%s\x1e",vdmnum(lintype,ltyp),vdmnum(1,expfact));
276   
277 }
278
279
280 static inline void
281 vdmsetlinestyle(int lintype, int pattern,int unionstyle)
282 {
283    char patt[4],ltip[4],
284         rot[4], /* rotation */
285         espejo[4], /* espejo */
286         in[4]; /* Inverted */
287
288         vdmprintf("}G%s%s%s%s%s\x1e",vdmnum(lintype,ltip),\
289                 vdmnum(pattern,patt),vdmnum(0,rot),
290                 vdmnum(0,espejo),vdmnum(0,in));
291         vdmprintf("}F%s",vdmnum(unionstyle,rot));
292 }
293
294
295 static inline void
296 vdmlinewidth(int width)
297 {
298   char wh[4];
299
300         vdmprintf("F1%s\x1e",vdmnum(width,wh));
301 }
302
303
304 static inline void
305 vdmrectangle(int origx, int origy,int dstx, int dsty)
306 {
307   char xcoord[4],ycoord[4],sdstx[4],sdsty[4];
308
309   vdmprintf("}:%s%s%s%s\x1e\n",vdmnum(origx,xcoord),vdmnum(dstx,sdstx),\
310                   vdmnum(origy,ycoord),vdmnum(dsty,sdsty));
311 }
312
313
314 static inline void
315 vdmpolyline(int numpoints, int *points)
316 {
317   int i,*p = points;
318   char xcoord[4],ycoord[4];
319
320   if (numpoints < 2) return;
321   vdmprintf("1%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
322   p += 2;
323   for (i = 1; i < numpoints ; i++) {
324           vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
325           p += 2;
326   } /* for */
327   vdmprintf("\x1e\n");
328 }
329          
330
331 static inline void
332 vdmpolygon(int numpoints, int *points)
333 {
334   int i,*p = points;
335   char xcoord[4],ycoord[4];
336
337   if (numpoints < 2) return;
338   vdmprintf("2%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
339   p += 2;
340   for (i = 1; i < numpoints ; i++) {
341           vdmprintf("%s%s",vdmnum(*p,xcoord),vdmnum(*(p+1),ycoord));
342           p += 2;
343   } /* for */
344   vdmprintf("\x1e\n");
345
346 }
347
348
349 /************************************************************************
350  *              Highter level auxiliary functions                       *
351  ************************************************************************/              
352 static inline int
353 vdminited()
354 {
355         return (vdmoutput != NULL);
356 }
357
358
359 static inline void
360 vdmline(int startx, int starty, int sizex, int sizey)
361 {
362   int points[4];
363
364   points[0] = startx;
365   points[1] = starty;
366   points[2] = sizex;
367   points[3] = sizey;
368
369   vdmpolyline(2,points);
370
371 }
372
373
374 /*#define         THRESHOLD       .05    */ /* inch */
375 #define         THRESHOLD       1     /* points (1/300 inch) */
376 static inline void
377 splinerel(double px,double py,int flush)
378 {
379   static int lx = 0 ,ly = 0;
380   static double pend = 0.0;
381   static int dy = 0, despx = 0, despy = 0, sigpend = 0;
382   int dxnew = 0, dynew = 0, sg;
383   char xcoord[4],ycoord[4];
384   double npend ;
385
386   if (flush == -1) {lx = (int)px; ly = (int)py; return;}
387
388   if (flush == 0) {
389   dxnew = (int)px -lx;
390   dynew = (int)py -ly;
391   if ((dxnew == 0) && (dynew == 0)) return;
392   sg = (dxnew < 0)? -1 : 0;
393 /*  fprintf(stderr,"s (%d,%d) (%d,%d)\n",dxnew,dynew,despx,despy);*/
394   if (dynew == 0) { 
395           despx = dxnew; 
396           if ((sg == sigpend) && (dy == 0)){
397                   return;
398           }
399         dy = 0;
400   }
401   else {
402           dy = 1;
403         npend = (1.0*dxnew)/dynew;
404         if (( npend == pend) && (sigpend == sg))
405         { despy = dynew; despx = dxnew; return; }
406         else
407         { sigpend = sg;
408         pend = npend;
409         } /* else (( npend == pend) && ... */
410   } /* else (if (dynew == 0)) */
411   } /* if (!flush ) */
412
413   /* if we've changed direction we must draw the line */
414 /*  fprintf(stderr," (%d) %.2f,%.2f\n",flush,(float)px,(float)py);*/
415   if ((despx != 0) || (despy != 0)) vdmprintf("%s%s",vdmnum(despx,xcoord),\
416                 vdmnum(despy,ycoord));
417   /*if ((despx != 0) || (despy != 0)) fprintf(stderr,"2
418    *%d,%d\n",despx,despy);*/
419   if (flush) {
420         dxnew = dy = despx = despy = 0;
421         return;
422   } /* if (flush) */
423   dxnew -= despx;
424   dynew -= despy;
425   if ((dxnew != 0) || (dynew != 0)) vdmprintf("%s%s",vdmnum(dxnew,xcoord),\
426                 vdmnum(dynew,ycoord));
427   
428 /*  if ((dxnew != 0) || (dynew != 0)) fprintf(stderr,"3
429  *  %d,%d\n",dxnew,dynew);*/
430   lx = (int)px; ly = (int)py; 
431   dxnew = dy = despx = despy = 0;
432   
433 }
434
435
436 /**********************************************************************
437  *  The following code to draw splines is adapted from the transfig package
438  */
439 static void
440 quadratic_spline(double a_1, double b_1, double a_2, double b_2, \
441                  double a_3, double b_3, double a_4, double b_4)
442 {
443         double  x_1, y_1, x_4, y_4;
444         double  x_mid, y_mid;
445
446         x_1      = a_1; y_1 = b_1;
447         x_4      = a_4; y_4 = b_4;
448         x_mid    = (a_2 + a_3)/2.0;
449         y_mid    = (b_2 + b_3)/2.0;
450         if ((fabs(x_1 - x_mid) < THRESHOLD)
451             && (fabs(y_1 - y_mid) < THRESHOLD)) {
452                 splinerel(x_mid, y_mid, 0);
453 /*          fprintf(tfp, "PA%.4f,%.4f;\n", x_mid, y_mid);*/
454         }
455         else {
456             quadratic_spline(x_1, y_1, ((x_1+a_2)/2.0), ((y_1+b_2)/2.0),
457                 ((3.0*a_2+a_3)/4.0), ((3.0*b_2+b_3)/4.0), x_mid, y_mid);
458         }
459
460         if ((fabs(x_mid - x_4) < THRESHOLD)
461             && (fabs(y_mid - y_4) < THRESHOLD)) {
462                 splinerel(x_4, y_4, 0);
463 /*          fprintf(tfp, "PA%.4f,%.4f;\n", x_4, y_4);*/
464         }
465         else {
466             quadratic_spline(x_mid, y_mid,
467                              ((a_2+3.0*a_3)/4.0), ((b_2+3.0*b_3)/4.0),
468                              ((a_3+x_4)/2.0), ((b_3+y_4)/2.0), x_4, y_4);
469         }
470 }
471
472
473 #define XCOORD(i) numbers[(2*i)]
474 #define YCOORD(i) numbers[(2*i)+1]
475 static void
476 vdmspline(int numpoints, int o_x, int o_y, int *numbers)
477 {
478         double  cx_1, cy_1, cx_2, cy_2, cx_3, cy_3, cx_4, cy_4;
479         double  x_1, y_1, x_2, y_2;
480         char xcoord[4],ycoord[4];
481         int i;
482
483         /*p      = s->points;
484         x_1      = p->x/ppi;*/
485         x_1      = o_x;
486         y_1      = o_y;
487 /*      p        = p->next;
488         x_2      = p->x/ppi;
489         y_2      = p->y/ppi;*/
490         x_2      = o_x + XCOORD(0);
491         y_2      = o_y + YCOORD(0);
492         cx_1     = (x_1 + x_2)/2.0;
493         cy_1     = (y_1 + y_2)/2.0;
494         cx_2     = (x_1 + 3.0*x_2)/4.0;
495         cy_2     = (y_1 + 3.0*y_2)/4.0;
496
497 /*      fprintf(stderr,"Spline %d (%d,%d)\n",numpoints,(int)x_1,(int)y_1);*/
498         vdmprintf("1%s%s",vdmnum((int)x_1,xcoord),vdmnum((int)y_1,ycoord));
499         splinerel(x_1,y_1,-1);
500         splinerel(cx_1,cy_1,0);
501 /*          fprintf(tfp, "PA%.4f,%.4f;PD%.4f,%.4f;\n",
502                     x_1, y_1, cx_1, cy_1);*/
503
504         /*for (p = p->next; p != NULL; p = p->next) {*/
505         for (i = 1; i < (numpoints); i++) {
506             x_1  = x_2;
507             y_1  = y_2;
508 /*          x_2  = p->x/ppi;
509             y_2  = p->y/ppi;*/
510             x_2  = x_1 + XCOORD(i);
511             y_2  = y_1 + YCOORD(i);
512             cx_3 = (3.0*x_1 + x_2)/4.0;
513             cy_3 = (3.0*y_1 + y_2)/4.0;
514             cx_4 = (x_1 + x_2)/2.0;
515             cy_4 = (y_1 + y_2)/2.0;
516             /* fprintf(stderr,"Point (%d,%d) - (%d,%d)\n",(int)x_1,(int)(y_1),(int)x_2,(int)y_2);*/
517             quadratic_spline(cx_1, cy_1, cx_2, cy_2, cx_3, cy_3, cx_4, cy_4);
518             cx_1 = cx_4;
519             cy_1 = cy_4;
520             cx_2 = (x_1 + 3.0*x_2)/4.0;
521             cy_2 = (y_1 + 3.0*y_2)/4.0;
522         }
523         x_1     = x_2; 
524         y_1     = y_2;
525 /*      p       = s->points->next;
526         x_2     = p->x/ppi;
527         y_2     = p->y/ppi;*/
528         x_2     = o_x + XCOORD(0);
529         y_2     = o_y + YCOORD(0);
530         cx_3    = (3.0*x_1 + x_2)/4.0;
531         cy_3    = (3.0*y_1 + y_2)/4.0;
532         cx_4    = (x_1 + x_2)/2.0;
533         cy_4    = (y_1 + y_2)/2.0;
534         splinerel(x_1, y_1, 0);
535         splinerel(x_1, y_1, 1);
536         /*vdmprintf("%s%s",vdmnum((int)(x_1-lx),xcoord),\
537                         vdmnum((int)(y_1-ly),ycoord));*/
538         vdmprintf("\x1e\n");
539 /*          fprintf(tfp, "PA%.4f,%.4f;PU;\n", x_1, y_1);*/
540
541
542 }
543         
544
545 #endif