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.8 by greg, Thu Feb 10 15:40:12 1994 UTC vs.
Revision 2.9 by greg, Thu Feb 10 21:59:53 1994 UTC

# Line 13 | Line 13 | static char SCCSid[] = "$SunId$ LBL";
13   #include  <fcntl.h>
14   #endif
15   #include  "color.h"
16 #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  
# Line 135 | Line 139 | char  *name;
139          printf("%%%%EndComments\n");
140          printf("64 dict begin\n");
141                                          /* define image reader */
142 <        PSprocdef("read6bit");
142 >        PSprocdef("read6bitRLE");
143                                          /* set up transformation matrix */
144          printf("%f %f translate\n", HMARGIN, VMARGIN);
145          if (PWIDTH > PHEIGHT ^ landscape) {
# Line 158 | Line 162 | char  *name;
162          printf("%f %f scale\n", iwidth, iheight);
163          printf("%%%%EndProlog\n");
164                                          /* start image procedure */
165 <        printf("%d %d 8 [%d 0 0 %d 0 %d] {read6bit} image", xmax, ymax,
165 >        printf("%d %d 8 [%d 0 0 %d 0 %d] {read6bitRLE} image\n", xmax, ymax,
166                          xmax, -ymax, ymax);
167   }
168  
# Line 186 | Line 190 | char  *nam;
190                  itab[code[i]] = i<<2 | 2;
191          itab[code[0]] = 0;              /* black is black */
192          itab[code[63]] = 255;           /* and white is white */
193 <        printf("/decode [");
193 >        printf("/codetab [");
194          for (i = 0; i < 128; i++) {
195                  if (!(i & 0xf))
196                          putchar('\n');
# Line 194 | Line 198 | char  *nam;
198          }
199          printf("\n] def\n");
200          printf("/scanline %d string def\n", xmax);
201 +        printf("/nrept 0 def\n");
202 +        printf("/readbyte { currentfile read not {stop} if } def\n");
203 +        printf("/decode { codetab exch get } def\n");
204          printf("/%s {\n", nam);
205          printf("\t{ 0 1 %d { scanline exch\n", xmax-1);
206 <        printf("\t\t{ decode currentfile read not {stop} if get\n");
207 <        printf("\tdup 0 lt {pop} {exit} ifelse } loop put } for\n");
208 <        printf("\t} stopped {pop pop pop 0 string} {scanline} ifelse\n");
206 >        printf("\t\tnrept 0 le\n");
207 >        printf("\t\t\t{ { readbyte dup %d eq\n", RUNCHR);
208 >        printf("\t\t\t\t\t{ pop /nrept readbyte %d sub def\n", RSTRT-MINRUN+1);
209 >        printf("\t\t\t\t\t\t/reptv readbyte decode def\n");
210 >        printf("\t\t\t\t\t\treptv exit }\n");
211 >        printf("\t\t\t\t\t{ decode dup 0 lt {pop} {exit} ifelse }\n");
212 >        printf("\t\t\t\tifelse } loop }\n");
213 >        printf("\t\t\t{ /nrept nrept 1 sub def reptv }\n");
214 >        printf("\t\tifelse put\n");
215 >        printf("\t\t} for\n");
216 >        printf("\t} stopped {pop pop 0 string} {scanline} ifelse\n");
217          printf("} bind def\n");
218   }
219  
220  
221   ra2ps()                         /* convert Radiance scanlines to 6-bit */
222   {
223 <        COLR    *scanin;
209 <        register int    col = 0;
223 >        register COLR   *scanin;
224          register int    c;
225 +        int     lastc, cnt;
226          register int    x;
227          int     y;
228                                                  /* allocate scanline */
# Line 219 | Line 234 | ra2ps()                                /* convert Radiance scanlines to 6-bit */
234                  if (freadcolrs(scanin, xmax, stdin) < 0)
235                          quiterr("error reading Radiance picture");
236                  normcolrs(scanin, xmax, bradj); /* normalize */
237 +                lastc = -1; cnt = 0;
238                  for (x = 0; x < xmax; x++) {
239 <                        if (!(col++ & 0x3f))
224 <                                putchar('\n');
225 <                        c = normbright(scanin[x]) + (random()&3);
239 >                        c = normbright(scanin[x]) + 2;
240                          if (c > 255) c = 255;
241 <                        putchar(code[c>>2]);
241 >                        c = code[c>>2];
242 >                        if (c == lastc && cnt < MAXRUN)
243 >                                cnt++;
244 >                        else {
245 >                                putrle(cnt, lastc);
246 >                                lastc = c;
247 >                                cnt = 1;
248 >                        }
249                  }
250 +                putrle(cnt, lastc);
251                  if (ferror(stdout))
252                          quiterr("error writing PostScript file");
253          }
254          putchar('\n');
255                                                  /* free scanline */
256          free((char *)scanin);
257 + }
258 +
259 +
260 + putrle(cnt, cod)                /* put out cnt of cod */
261 + register int    cnt, cod;
262 + {
263 +        static int      col = 0;
264 +
265 +        if (cnt >= MINRUN) {
266 +                col += 3;
267 +                putchar(RUNCHR);
268 +                putchar(RSTRT-MINRUN+cnt);
269 +                putchar(cod);
270 +        } else {
271 +                col += cnt;
272 +                while (cnt-- > 0)
273 +                        putchar(cod);
274 +        }
275 +        if (col >= 72) {
276 +                putchar('\n');
277 +                col = 0;
278 +        }
279   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines