Blame


1 3ebbd193 2017-06-19 rsc #include <stdio.h>
2 3ebbd193 2017-06-19 rsc #include <math.h>
3 3ebbd193 2017-06-19 rsc #include "pic.h"
4 3ebbd193 2017-06-19 rsc #include "y.tab.h"
5 3ebbd193 2017-06-19 rsc
6 3ebbd193 2017-06-19 rsc void dotext(obj *);
7 3ebbd193 2017-06-19 rsc void ellipse(double, double, double, double);
8 3ebbd193 2017-06-19 rsc void circle(double, double, double);
9 3ebbd193 2017-06-19 rsc void arc(double, double, double, double, double, double, double);
10 3ebbd193 2017-06-19 rsc void arrow(double, double, double, double, double, double, double, int);
11 3ebbd193 2017-06-19 rsc void line(double, double, double, double, int, double);
12 3ebbd193 2017-06-19 rsc void box(double, double, double, double, int, double);
13 3ebbd193 2017-06-19 rsc void spline(double x, double y, double n, ofloat *p, int dashed, double ddval);
14 3ebbd193 2017-06-19 rsc void move(double, double);
15 3ebbd193 2017-06-19 rsc void troff(char *);
16 3ebbd193 2017-06-19 rsc void dot(void);
17 3ebbd193 2017-06-19 rsc void fillstart(double, int, int), fillend(void);
18 3ebbd193 2017-06-19 rsc
19 3ebbd193 2017-06-19 rsc void print(void)
20 3ebbd193 2017-06-19 rsc {
21 3ebbd193 2017-06-19 rsc obj *p;
22 3ebbd193 2017-06-19 rsc int i, j, k, m;
23 3ebbd193 2017-06-19 rsc int fill, vis, invis;
24 3ebbd193 2017-06-19 rsc double x0, y0, x1, y1, ox, oy, dx, dy, ndx, ndy;
25 3ebbd193 2017-06-19 rsc
26 3ebbd193 2017-06-19 rsc x1 = y1 = 0.0; /* Botch? (gcc) */
27 3ebbd193 2017-06-19 rsc
28 3ebbd193 2017-06-19 rsc for (i = 0; i < nobj; i++) {
29 3ebbd193 2017-06-19 rsc p = objlist[i];
30 3ebbd193 2017-06-19 rsc ox = p->o_x;
31 3ebbd193 2017-06-19 rsc oy = p->o_y;
32 3ebbd193 2017-06-19 rsc if (p->o_count >= 1)
33 3ebbd193 2017-06-19 rsc x1 = p->o_val[0];
34 3ebbd193 2017-06-19 rsc if (p->o_count >= 2)
35 3ebbd193 2017-06-19 rsc y1 = p->o_val[1];
36 3ebbd193 2017-06-19 rsc m = p->o_mode;
37 3ebbd193 2017-06-19 rsc fill = p->o_attr & FILLBIT;
38 3ebbd193 2017-06-19 rsc invis = p->o_attr & INVIS;
39 3ebbd193 2017-06-19 rsc vis = !invis;
40 3ebbd193 2017-06-19 rsc switch (p->o_type) {
41 3ebbd193 2017-06-19 rsc case TROFF:
42 3ebbd193 2017-06-19 rsc troff(text[p->o_nt1].t_val);
43 3ebbd193 2017-06-19 rsc break;
44 3ebbd193 2017-06-19 rsc case BOX:
45 3ebbd193 2017-06-19 rsc case BLOCK:
46 3ebbd193 2017-06-19 rsc x0 = ox - x1 / 2;
47 3ebbd193 2017-06-19 rsc y0 = oy - y1 / 2;
48 3ebbd193 2017-06-19 rsc x1 = ox + x1 / 2;
49 3ebbd193 2017-06-19 rsc y1 = oy + y1 / 2;
50 3ebbd193 2017-06-19 rsc if (fill) {
51 3ebbd193 2017-06-19 rsc move(x0, y0);
52 3ebbd193 2017-06-19 rsc fillstart(p->o_fillval, vis, fill);
53 3ebbd193 2017-06-19 rsc }
54 3ebbd193 2017-06-19 rsc if (p->o_type == BLOCK)
55 3ebbd193 2017-06-19 rsc ; /* nothing at all */
56 3ebbd193 2017-06-19 rsc else if (invis && !fill)
57 3ebbd193 2017-06-19 rsc ; /* nothing at all */
58 3ebbd193 2017-06-19 rsc else
59 3ebbd193 2017-06-19 rsc box(x0, y0, x1, y1, p->o_attr & (DOTBIT|DASHBIT), p->o_ddval);
60 3ebbd193 2017-06-19 rsc if (fill)
61 3ebbd193 2017-06-19 rsc fillend();
62 3ebbd193 2017-06-19 rsc move(ox, oy);
63 3ebbd193 2017-06-19 rsc dotext(p); /* if there are any text strings */
64 3ebbd193 2017-06-19 rsc if (ishor(m))
65 3ebbd193 2017-06-19 rsc move(isright(m) ? x1 : x0, oy); /* right side */
66 3ebbd193 2017-06-19 rsc else
67 3ebbd193 2017-06-19 rsc move(ox, isdown(m) ? y0 : y1); /* bottom */
68 3ebbd193 2017-06-19 rsc break;
69 3ebbd193 2017-06-19 rsc case BLOCKEND:
70 3ebbd193 2017-06-19 rsc break;
71 3ebbd193 2017-06-19 rsc case CIRCLE:
72 3ebbd193 2017-06-19 rsc if (fill)
73 3ebbd193 2017-06-19 rsc fillstart(p->o_fillval, vis, fill);
74 3ebbd193 2017-06-19 rsc if (vis || fill)
75 3ebbd193 2017-06-19 rsc circle(ox, oy, x1);
76 3ebbd193 2017-06-19 rsc if (fill)
77 3ebbd193 2017-06-19 rsc fillend();
78 3ebbd193 2017-06-19 rsc move(ox, oy);
79 3ebbd193 2017-06-19 rsc dotext(p);
80 3ebbd193 2017-06-19 rsc if (ishor(m))
81 3ebbd193 2017-06-19 rsc move(ox + isright(m) ? x1 : -x1, oy);
82 3ebbd193 2017-06-19 rsc else
83 3ebbd193 2017-06-19 rsc move(ox, oy + isup(m) ? x1 : -x1);
84 3ebbd193 2017-06-19 rsc break;
85 3ebbd193 2017-06-19 rsc case ELLIPSE:
86 3ebbd193 2017-06-19 rsc if (fill)
87 3ebbd193 2017-06-19 rsc fillstart(p->o_fillval, vis, fill);
88 3ebbd193 2017-06-19 rsc if (vis || fill)
89 3ebbd193 2017-06-19 rsc ellipse(ox, oy, x1, y1);
90 3ebbd193 2017-06-19 rsc if (fill)
91 3ebbd193 2017-06-19 rsc fillend();
92 3ebbd193 2017-06-19 rsc move(ox, oy);
93 3ebbd193 2017-06-19 rsc dotext(p);
94 3ebbd193 2017-06-19 rsc if (ishor(m))
95 3ebbd193 2017-06-19 rsc move(ox + isright(m) ? x1 : -x1, oy);
96 3ebbd193 2017-06-19 rsc else
97 3ebbd193 2017-06-19 rsc move(ox, oy - isdown(m) ? y1 : -y1);
98 3ebbd193 2017-06-19 rsc break;
99 3ebbd193 2017-06-19 rsc case ARC:
100 3ebbd193 2017-06-19 rsc if (fill) {
101 3ebbd193 2017-06-19 rsc move(ox, oy);
102 3ebbd193 2017-06-19 rsc fillstart(p->o_fillval, vis, fill);
103 3ebbd193 2017-06-19 rsc }
104 3ebbd193 2017-06-19 rsc if (p->o_attr & HEAD1)
105 3ebbd193 2017-06-19 rsc arrow(x1 - (y1 - oy), y1 + (x1 - ox),
106 3ebbd193 2017-06-19 rsc x1, y1, p->o_val[4], p->o_val[5], p->o_val[5]/p->o_val[6]/2, p->o_nhead);
107 3ebbd193 2017-06-19 rsc if (invis && !fill)
108 3ebbd193 2017-06-19 rsc /* probably wrong when it's cw */
109 3ebbd193 2017-06-19 rsc move(x1, y1);
110 3ebbd193 2017-06-19 rsc else
111 3ebbd193 2017-06-19 rsc arc(ox, oy, x1, y1, p->o_val[2], p->o_val[3], p->o_val[6]);
112 3ebbd193 2017-06-19 rsc if (p->o_attr & HEAD2)
113 3ebbd193 2017-06-19 rsc arrow(p->o_val[2] + p->o_val[3] - oy, p->o_val[3] - (p->o_val[2] - ox),
114 3ebbd193 2017-06-19 rsc p->o_val[2], p->o_val[3], p->o_val[4], p->o_val[5], -p->o_val[5]/p->o_val[6]/2, p->o_nhead);
115 3ebbd193 2017-06-19 rsc if (fill)
116 3ebbd193 2017-06-19 rsc fillend();
117 3ebbd193 2017-06-19 rsc if (p->o_attr & CW_ARC)
118 3ebbd193 2017-06-19 rsc move(x1, y1); /* because drawn backwards */
119 3ebbd193 2017-06-19 rsc move(ox, oy);
120 3ebbd193 2017-06-19 rsc dotext(p);
121 3ebbd193 2017-06-19 rsc break;
122 3ebbd193 2017-06-19 rsc case LINE:
123 3ebbd193 2017-06-19 rsc case ARROW:
124 3ebbd193 2017-06-19 rsc case SPLINE:
125 3ebbd193 2017-06-19 rsc if (fill) {
126 3ebbd193 2017-06-19 rsc move(ox, oy);
127 3ebbd193 2017-06-19 rsc fillstart(p->o_fillval, vis, fill);
128 3ebbd193 2017-06-19 rsc }
129 3ebbd193 2017-06-19 rsc if (vis && p->o_attr & HEAD1)
130 3ebbd193 2017-06-19 rsc arrow(ox + p->o_val[5], oy + p->o_val[6], ox, oy, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
131 3ebbd193 2017-06-19 rsc if (invis && !fill)
132 3ebbd193 2017-06-19 rsc move(x1, y1);
133 3ebbd193 2017-06-19 rsc else if (p->o_type == SPLINE)
134 3ebbd193 2017-06-19 rsc spline(ox, oy, p->o_val[4], &p->o_val[5], p->o_attr & (DOTBIT|DASHBIT), p->o_ddval);
135 3ebbd193 2017-06-19 rsc else {
136 3ebbd193 2017-06-19 rsc dx = ox;
137 3ebbd193 2017-06-19 rsc dy = oy;
138 3ebbd193 2017-06-19 rsc for (k=0, j=5; k < p->o_val[4]; k++, j += 2) {
139 3ebbd193 2017-06-19 rsc ndx = dx + p->o_val[j];
140 3ebbd193 2017-06-19 rsc ndy = dy + p->o_val[j+1];
141 3ebbd193 2017-06-19 rsc line(dx, dy, ndx, ndy, p->o_attr & (DOTBIT|DASHBIT), p->o_ddval);
142 3ebbd193 2017-06-19 rsc dx = ndx;
143 3ebbd193 2017-06-19 rsc dy = ndy;
144 3ebbd193 2017-06-19 rsc }
145 3ebbd193 2017-06-19 rsc }
146 3ebbd193 2017-06-19 rsc if (vis && p->o_attr & HEAD2) {
147 3ebbd193 2017-06-19 rsc dx = ox;
148 3ebbd193 2017-06-19 rsc dy = oy;
149 3ebbd193 2017-06-19 rsc for (k = 0, j = 5; k < p->o_val[4] - 1; k++, j += 2) {
150 3ebbd193 2017-06-19 rsc dx += p->o_val[j];
151 3ebbd193 2017-06-19 rsc dy += p->o_val[j+1];
152 3ebbd193 2017-06-19 rsc }
153 3ebbd193 2017-06-19 rsc arrow(dx, dy, x1, y1, p->o_val[2], p->o_val[3], 0.0, p->o_nhead);
154 3ebbd193 2017-06-19 rsc }
155 3ebbd193 2017-06-19 rsc if (fill)
156 3ebbd193 2017-06-19 rsc fillend();
157 3ebbd193 2017-06-19 rsc move((ox + x1)/2, (oy + y1)/2); /* center */
158 3ebbd193 2017-06-19 rsc dotext(p);
159 3ebbd193 2017-06-19 rsc break;
160 3ebbd193 2017-06-19 rsc case MOVE:
161 3ebbd193 2017-06-19 rsc move(ox, oy);
162 3ebbd193 2017-06-19 rsc break;
163 3ebbd193 2017-06-19 rsc case TEXT:
164 3ebbd193 2017-06-19 rsc move(ox, oy);
165 3ebbd193 2017-06-19 rsc if (vis)
166 3ebbd193 2017-06-19 rsc dotext(p);
167 3ebbd193 2017-06-19 rsc break;
168 3ebbd193 2017-06-19 rsc }
169 3ebbd193 2017-06-19 rsc }
170 3ebbd193 2017-06-19 rsc }
171 3ebbd193 2017-06-19 rsc
172 3ebbd193 2017-06-19 rsc void dotext(obj *p) /* print text strings of p in proper vertical spacing */
173 3ebbd193 2017-06-19 rsc {
174 3ebbd193 2017-06-19 rsc int i, nhalf;
175 3ebbd193 2017-06-19 rsc void label(char *, int, int);
176 3ebbd193 2017-06-19 rsc
177 3ebbd193 2017-06-19 rsc nhalf = p->o_nt2 - p->o_nt1 - 1;
178 3ebbd193 2017-06-19 rsc for (i = p->o_nt1; i < p->o_nt2; i++) {
179 3ebbd193 2017-06-19 rsc label(text[i].t_val, text[i].t_type, nhalf);
180 3ebbd193 2017-06-19 rsc nhalf -= 2;
181 3ebbd193 2017-06-19 rsc }
182 3ebbd193 2017-06-19 rsc }