plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

tex.c (4474B)


      1 #include <math.h>
      2 #include <stdio.h>
      3 #include "tex.h"
      4 
      5 void
      6 devarc(double x1, double y1, double x2, double y2, double xc, double yc, int r)
      7 {
      8 	double t, start, stop;
      9 	int rad;
     10 
     11 	/* tpic arcs go clockwise, and angles are measured clockwise */
     12 	start = atan2(y2-yc, x2-xc);
     13 	stop = atan2(y1-yc, x1-xc);
     14 	if (r<0) {
     15 		t = start; start = stop; stop = t;
     16 	}
     17 	rad = SCX(sqrt((x1-xc)*(x1-xc)+(y1-yc)*(y1-yc)));
     18 	fprintf(TEXFILE, "    \\special{ar %d %d %d %d %6.3f %6.3f}%%\n",
     19 		TRX(xc), TRY(yc), rad, rad, -start, -stop);
     20 }
     21 
     22 void
     23 box(double x0, double y0, double x1, double y1)
     24 {
     25 	fprintf(TEXFILE,"    \\special{pa %d %d}",TRX(x0),TRY(y0));
     26 	fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y0));
     27 	fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x1),TRY(y1));
     28 	fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y1));
     29 	fprintf(TEXFILE,"\\special{pa %d %d}",TRX(x0),TRY(y0));
     30 	switch(e1->pen){
     31 	case DASHPEN:
     32 		fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break;
     33 	case DOTPEN:
     34 		fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break;
     35 	case SOLIDPEN:
     36 	default:
     37 		fprintf(TEXFILE,"\\special{fp}%%\n"); break;
     38 	}
     39 }
     40 
     41 void
     42 circle(double xc, double yc, double r)
     43 {
     44 	int rad = SCX(r);
     45 
     46 	fprintf(TEXFILE, "    \\special{ar %d %d %d %d 0.0 6.2832}%%\n",
     47 		TRX(xc), TRY(yc), rad, rad);
     48 }
     49 
     50 void
     51 closepl(void)
     52 {
     53 	fprintf(TEXFILE, "    \\kern %6.3fin\n  }\\vss}%%\n", INCHES(e1->sidex));
     54 	fprintf(TEXFILE, "  \\kern %6.3fin\n}\n", INCHES(e1->sidey));
     55 }
     56 
     57 void
     58 disc(double xc, double yc, double r)
     59 {
     60 	fprintf(TEXFILE, "    \\special{bk}%%\n");
     61 	circle(xc, yc, r);
     62 }
     63 
     64 void
     65 erase(void)
     66 {
     67 }
     68 
     69 void
     70 fill(int num[], double *ff[])
     71 {
     72 	double *xp, *yp, **fp, x0, y0;
     73 	int i, *n;
     74 	n = num;
     75 	fp = ff;
     76 	while((i = *n++)){
     77 		xp = *fp++;
     78 		yp = xp+1;
     79 		x0 = *xp;
     80 		y0 = *yp;
     81 		move(x0, y0);
     82 		while(--i){
     83 			xp += 2;
     84 			yp += 2;
     85 			vec(*xp, *yp);
     86 		}
     87 		if (*(xp-2) != x0 || *(yp-2) != y0)
     88 			vec(x0, y0);
     89 	}
     90 }
     91 
     92 void
     93 frame(double xs, double ys, double xf, double yf)
     94 {
     95 	double	osidex, osidey;
     96 	osidex = e1->sidex;
     97 	osidey = e1->sidey;
     98 	e1->left = xs * (e0->left + e0->sidex);
     99 	e1->bottom = ys* (e0->bottom +  e0->sidey);
    100 	e1->sidex = (xf-xs) * e0->sidex;
    101 	e1->sidey = (yf-ys) * e0->sidey;
    102 	e1->scalex *= (e1->sidex / osidex);
    103 	e1->scaley *= (e1->sidey / osidey);
    104 }
    105 
    106 void
    107 line(double x0, double y0, double x1, double y1)
    108 {
    109 	move(x0, y0);
    110 	vec(x1, y1);
    111 }
    112 
    113 void
    114 move(double xx, double yy)
    115 {
    116 	e1->copyx = xx;
    117 	e1->copyy = yy;
    118 }
    119 
    120 extern	double	xmin, ymin, xmax, ymax;
    121 
    122 /* tpic TeX coord system uses millinches, printer's points for pensize */
    123 /* positive y downward, origin at upper left */
    124 
    125 #define pHEIGHT 5000.
    126 #define pWIDTH  5000.
    127 #define pPENSIZE 9
    128 #define pPSIZE 10
    129 #define pDLEN .05
    130 struct penvir E[2] = {
    131 {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN},
    132 {0.,pHEIGHT,0.,0.,1.,-1.,pWIDTH,pHEIGHT,0.,0.,0,pPSIZE,SOLIDPEN,pPENSIZE,pDLEN}
    133 };
    134 struct penvir *e0 = E, *e1 = &E[1];
    135 FILE *TEXFILE;
    136 
    137 void
    138 openpl(void)
    139 {
    140 	TEXFILE = stdout;
    141 
    142 	space(xmin, ymin, xmax, ymax);
    143 	fprintf(TEXFILE,"\\catcode`@=11\n");
    144 	fprintf(TEXFILE, "\\expandafter\\ifx\\csname graph\\endcsname\\relax");
    145 	fprintf(TEXFILE, " \\alloc@4\\box\\chardef\\insc@unt\\graph\\fi\n");
    146 	fprintf(TEXFILE, "\\catcode`@=12\n");
    147 	fprintf(TEXFILE, "\\setbox\\graph=\\vtop{%%\n");
    148 	fprintf(TEXFILE, "  \\baselineskip=0pt \\lineskip=0pt ");
    149 	fprintf(TEXFILE, "\\lineskiplimit=0pt\n");
    150 	fprintf(TEXFILE, "  \\vbox to0pt{\\hbox{%%\n");
    151 	fprintf(TEXFILE, "    \\special{pn %d}%%\n", e1->pdiam);
    152 }
    153 
    154 void
    155 range(double x0, double y0, double x1, double y1)
    156 {
    157 	e1->xmin = x0;
    158 	e1->ymin = y0;
    159 	if (x1-x0 < .0000001*e1->sidex)
    160 		x1=x0+.0000001;
    161 	if (y1-y0 < .0000001*e1->sidey)
    162 		y1=y0+.0000001;
    163 	e1->scalex = e0->scalex*e1->sidex / (x1 - x0);
    164 	e1->scaley = e0->scaley*e1->sidey / (y1 - y0);
    165 }
    166 
    167 void
    168 rmove(double xx, double yy)
    169 {
    170 	e1->copyx += xx;
    171 	e1->copyy += yy;
    172 }
    173 
    174 void
    175 rvec(double xx, double yy)
    176 {
    177 	vec(xx+e1->copyx, yy+e1->copyy);
    178 }
    179 
    180 void
    181 sbox(double x0, double y0, double x1, double y1)
    182 {
    183 	fprintf(TEXFILE,"    \\special{bk}%%\n");
    184 	box(x0, y0, x1, y1);
    185 }
    186 
    187 void
    188 vec(double xx, double yy)
    189 {
    190 	fprintf(TEXFILE,"    \\special{pa %d %d}",TRX(e1->copyx),TRY(e1->copyy));
    191 	e1->copyx = xx;
    192 	e1->copyy = yy;
    193 	fprintf(TEXFILE,"\\special{pa %d %d}",TRX(xx),TRY(yy));
    194 	switch(e1->pen){
    195 	case DASHPEN:
    196 		fprintf(TEXFILE,"\\special{da %6.3f}%%\n", e1->dashlen); break;
    197 	case DOTPEN:
    198 		fprintf(TEXFILE,"\\special{dt %6.3f}%%\n", e1->dashlen); break;
    199 	case SOLIDPEN:
    200 	default:
    201 		fprintf(TEXFILE,"\\special{fp}%%\n"); break;
    202 	}
    203 }