Blame


1 61f5c35c 2004-05-15 devnull /*
2 61f5c35c 2004-05-15 devnull *
3 61f5c35c 2004-05-15 devnull * Boundingbox code for PostScript translators. The boundingbox for each page
4 61f5c35c 2004-05-15 devnull * is accumulated in bbox - the one for the whole document goes in docbbox. A
5 61f5c35c 2004-05-15 devnull * call to writebbox() puts out an appropriate comment, updates docbbox, and
6 61f5c35c 2004-05-15 devnull * resets bbox for the next page. The assumption made at the end of writebbox()
7 61f5c35c 2004-05-15 devnull * is that we're really printing the current page only if output is now going
8 61f5c35c 2004-05-15 devnull * to stdout - a valid assumption for all supplied translators. Needs the math
9 61f5c35c 2004-05-15 devnull * library.
10 61f5c35c 2004-05-15 devnull *
11 61f5c35c 2004-05-15 devnull */
12 61f5c35c 2004-05-15 devnull
13 61f5c35c 2004-05-15 devnull #include <stdio.h>
14 359c1e01 2005-01-14 devnull #include <string.h>
15 61f5c35c 2004-05-15 devnull #include <ctype.h>
16 61f5c35c 2004-05-15 devnull #include <sys/types.h>
17 61f5c35c 2004-05-15 devnull #include <fcntl.h>
18 61f5c35c 2004-05-15 devnull #include <math.h>
19 61f5c35c 2004-05-15 devnull
20 61f5c35c 2004-05-15 devnull #include "comments.h" /* PostScript file structuring comments */
21 61f5c35c 2004-05-15 devnull #include "gen.h" /* a few general purpose definitions */
22 61f5c35c 2004-05-15 devnull #include "ext.h" /* external variable declarations */
23 61f5c35c 2004-05-15 devnull
24 61f5c35c 2004-05-15 devnull typedef struct bbox {
25 61f5c35c 2004-05-15 devnull int set;
26 61f5c35c 2004-05-15 devnull double llx, lly;
27 61f5c35c 2004-05-15 devnull double urx, ury;
28 61f5c35c 2004-05-15 devnull } Bbox;
29 61f5c35c 2004-05-15 devnull
30 61f5c35c 2004-05-15 devnull Bbox bbox = {FALSE, 0.0, 0.0, 0.0, 0.0};
31 61f5c35c 2004-05-15 devnull Bbox docbbox = {FALSE, 0.0, 0.0, 0.0, 0.0};
32 61f5c35c 2004-05-15 devnull
33 61f5c35c 2004-05-15 devnull double ctm[6] = {1.0, 0.0, 0.0, 1.0, 0.0, 0.0};
34 61f5c35c 2004-05-15 devnull double matrix1[6], matrix2[6];
35 61f5c35c 2004-05-15 devnull
36 61f5c35c 2004-05-15 devnull /*****************************************************************************/
37 61f5c35c 2004-05-15 devnull
38 b855148c 2004-05-16 devnull void
39 61f5c35c 2004-05-15 devnull cover(x, y)
40 61f5c35c 2004-05-15 devnull
41 61f5c35c 2004-05-15 devnull double x, y;
42 61f5c35c 2004-05-15 devnull
43 61f5c35c 2004-05-15 devnull {
44 61f5c35c 2004-05-15 devnull
45 61f5c35c 2004-05-15 devnull /*
46 61f5c35c 2004-05-15 devnull *
47 61f5c35c 2004-05-15 devnull * Adds point (x, y) to bbox. Coordinates are in user space - the transformation
48 61f5c35c 2004-05-15 devnull * to default coordinates happens in writebbox().
49 61f5c35c 2004-05-15 devnull *
50 61f5c35c 2004-05-15 devnull */
51 61f5c35c 2004-05-15 devnull
52 61f5c35c 2004-05-15 devnull if ( bbox.set == FALSE ) {
53 61f5c35c 2004-05-15 devnull bbox.llx = bbox.urx = x;
54 61f5c35c 2004-05-15 devnull bbox.lly = bbox.ury = y;
55 61f5c35c 2004-05-15 devnull bbox.set = TRUE;
56 61f5c35c 2004-05-15 devnull } else {
57 61f5c35c 2004-05-15 devnull if ( x < bbox.llx )
58 61f5c35c 2004-05-15 devnull bbox.llx = x;
59 61f5c35c 2004-05-15 devnull if ( y < bbox.lly )
60 61f5c35c 2004-05-15 devnull bbox.lly = y;
61 61f5c35c 2004-05-15 devnull if ( x > bbox.urx )
62 61f5c35c 2004-05-15 devnull bbox.urx = x;
63 61f5c35c 2004-05-15 devnull if ( y > bbox.ury )
64 61f5c35c 2004-05-15 devnull bbox.ury = y;
65 61f5c35c 2004-05-15 devnull } /* End else */
66 61f5c35c 2004-05-15 devnull
67 61f5c35c 2004-05-15 devnull } /* End of cover */
68 61f5c35c 2004-05-15 devnull
69 61f5c35c 2004-05-15 devnull /*****************************************************************************/
70 2b604081 2005-05-07 devnull void resetbbox(int);
71 61f5c35c 2004-05-15 devnull
72 b855148c 2004-05-16 devnull void
73 61f5c35c 2004-05-15 devnull writebbox(fp, keyword, slop)
74 61f5c35c 2004-05-15 devnull
75 61f5c35c 2004-05-15 devnull FILE *fp; /* the comment is written here */
76 61f5c35c 2004-05-15 devnull char *keyword; /* the boundingbox comment string */
77 61f5c35c 2004-05-15 devnull int slop; /* expand (or contract?) the box a bit */
78 61f5c35c 2004-05-15 devnull
79 61f5c35c 2004-05-15 devnull {
80 61f5c35c 2004-05-15 devnull
81 61f5c35c 2004-05-15 devnull Bbox ubbox; /* user space bounding box */
82 61f5c35c 2004-05-15 devnull double x, y;
83 61f5c35c 2004-05-15 devnull
84 61f5c35c 2004-05-15 devnull /*
85 61f5c35c 2004-05-15 devnull *
86 61f5c35c 2004-05-15 devnull * Transforms the numbers in the bbox[] using ctm[], adjusts the corners a bit
87 61f5c35c 2004-05-15 devnull * (depending on slop) and then writes comment. If *keyword is BoundingBox use
88 61f5c35c 2004-05-15 devnull * whatever's been saved in docbbox, otherwise assume the comment is just for
89 61f5c35c 2004-05-15 devnull * the current page.
90 61f5c35c 2004-05-15 devnull *
91 61f5c35c 2004-05-15 devnull */
92 61f5c35c 2004-05-15 devnull
93 61f5c35c 2004-05-15 devnull if ( strcmp(keyword, BOUNDINGBOX) == 0 )
94 61f5c35c 2004-05-15 devnull bbox = docbbox;
95 61f5c35c 2004-05-15 devnull
96 61f5c35c 2004-05-15 devnull if ( bbox.set == TRUE ) {
97 61f5c35c 2004-05-15 devnull ubbox = bbox;
98 61f5c35c 2004-05-15 devnull bbox.set = FALSE; /* so cover() works properly */
99 61f5c35c 2004-05-15 devnull x = ctm[0] * ubbox.llx + ctm[2] * ubbox.lly + ctm[4];
100 61f5c35c 2004-05-15 devnull y = ctm[1] * ubbox.llx + ctm[3] * ubbox.lly + ctm[5];
101 61f5c35c 2004-05-15 devnull cover(x, y);
102 61f5c35c 2004-05-15 devnull x = ctm[0] * ubbox.llx + ctm[2] * ubbox.ury + ctm[4];
103 61f5c35c 2004-05-15 devnull y = ctm[1] * ubbox.llx + ctm[3] * ubbox.ury + ctm[5];
104 61f5c35c 2004-05-15 devnull cover(x, y);
105 61f5c35c 2004-05-15 devnull x = ctm[0] * ubbox.urx + ctm[2] * ubbox.ury + ctm[4];
106 61f5c35c 2004-05-15 devnull y = ctm[1] * ubbox.urx + ctm[3] * ubbox.ury + ctm[5];
107 61f5c35c 2004-05-15 devnull cover(x, y);
108 61f5c35c 2004-05-15 devnull x = ctm[0] * ubbox.urx + ctm[2] * ubbox.lly + ctm[4];
109 61f5c35c 2004-05-15 devnull y = ctm[1] * ubbox.urx + ctm[3] * ubbox.lly + ctm[5];
110 61f5c35c 2004-05-15 devnull cover(x, y);
111 61f5c35c 2004-05-15 devnull bbox.llx -= slop + 0.5;
112 61f5c35c 2004-05-15 devnull bbox.lly -= slop + 0.5;
113 61f5c35c 2004-05-15 devnull bbox.urx += slop + 0.5;
114 61f5c35c 2004-05-15 devnull bbox.ury += slop + 0.5;
115 61f5c35c 2004-05-15 devnull fprintf(fp, "%s %d %d %d %d\n", keyword, (int)bbox.llx, (int)bbox.lly,(int)bbox.urx, (int)bbox.ury);
116 61f5c35c 2004-05-15 devnull bbox = ubbox;
117 61f5c35c 2004-05-15 devnull } /* End if */
118 61f5c35c 2004-05-15 devnull
119 61f5c35c 2004-05-15 devnull resetbbox((fp == stdout) ? TRUE : FALSE);
120 61f5c35c 2004-05-15 devnull
121 61f5c35c 2004-05-15 devnull } /* End of writebbox */
122 61f5c35c 2004-05-15 devnull
123 61f5c35c 2004-05-15 devnull /*****************************************************************************/
124 b855148c 2004-05-16 devnull void
125 61f5c35c 2004-05-15 devnull resetbbox(output)
126 61f5c35c 2004-05-15 devnull
127 61f5c35c 2004-05-15 devnull int output;
128 61f5c35c 2004-05-15 devnull
129 61f5c35c 2004-05-15 devnull {
130 61f5c35c 2004-05-15 devnull
131 61f5c35c 2004-05-15 devnull /*
132 61f5c35c 2004-05-15 devnull *
133 61f5c35c 2004-05-15 devnull * Adds bbox to docbbox and resets bbox for the next page. Only update docbbox
134 61f5c35c 2004-05-15 devnull * if we really did output on the last page.
135 61f5c35c 2004-05-15 devnull *
136 61f5c35c 2004-05-15 devnull */
137 61f5c35c 2004-05-15 devnull
138 61f5c35c 2004-05-15 devnull if ( docbbox.set == TRUE ) {
139 61f5c35c 2004-05-15 devnull cover(docbbox.llx, docbbox.lly);
140 61f5c35c 2004-05-15 devnull cover(docbbox.urx, docbbox.ury);
141 61f5c35c 2004-05-15 devnull } /* End if */
142 61f5c35c 2004-05-15 devnull
143 61f5c35c 2004-05-15 devnull if ( output == TRUE ) {
144 61f5c35c 2004-05-15 devnull docbbox = bbox;
145 61f5c35c 2004-05-15 devnull docbbox.set = TRUE;
146 61f5c35c 2004-05-15 devnull } /* End if */
147 61f5c35c 2004-05-15 devnull
148 61f5c35c 2004-05-15 devnull bbox.set = FALSE;
149 61f5c35c 2004-05-15 devnull
150 61f5c35c 2004-05-15 devnull } /* End of resetbbox */
151 61f5c35c 2004-05-15 devnull
152 61f5c35c 2004-05-15 devnull /*****************************************************************************/
153 b855148c 2004-05-16 devnull void
154 61f5c35c 2004-05-15 devnull scale(sx, sy)
155 61f5c35c 2004-05-15 devnull
156 61f5c35c 2004-05-15 devnull double sx, sy;
157 61f5c35c 2004-05-15 devnull
158 61f5c35c 2004-05-15 devnull {
159 61f5c35c 2004-05-15 devnull
160 61f5c35c 2004-05-15 devnull /*
161 61f5c35c 2004-05-15 devnull *
162 61f5c35c 2004-05-15 devnull * Scales the default matrix.
163 61f5c35c 2004-05-15 devnull *
164 61f5c35c 2004-05-15 devnull */
165 61f5c35c 2004-05-15 devnull
166 61f5c35c 2004-05-15 devnull matrix1[0] = sx;
167 61f5c35c 2004-05-15 devnull matrix1[1] = 0;
168 61f5c35c 2004-05-15 devnull matrix1[2] = 0;
169 61f5c35c 2004-05-15 devnull matrix1[3] = sy;
170 61f5c35c 2004-05-15 devnull matrix1[4] = 0;
171 61f5c35c 2004-05-15 devnull matrix1[5] = 0;
172 61f5c35c 2004-05-15 devnull
173 61f5c35c 2004-05-15 devnull concat(matrix1);
174 61f5c35c 2004-05-15 devnull
175 61f5c35c 2004-05-15 devnull } /* End of scale */
176 61f5c35c 2004-05-15 devnull
177 61f5c35c 2004-05-15 devnull /*****************************************************************************/
178 b855148c 2004-05-16 devnull void
179 61f5c35c 2004-05-15 devnull translate(tx, ty)
180 61f5c35c 2004-05-15 devnull
181 61f5c35c 2004-05-15 devnull double tx, ty;
182 61f5c35c 2004-05-15 devnull
183 61f5c35c 2004-05-15 devnull {
184 61f5c35c 2004-05-15 devnull
185 61f5c35c 2004-05-15 devnull /*
186 61f5c35c 2004-05-15 devnull *
187 61f5c35c 2004-05-15 devnull * Translates the default matrix.
188 61f5c35c 2004-05-15 devnull *
189 61f5c35c 2004-05-15 devnull */
190 61f5c35c 2004-05-15 devnull
191 61f5c35c 2004-05-15 devnull matrix1[0] = 1.0;
192 61f5c35c 2004-05-15 devnull matrix1[1] = 0.0;
193 61f5c35c 2004-05-15 devnull matrix1[2] = 0.0;
194 61f5c35c 2004-05-15 devnull matrix1[3] = 1.0;
195 61f5c35c 2004-05-15 devnull matrix1[4] = tx;
196 61f5c35c 2004-05-15 devnull matrix1[5] = ty;
197 61f5c35c 2004-05-15 devnull
198 61f5c35c 2004-05-15 devnull concat(matrix1);
199 61f5c35c 2004-05-15 devnull
200 61f5c35c 2004-05-15 devnull } /* End of translate */
201 61f5c35c 2004-05-15 devnull
202 61f5c35c 2004-05-15 devnull /*****************************************************************************/
203 b855148c 2004-05-16 devnull void
204 61f5c35c 2004-05-15 devnull rotate(angle)
205 61f5c35c 2004-05-15 devnull
206 61f5c35c 2004-05-15 devnull double angle;
207 61f5c35c 2004-05-15 devnull
208 61f5c35c 2004-05-15 devnull {
209 61f5c35c 2004-05-15 devnull
210 61f5c35c 2004-05-15 devnull /*
211 61f5c35c 2004-05-15 devnull *
212 61f5c35c 2004-05-15 devnull * Rotates by angle degrees.
213 61f5c35c 2004-05-15 devnull *
214 61f5c35c 2004-05-15 devnull */
215 61f5c35c 2004-05-15 devnull
216 61f5c35c 2004-05-15 devnull angle *= 3.1416 / 180;
217 61f5c35c 2004-05-15 devnull
218 61f5c35c 2004-05-15 devnull matrix1[0] = matrix1[3] = cos(angle);
219 61f5c35c 2004-05-15 devnull matrix1[1] = sin(angle);
220 61f5c35c 2004-05-15 devnull matrix1[2] = -matrix1[1];
221 61f5c35c 2004-05-15 devnull matrix1[4] = 0.0;
222 61f5c35c 2004-05-15 devnull matrix1[5] = 0.0;
223 61f5c35c 2004-05-15 devnull
224 61f5c35c 2004-05-15 devnull concat(matrix1);
225 61f5c35c 2004-05-15 devnull
226 61f5c35c 2004-05-15 devnull } /* End of rotate */
227 61f5c35c 2004-05-15 devnull
228 61f5c35c 2004-05-15 devnull /*****************************************************************************/
229 61f5c35c 2004-05-15 devnull
230 b855148c 2004-05-16 devnull void
231 61f5c35c 2004-05-15 devnull concat(m1)
232 61f5c35c 2004-05-15 devnull
233 61f5c35c 2004-05-15 devnull double m1[];
234 61f5c35c 2004-05-15 devnull
235 61f5c35c 2004-05-15 devnull {
236 61f5c35c 2004-05-15 devnull
237 61f5c35c 2004-05-15 devnull double m2[6];
238 61f5c35c 2004-05-15 devnull
239 61f5c35c 2004-05-15 devnull /*
240 61f5c35c 2004-05-15 devnull *
241 61f5c35c 2004-05-15 devnull * Replaces the ctm[] by the result of the matrix multiplication m1[] x ctm[].
242 61f5c35c 2004-05-15 devnull *
243 61f5c35c 2004-05-15 devnull */
244 61f5c35c 2004-05-15 devnull
245 61f5c35c 2004-05-15 devnull m2[0] = ctm[0];
246 61f5c35c 2004-05-15 devnull m2[1] = ctm[1];
247 61f5c35c 2004-05-15 devnull m2[2] = ctm[2];
248 61f5c35c 2004-05-15 devnull m2[3] = ctm[3];
249 61f5c35c 2004-05-15 devnull m2[4] = ctm[4];
250 61f5c35c 2004-05-15 devnull m2[5] = ctm[5];
251 61f5c35c 2004-05-15 devnull
252 61f5c35c 2004-05-15 devnull ctm[0] = m1[0] * m2[0] + m1[1] * m2[2];
253 61f5c35c 2004-05-15 devnull ctm[1] = m1[0] * m2[1] + m1[1] * m2[3];
254 61f5c35c 2004-05-15 devnull ctm[2] = m1[2] * m2[0] + m1[3] * m2[2];
255 61f5c35c 2004-05-15 devnull ctm[3] = m1[2] * m2[1] + m1[3] * m2[3];
256 61f5c35c 2004-05-15 devnull ctm[4] = m1[4] * m2[0] + m1[5] * m2[2] + m2[4];
257 61f5c35c 2004-05-15 devnull ctm[5] = m1[4] * m2[1] + m1[5] * m2[3] + m2[5];
258 61f5c35c 2004-05-15 devnull
259 61f5c35c 2004-05-15 devnull } /* End of concat */
260 61f5c35c 2004-05-15 devnull
261 61f5c35c 2004-05-15 devnull /*****************************************************************************/