ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/px/ra_ps.c
(Generate patch)

Comparing ray/src/px/ra_ps.c (file contents):
Revision 2.3 by greg, Mon Jul 13 10:53:42 1992 UTC vs.
Revision 2.10 by greg, Wed Sep 27 13:29:52 1995 UTC

# Line 9 | Line 9 | static char SCCSid[] = "$SunId$ LBL";
9   */
10  
11   #include  <stdio.h>
12 + #ifdef MSDOS
13 + #include  <fcntl.h>
14 + #endif
15   #include  "color.h"
13 #include  "random.h"
16  
17   #define HMARGIN         (.5*72)                 /* horizontal margin */
18   #define VMARGIN         (.5*72)                 /* vertical margin */
19   #define PWIDTH          (8.5*72-2*HMARGIN)      /* width of device */
20   #define PHEIGHT         (11*72-2*VMARGIN)       /* height of device */
21  
22 + #define RUNCHR          '*'                     /* character to start rle */
23 + #define MINRUN          4                       /* minimum run-length */
24 + #define RSTRT           '!'                     /* character for MINRUN */
25 + #define MAXRUN          (MINRUN+'~'-RSTRT)      /* maximum run-length */
26 +
27   char  code[] =                  /* 6-bit code lookup table */
28          "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@+";
29  
30   int  wrongformat = 0;                   /* input in wrong format? */
31 < double  pixaspect = 1.0;                /* pixel aspect ratio */
31 > double  pixaspect = 1.0;                /* pixel aspect ratio */
32  
33   int  bradj = 0;                         /* brightness adjustment */
34 + int  ncopies = 1;                       /* number of copies */
35  
36   char  *progname;
37  
38   int  xmax, ymax;
39  
40 + extern char  *malloc();
41  
42 +
43   headline(s)             /* check header line */
44   char  *s;
45   {
# Line 59 | Line 69 | char  *argv[];
69                                          goto userr;
70                                  bradj = atoi(argv[++i]);
71                                  break;
72 +                        case 'n':               /* number of copies */
73 +                                ncopies = atoi(argv[++i]);
74 +                                break;
75                          default:
76                                  goto userr;
77                          }
# Line 73 | Line 86 | char  *argv[];
86                  exit(1);
87          }
88          if (i == argc-2 && freopen(argv[i+1], "w", stdout) == NULL) {
89 <                fprintf(stderr, "can't open output \"%s\"\n",
89 >                fprintf(stderr, "%s: can't open output \"%s\"\n",
90                                  progname, argv[i+1]);
91                  exit(1);
92          }
93 + #ifdef MSDOS
94 +        setmode(fileno(stdin), O_BINARY);
95 + #endif
96                                  /* get our header */
97          getheader(stdin, headline, NULL);
98          if (wrongformat || fgetresolu(&xmax, &ymax, stdin) < 0)
# Line 109 | Line 125 | PSheader(name)                 /* print PostScript header */
125   char  *name;
126   {
127          int  landscape = 0;
128 <        double  pwidth, pheight;
129 <        double  iwidth, iheight;
130 <
131 <        printf("%%!\n");
128 >        double  pwidth, pheight;
129 >        double  iwidth, iheight;
130 >                                        /* EPS comments */
131 >        puts("%%!PS-Adobe-2.0 EPSF-2.0");
132          printf("%%%%Title: %s\n", name);
133 <        printf("%%%%Creator: %s\n", progname);
134 <        printf("%%%%Pages: 1\n");
133 >        printf("%%%%Creator: %s = %s\n", progname, SCCSid);
134 >        printf("%%%%Pages: %d\n", ncopies);
135          if (landscape = xmax > pixaspect*ymax)
136 <                printf("%%%%Landscape\n");
136 >                puts("%%Orientation: Landscape");
137          else
138 <                printf("%%%%Portrait\n");
123 <        printf("%%%%EndComments\n");
124 <        printf("gsave\n");
125 <        printf("64 dict begin\n");
126 <                                        /* define image reader */
127 <        PSprocdef("read6bit");
128 <                                        /* set up transformation matrix */
129 <        printf("%f %f translate\n", HMARGIN, VMARGIN);
138 >                puts("%%Orientation: Portrait");
139          if (PWIDTH > PHEIGHT ^ landscape) {
131                printf("0 %f translate\n", PHEIGHT);
132                printf("-90 rotate\n");
140                  pwidth = PHEIGHT;
141                  pheight = PWIDTH;
142          } else {
# Line 143 | Line 150 | char  *name;
150                  iheight = pheight;
151                  iwidth = pheight*xmax/(pixaspect*ymax);
152          }
153 +        if (pwidth == PHEIGHT)
154 +                printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n",
155 +                                HMARGIN+(pheight-iheight)*.5,
156 +                                VMARGIN+(pwidth-iwidth)*.5,
157 +                                HMARGIN+(pheight-iheight)*.5+iheight,
158 +                                VMARGIN+(pwidth-iwidth)*.5+iwidth);
159 +        else
160 +                printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n",
161 +                                HMARGIN+(pwidth-iwidth)*.5,
162 +                                VMARGIN+(pheight-iheight)*.5,
163 +                                HMARGIN+(pwidth-iwidth)*.5+iwidth,
164 +                                VMARGIN+(pheight-iheight)*.5+iheight);
165 +        puts("%%EndComments");
166 +        puts("save");
167 +        puts("64 dict begin");
168 +                                        /* define image reader */
169 +        PSprocdef("read6bitRLE");
170 +                                        /* set up transformation matrix */
171 +        printf("%f %f translate\n", HMARGIN, VMARGIN);
172 +        if (pwidth == PHEIGHT) {
173 +                printf("0 %f translate\n", PHEIGHT);
174 +                puts("-90 rotate");
175 +        }
176          printf("%f %f translate\n", (pwidth-iwidth)*.5, (pheight-iheight)*.5);
177          printf("%f %f scale\n", iwidth, iheight);
178 <        printf("%%%%EndProlog\n");
178 >        puts("%%%%EndProlog");
179                                          /* start image procedure */
180 <        printf("%d %d 8 [%d 0 0 %d 0 %d] {read6bit} image", xmax, ymax,
180 >        printf("%d %d 8 [%d 0 0 %d 0 %d] {read6bitRLE} image\n", xmax, ymax,
181                          xmax, -ymax, ymax);
182   }
183  
# Line 155 | Line 185 | char  *name;
185   PStrailer()                     /* print PostScript trailer */
186   {
187          puts("%%Trailer");
188 <        puts("end");
188 >        if (ncopies > 1)
189 >                printf("/#copies %d def\n", ncopies);
190          puts("showpage");
191 <        puts("grestore");
191 >        puts("end");
192 >        puts("restore");
193          puts("%%EOF");
194   }
195  
# Line 167 | Line 199 | char  *nam;
199   {
200          short  itab[128];
201          register int  i;
202 <        
203 <        for (i = 0; i < 128; i++)
202 >                                /* assign code values */
203 >        for (i = 0; i < 128; i++)       /* clear */
204                  itab[i] = -1;
205 <        for (i = 0; i < 64; i++)
205 >        for (i = 1; i < 63; i++)        /* assign greys */
206                  itab[code[i]] = i<<2 | 2;
207 <        printf("/decode [");
207 >        itab[code[0]] = 0;              /* black is black */
208 >        itab[code[63]] = 255;           /* and white is white */
209 >        printf("/codetab [");
210          for (i = 0; i < 128; i++) {
211                  if (!(i & 0xf))
212                          putchar('\n');
# Line 180 | Line 214 | char  *nam;
214          }
215          printf("\n] def\n");
216          printf("/scanline %d string def\n", xmax);
217 +        printf("/nrept 0 def\n");
218 +        printf("/readbyte { currentfile read not {stop} if } def\n");
219 +        printf("/decode { codetab exch get } def\n");
220          printf("/%s {\n", nam);
221          printf("\t{ 0 1 %d { scanline exch\n", xmax-1);
222 <        printf("\t\t{ decode currentfile read not {stop} if get\n");
223 <        printf("\tdup 0 lt {pop} {exit} ifelse } loop put } for\n");
224 <        printf("} stopped {pop pop pop 0 string} {scanline} ifelse } def\n");
222 >        printf("\t\tnrept 0 le\n");
223 >        printf("\t\t\t{ { readbyte dup %d eq\n", RUNCHR);
224 >        printf("\t\t\t\t\t{ pop /nrept readbyte %d sub def\n", RSTRT-MINRUN+1);
225 >        printf("\t\t\t\t\t\t/reptv readbyte decode def\n");
226 >        printf("\t\t\t\t\t\treptv exit }\n");
227 >        printf("\t\t\t\t\t{ decode dup 0 lt {pop} {exit} ifelse }\n");
228 >        printf("\t\t\t\tifelse } loop }\n");
229 >        printf("\t\t\t{ /nrept nrept 1 sub def reptv }\n");
230 >        printf("\t\tifelse put\n");
231 >        printf("\t\t} for\n");
232 >        printf("\t} stopped {pop pop 0 string} {scanline} ifelse\n");
233 >        printf("} bind def\n");
234   }
235  
236  
237   ra2ps()                         /* convert Radiance scanlines to 6-bit */
238   {
239 <        COLR    *scanin;
194 <        register int    col = 0;
239 >        register COLR   *scanin;
240          register int    c;
241 +        int     lastc, cnt;
242          register int    x;
243          int     y;
244                                                  /* allocate scanline */
# Line 203 | Line 249 | ra2ps()                                /* convert Radiance scanlines to 6-bit */
249          for (y = ymax-1; y >= 0; y--) {
250                  if (freadcolrs(scanin, xmax, stdin) < 0)
251                          quiterr("error reading Radiance picture");
252 <                normcolrs(scanin, xmax, bradj); /* normalize */
252 >                normcolrs(scanin, xmax, bradj); /* normalize */
253 >                lastc = -1; cnt = 0;
254                  for (x = 0; x < xmax; x++) {
255 <                        if (!(col++ & 0x3f))
209 <                                putchar('\n');
210 <                        c = normbright(scanin[x]) + (random()&3);
255 >                        c = normbright(scanin[x]) + 2;
256                          if (c > 255) c = 255;
257 <                        putchar(code[c>>2]);
257 >                        c = code[c>>2];
258 >                        if (c == lastc && cnt < MAXRUN)
259 >                                cnt++;
260 >                        else {
261 >                                putrle(cnt, lastc);
262 >                                lastc = c;
263 >                                cnt = 1;
264 >                        }
265                  }
266 +                putrle(cnt, lastc);
267                  if (ferror(stdout))
268                          quiterr("error writing PostScript file");
269          }
270          putchar('\n');
271                                                  /* free scanline */
272          free((char *)scanin);
273 + }
274 +
275 +
276 + putrle(cnt, cod)                /* put out cnt of cod */
277 + register int    cnt, cod;
278 + {
279 +        static int      col = 0;
280 +
281 +        if (cnt >= MINRUN) {
282 +                col += 3;
283 +                putchar(RUNCHR);
284 +                putchar(RSTRT-MINRUN+cnt);
285 +                putchar(cod);
286 +        } else {
287 +                col += cnt;
288 +                while (cnt-- > 0)
289 +                        putchar(cod);
290 +        }
291 +        if (col >= 72) {
292 +                putchar('\n');
293 +                col = 0;
294 +        }
295   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines