ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/psign.c
Revision: 2.2
Committed: Thu Dec 19 14:52:00 1991 UTC (32 years, 4 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.1: +0 -1 lines
Log Message:
eliminated atof declarations for NeXT

File Contents

# Content
1 /* Copyright (c) 1991 Regents of the University of California */
2
3 #ifndef lint
4 static char SCCSid[] = "$SunId$ LBL";
5 #endif
6
7 /*
8 * psign.c - produce picture from text.
9 *
10 * 7/1/87
11 */
12
13 #include <stdio.h>
14
15 #include "color.h"
16
17 #define MAXLINE 512 /* longest allowable line */
18
19 char *fontfile = "helvet.fnt"; /* our font file */
20
21 COLR bgcolr = WHTCOLR; /* background color */
22 COLR fgcolr = BLKCOLR; /* foreground color */
23
24 int direct = 'r'; /* direction (right, up, left, down) */
25
26 int cheight = 32; /* character height */
27 double aspect = 1.67; /* height/width character aspect */
28 int cwidth; /* computed character width */
29
30 unsigned char *ourbitmap; /* our output bitmap */
31 int xsiz, ysiz; /* bitmap dimensions */
32 int xdim; /* size of horizontal scan (bytes) */
33
34 #define bitop(x,y,op) (ourbitmap[(y)*xdim+((x)>>3)] op (1<<((x)&7)))
35 #define tstbit(x,y) bitop(x,y,&)
36 #define setbit(x,y) bitop(x,y,|=)
37 #define clrbit(x,y) bitop(x,y,&=~)
38 #define tglbit(x,y) bitop(x,y,^=)
39
40 typedef unsigned char GLYPH;
41
42 GLYPH *ourfont[128]; /* our font */
43
44 typedef struct line {
45 char *s; /* line w/o LF */
46 struct line *next; /* next line up */
47 } LINE;
48
49 LINE *ourtext; /* our text */
50 int nlines, maxline; /* text dimensions */
51
52 extern char *malloc(), *calloc();
53 extern FILE *fropen();
54
55
56 main(argc, argv)
57 int argc;
58 char *argv[];
59 {
60 int an;
61
62 for (an = 1; an < argc && argv[an][0] == '-'; an++)
63 switch (argv[an][1]) {
64 case 'c': /* color */
65 switch (argv[an][2]) {
66 case 'f': /* foreground */
67 setcolr(fgcolr, atof(argv[an+1]),
68 atof(argv[an+2]),
69 atof(argv[an+3]));
70 an += 3;
71 break;
72 case 'b': /* background */
73 setcolr(bgcolr, atof(argv[an+1]),
74 atof(argv[an+2]),
75 atof(argv[an+3]));
76 an += 3;
77 break;
78 default:
79 goto unkopt;
80 }
81 break;
82 case 'f': /* font */
83 fontfile = argv[++an];
84 break;
85 case 'd': /* direction */
86 switch (argv[an][2]) {
87 case 'r': /* right */
88 case 'u': /* up */
89 case 'l': /* left */
90 case 'd': /* down */
91 direct = argv[an][2];
92 break;
93 default:
94 goto unkopt;
95 }
96 break;
97 case 'h': /* height of characters */
98 cheight = atoi(argv[++an]);
99 break;
100 case 'a': /* aspect ratio */
101 aspect = atof(argv[++an]);
102 break;
103 default:;
104 unkopt:
105 fprintf(stderr, "%s: unknown option: %s\n",
106 argv[0], argv[an]);
107 exit(1);
108 }
109 /* get text */
110 if (an == argc)
111 gettext(stdin);
112 else
113 arg_text(argc-an, argv+an);
114
115 /* create bit map */
116 makemap();
117 /* load font file */
118 loadfont();
119 /* convert text to bitmap */
120 maptext();
121 /* print header */
122 printargs(argc, argv, stdout);
123 fputformat(COLRFMT, stdout);
124 putchar('\n');
125 /* write out bitmap */
126 writemap(stdout);
127
128 exit(0);
129 }
130
131
132 makemap() /* create the bit map */
133 {
134 cwidth = cheight/aspect + 0.5;
135 if (direct == 'r' || direct == 'l') {
136 xsiz = maxline*cwidth;
137 ysiz = nlines*cheight;
138 } else { /* reverse orientation */
139 xsiz = nlines*cheight;
140 ysiz = maxline*cwidth;
141 }
142 xdim = (xsiz+7)/8;
143 ourbitmap = (BYTE *)calloc(ysiz, xdim);
144 if (ourbitmap == NULL) {
145 fprintf(stderr, "out of memory in makemap\n");
146 exit(1);
147 }
148 }
149
150
151 loadfont() /* load the font file */
152 {
153 FILE *fp;
154 char *err;
155 int gn, ngv, gv;
156 register GLYPH *g;
157
158 if ((fp = fropen(fontfile)) == NULL) {
159 fprintf(stderr, "cannot find font file \"%s\"\n",
160 fontfile);
161 exit(1);
162 }
163 while (fscanf(fp, "%d", &gn) == 1) { /* get each glyph */
164 if (gn < 0 || gn > 127) {
165 err = "illegal";
166 goto fonterr;
167 }
168 if (ourfont[gn] != NULL) {
169 err = "duplicate";
170 goto fonterr;
171 }
172 if (fscanf(fp, "%d", &ngv) != 1 ||
173 ngv < 0 || ngv > 255) {
174 err = "bad # vertices for";
175 goto fonterr;
176 }
177 g = (GLYPH *)malloc((2*ngv+1)*sizeof(GLYPH));
178 if (g == NULL)
179 goto memerr;
180 ourfont[gn] = g;
181 *g++ = ngv;
182 ngv *= 2;
183 while (ngv--) {
184 if (fscanf(fp, "%d", &gv) != 1 ||
185 gv < 0 || gv > 255) {
186 err = "bad vertex for";
187 goto fonterr;
188 }
189 *g++ = gv;
190 }
191 }
192 fclose(fp);
193 return;
194 fonterr:
195 fprintf(stderr, "%s character (%d) in font file \"%s\"\n",
196 err, gn, fontfile);
197 exit(1);
198 memerr:
199 fprintf(stderr, "out of memory in loadfont\n");
200 exit(1);
201 }
202
203
204 gettext(fp) /* get text from a file */
205 FILE *fp;
206 {
207 char *fgets();
208 char buf[MAXLINE];
209 register LINE *curl;
210 int len;
211
212 maxline = 0;
213 nlines = 0;
214 while (fgets(buf, MAXLINE, fp) != NULL) {
215 curl = (LINE *)malloc(sizeof(LINE));
216 if (curl == NULL)
217 goto memerr;
218 len = strlen(buf);
219 curl->s = malloc(len--);
220 if (curl->s == NULL)
221 goto memerr;
222 strncpy(curl->s, buf, len);
223 curl->s[len] = '\0';
224 curl->next = ourtext;
225 ourtext = curl;
226 if (len > maxline)
227 maxline = len;
228 nlines++;
229 }
230 return;
231 memerr:
232 fprintf(stderr, "out of memory in gettext\n");
233 exit(1);
234 }
235
236
237 arg_text(ac, av) /* get text from arguments */
238 int ac;
239 char *av[];
240 {
241 register char *cp;
242
243 ourtext = (LINE *)malloc(sizeof(LINE));
244 if (ourtext == NULL)
245 goto memerr;
246 ourtext->s = malloc(MAXLINE);
247 if (ourtext->s == NULL)
248 goto memerr;
249 for (cp = ourtext->s; ac-- > 0; av++) {
250 strcpy(cp, *av);
251 cp += strlen(*av);
252 *cp++ = ' ';
253 }
254 *--cp = '\0';
255 ourtext->next = NULL;
256 maxline = strlen(ourtext->s);
257 nlines = 1;
258 return;
259 memerr:
260 fprintf(stderr, "out of memory in arg_text\n");
261 exit(1);
262 }
263
264
265 maptext() /* map our text */
266 {
267 register LINE *curl;
268 int l;
269 register int c;
270
271 for (l = 0, curl = ourtext; curl != NULL; l++, curl = curl->next)
272 for (c = strlen(curl->s)-1; c >= 0; c--)
273 mapglyph(ourfont[curl->s[c]], c, l);
274 }
275
276
277 mapglyph(gl, tx0, ty0) /* convert a glyph */
278 register GLYPH *gl;
279 int tx0, ty0;
280 {
281 int n;
282 int p0[2], p1[2];
283
284 if (gl == NULL)
285 return;
286
287 tx0 <<= 8; ty0 <<= 8;
288 n = *gl++;
289 mapcoord(p0, gl[2*n-2]+tx0, gl[2*n-1]+ty0);
290 while (n--) {
291 mapcoord(p1, gl[0]+tx0, gl[1]+ty0);
292 mapedge(p0[0], p0[1], p1[0]-p0[0], p1[1]-p0[1]);
293 p0[0] = p1[0]; p0[1] = p1[1];
294 gl += 2;
295 }
296 }
297
298
299 mapcoord(p, tx, ty) /* map text to picture coordinates */
300 int p[2], tx, ty;
301 {
302 tx = (long)tx*cwidth >> 8;
303 ty = (long)ty*cheight >> 8;
304
305 switch (direct) {
306 case 'r': /* right */
307 p[0] = tx;
308 p[1] = ty;
309 return;
310 case 'u': /* up */
311 p[0] = xsiz-1-ty;
312 p[1] = tx;
313 return;
314 case 'l': /* left */
315 p[0] = xsiz-1-tx;
316 p[1] = ysiz-1-ty;
317 return;
318 case 'd': /* down */
319 p[0] = ty;
320 p[1] = ysiz-1-tx;
321 return;
322 }
323 }
324
325
326 mapedge(x, y, run, rise) /* map an edge */
327 register int x, y;
328 int run, rise;
329 {
330 int xstep;
331 int rise2, run2;
332 int n;
333
334 if (rise == 0)
335 return;
336 /* always draw up */
337 if (rise < 0) {
338 x += run;
339 y += rise;
340 rise = -rise;
341 run = -run;
342 }
343 if (run < 0) {
344 xstep = -1;
345 run = -run;
346 } else
347 xstep = 1;
348 n = rise;
349 run2 = rise2 = 0;
350 while (n)
351 if (rise2 >= run2) {
352 tglbit(x, y);
353 n--;
354 y++;
355 run2 += run;
356 } else {
357 x += xstep;
358 rise2 += rise;
359 }
360 }
361
362
363 writemap(fp) /* write out bitmap */
364 FILE *fp;
365 {
366 COLR *scanout;
367 int y;
368 register int x;
369 register int inglyph;
370
371 fprintf(fp, "-Y %d +X %d\n", ysiz, xsiz);
372
373 scanout = (COLR *)malloc(xsiz*sizeof(COLR));
374 if (scanout == NULL) {
375 fprintf(stderr, "out of memory in writemap\n");
376 exit(1);
377 }
378 for (y = ysiz-1; y >= 0; y--) {
379 inglyph = 0;
380 for (x = 0; x < xsiz; x++) {
381 if (tstbit(x, y))
382 inglyph ^= 1;
383 if (inglyph)
384 copycolr(scanout[x], fgcolr);
385 else
386 copycolr(scanout[x], bgcolr);
387 }
388 if (fwritecolrs(scanout, xsiz, fp) < 0) {
389 fprintf(stderr, "write error in writemap\n");
390 exit(1);
391 }
392 }
393 free((char *)scanout);
394 }