ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/oki20c.c
Revision: 2.7
Committed: Fri Jul 3 08:59:26 1992 UTC (31 years, 10 months ago) by greg
Content type: text/plain
Branch: MAIN
Changes since 2.6: +1 -1 lines
Log Message:
removed limit on number of rows in output

File Contents

# User Rev Content
1 greg 1.12 /* Copyright (c) 1991 Regents of the University of California */
2 greg 1.1
3     #ifndef lint
4     static char SCCSid[] = "$SunId$ LBL";
5     #endif
6    
7     /*
8     * oki20c.c - program to dump pixel file to OkiMate 20 color printer.
9     *
10     * 6/10/87
11     */
12    
13     #include <stdio.h>
14    
15     #include "color.h"
16 greg 1.12 #include "resolu.h"
17 greg 1.1
18     #define NROWS 1440 /* 10" at 144 dpi */
19     #define NCOLS 960 /* 8" at 120 dpi */
20    
21 greg 2.3 #define ASPECT (120./144.) /* pixel aspect ratio */
22    
23     #define FILTER "pfilt -1 -x %d -y %d -p %f %s",NCOLS,NROWS,ASPECT
24    
25 greg 1.1 /*
26     * Subtractive primaries are ordered: Yellow, Magenta, Cyan.
27     */
28    
29     #define sub_add(sub) (2-(sub)) /* map subtractive to additive pri. */
30    
31 greg 1.9 #ifdef BSD
32     #define clearlbuf() bzero((char *)lpat, sizeof(lpat))
33     #else
34     #define clearlbuf() (void)memset((char *)lpat, 0, sizeof(lpat))
35     #endif
36 greg 1.1
37 greg 1.9 long lpat[NCOLS][3];
38    
39 greg 2.3 int dofilter = 0; /* filter through pfilt first? */
40 greg 1.9
41 greg 2.3
42 greg 1.1 main(argc, argv)
43     int argc;
44     char *argv[];
45     {
46     int i, status = 0;
47    
48 greg 2.3 if (argc > 1 && !strcmp(argv[1], "-p")) {
49     dofilter++;
50     argv++; argc--;
51     }
52 greg 2.5 #ifdef _IOLBF
53     stdout->_flag &= ~_IOLBF;
54     #endif
55 greg 1.1 if (argc < 2)
56     status = printp(NULL) == -1;
57     else
58     for (i = 1; i < argc; i++)
59     status += printp(argv[i]) == -1;
60     exit(status);
61     }
62    
63    
64     printp(fname) /* print a picture */
65     char *fname;
66     {
67 greg 2.3 char buf[64];
68 greg 1.1 FILE *input;
69     int xres, yres;
70 greg 1.6 COLR scanline[NCOLS];
71 greg 1.1 int i;
72    
73 greg 2.3 if (dofilter) {
74 greg 2.6 if (fname == NULL) {
75     sprintf(buf, FILTER, "");
76     fname = "<stdin>";
77     } else
78     sprintf(buf, FILTER, fname);
79 greg 2.3 if ((input = popen(buf, "r")) == NULL) {
80     fprintf(stderr, "Cannot execute: %s\n", buf);
81     return(-1);
82     }
83     } else if (fname == NULL) {
84 greg 1.1 input = stdin;
85     fname = "<stdin>";
86     } else if ((input = fopen(fname, "r")) == NULL) {
87     fprintf(stderr, "%s: cannot open\n", fname);
88     return(-1);
89     }
90     /* discard header */
91 greg 1.10 if (checkheader(input, COLRFMT, NULL) < 0) {
92     fprintf(stderr, "%s: not a Radiance picture\n", fname);
93     return(-1);
94     }
95 greg 1.1 /* get picture dimensions */
96 greg 1.12 if (fgetresolu(&xres, &yres, input) < 0) {
97 greg 1.1 fprintf(stderr, "%s: bad picture size\n", fname);
98     return(-1);
99     }
100 greg 2.7 if (xres > NCOLS) {
101 greg 1.1 fprintf(stderr, "%s: resolution mismatch\n", fname);
102     return(-1);
103     }
104 greg 1.3 /* set line spacing (overlap for knitting) */
105 greg 1.5 fputs("\0333\042", stdout);
106 greg 1.9 /* clear line buffer */
107     clearlbuf();
108 greg 1.3 /* put out scanlines */
109 greg 1.1 for (i = yres-1; i >= 0; i--) {
110 greg 1.6 if (freadcolrs(scanline, xres, input) < 0) {
111 greg 1.1 fprintf(stderr, "%s: read error (y=%d)\n", fname, i);
112     return(-1);
113     }
114 greg 1.8 normcolrs(scanline, xres, 0);
115 greg 1.1 plotscan(scanline, xres, i);
116     }
117 greg 1.3 /* advance page */
118 greg 1.1 putchar('\f');
119    
120 greg 2.3 if (dofilter)
121     pclose(input);
122     else
123     fclose(input);
124 greg 1.1
125     return(0);
126 greg 1.6 }
127    
128    
129 greg 1.1 plotscan(scan, len, y) /* plot a scanline */
130 greg 1.6 COLR scan[];
131 greg 1.1 int len;
132     int y;
133     {
134     int bpos;
135     register long c;
136     register int i, j;
137    
138 greg 1.5 if (bpos = y % 23) {
139 greg 1.1
140 greg 1.5 for (j = 0; j < 3; j++)
141     for (i = 0; i < len; i++)
142 greg 1.9 lpat[i][j] |= (long)colbit(scan[i],i,j) << bpos;
143 greg 1.1
144     } else {
145    
146     fputs("\033\031", stdout);
147    
148     for (j = 0; j < 3; j++) {
149 greg 2.4 i = (NCOLS + len)/2; /* center image */
150 greg 1.1 fputs("\033%O", stdout);
151 greg 2.4 putchar(i & 255);
152     putchar(i >> 8);
153     while (i-- > len) {
154     putchar(0);
155     putchar(0);
156     putchar(0);
157     }
158 greg 1.1 for (i = 0; i < len; i++) {
159 greg 1.9 c = lpat[i][j] | colbit(scan[i],i,j);
160 greg 1.5 /* repeat this row */
161 greg 1.9 lpat[i][j] = (c & 1) << 23;
162 greg 1.5 putchar(c>>16);
163     putchar(c>>8 & 255);
164     putchar(c & 255);
165 greg 1.1 }
166     putchar('\r');
167     }
168     putchar('\n');
169 greg 2.3 fflush(stdout);
170 greg 1.1 }
171     }
172    
173    
174     colbit(col, x, s) /* determine bit value for primary at x */
175 greg 1.6 COLR col;
176 greg 1.1 register int x;
177     int s;
178     {
179 greg 1.6 static int cerr[NCOLS][3];
180 greg 2.2 static int err[3];
181     int b, errp;
182 greg 1.1 register int a, ison;
183    
184     a = sub_add(s); /* use additive primary */
185 greg 1.6 b = col[a];
186 greg 2.2 errp = err[a];
187 greg 1.1 err[a] += b + cerr[x][a];
188 greg 1.6 ison = err[a] < 128;
189     if (!ison) err[a] -= 256;
190 greg 1.11 err[a] /= 3;
191 greg 2.2 cerr[x][a] = err[a] + errp;
192 greg 1.1 return(ison);
193     }