--- ray/src/common/color.c 1991/08/28 08:39:47 1.15 +++ ray/src/common/color.c 1994/03/26 13:44:38 2.8 @@ -12,9 +12,12 @@ static char SCCSid[] = "$SunId$ LBL"; #include +#include + #include "color.h" #define MINELEN 8 /* minimum scanline length for encoding */ +#define MAXELEN 0x7fff /* maximum scanline length for encoding */ #define MINRUN 4 /* minimum run length */ @@ -24,7 +27,7 @@ unsigned len; { extern char *malloc(), *realloc(); static char *tempbuf = NULL; - static int tempbuflen = 0; + static unsigned tempbuflen = 0; if (len > tempbuflen) { if (tempbuflen > 0) @@ -39,18 +42,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 > MAXELEN) /* 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 */ @@ -96,9 +98,9 @@ int len; register FILE *fp; { register int i, j; - int code; + int code, val; /* determine scanline type */ - if (len < MINELEN) + if (len < MINELEN | len > MAXELEN) return(oldreadcolrs(scanline, len, fp)); if ((i = getc(fp)) == EOF) return(-1); @@ -123,9 +125,10 @@ register FILE *fp; if ((code = getc(fp)) == EOF) return(-1); if (code > 128) { /* run */ - scanline[j++][i] = getc(fp); - for (code &= 127; --code; j++) - scanline[j][i] = scanline[j-1][i]; + code &= 127; + val = getc(fp); + while (code--) + scanline[j++][i] = val; } else /* non-run */ while (code--) scanline[j++][i] = getc(fp); @@ -226,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; @@ -239,7 +241,7 @@ double r, g, b; return; } - d = frexp(d, &e) * 256.0 / d; + d = frexp(d, &e) * 255.9999 / d; clr[RED] = r * d; clr[GRN] = g * d;