--- ray/src/common/color.c 1991/08/23 12:33:49 1.14 +++ ray/src/common/color.c 1992/10/02 15:59:58 2.4 @@ -17,7 +17,11 @@ static char SCCSid[] = "$SunId$ LBL"; #define MINELEN 8 /* minimum scanline length for encoding */ #define MINRUN 4 /* minimum run length */ +#ifndef frexp +extern double frexp(); +#endif + char * tempbuffer(len) /* get a temporary buffer */ unsigned len; @@ -39,18 +43,17 @@ unsigned len; fwritecolrs(scanline, len, fp) /* write out a colr scanline */ register COLR *scanline; -int len; +unsigned len; register FILE *fp; { register int i, j, beg, cnt; int c2; - if (len < MINELEN) /* too small to encode */ + if (len < MINELEN | len > 0x7fff) /* OOBs, write out flat */ return(fwrite((char *)scanline,sizeof(COLR),len,fp) - len); - if (len > 32767) /* too big! */ - return(-1); - putc(2, fp); /* put magic header */ + /* put magic header */ putc(2, fp); + putc(2, fp); putc(len>>8, fp); putc(len&255, fp); /* put components seperately */ @@ -63,7 +66,17 @@ register FILE *fp; if (cnt >= MINRUN) break; /* long enough */ } - while (j < beg) { /* write out non-run(s) */ + if (beg-j > 1 && beg-j < MINRUN) { + c2 = j+1; + while (scanline[c2++][i] == scanline[j][i]) + if (c2 == beg) { /* short run */ + putc(128+beg-j, fp); + putc(scanline[j][i], fp); + j = beg; + break; + } + } + while (j < beg) { /* write out non-run */ if ((c2 = beg-j) > 128) c2 = 128; putc(c2, fp); while (c2--) @@ -88,7 +101,7 @@ register FILE *fp; register int i, j; int code; /* determine scanline type */ - if (len < MINELEN) + if (len < MINELEN | len > 0x7fff) return(oldreadcolrs(scanline, len, fp)); if ((i = getc(fp)) == EOF) return(-1); @@ -216,7 +229,6 @@ setcolr(clr, r, g, b) /* assign a short color value * register COLR clr; double r, g, b; { - double frexp(); double d; int e;