--- ray/src/common/color.c 1989/05/11 22:15:57 1.4 +++ ray/src/common/color.c 1990/08/30 09:13:21 1.11 @@ -45,7 +45,7 @@ static BYTE chroma[3][NINC] = { }; -spec_rgb(col, s, e) /* comput RGB color from spectral range */ +spec_rgb(col, s, e) /* compute RGB color from spectral range */ COLOR col; int s, e; { @@ -107,6 +107,52 @@ register COLOR rgbcolor, ciecolor; #endif +fputresolu(ord, xres, yres, fp) /* put x and y resolution */ +register int ord; +int xres, yres; +FILE *fp; +{ + if (ord&YMAJOR) + fprintf(fp, "%cY %d %cX %d\n", + ord&YDECR ? '-' : '+', yres, + ord&XDECR ? '-' : '+', xres); + else + fprintf(fp, "%cX %d %cY %d\n", + ord&XDECR ? '-' : '+', xres, + ord&YDECR ? '-' : '+', yres); +} + + +fgetresolu(xrp, yrp, fp) /* get x and y resolution */ +int *xrp, *yrp; +FILE *fp; +{ + char buf[64], *xndx, *yndx; + register char *cp; + register int ord; + + if (fgets(buf, sizeof(buf), fp) == NULL) + return(-1); + xndx = yndx = NULL; + for (cp = buf+1; *cp; cp++) + if (*cp == 'X') + xndx = cp; + else if (*cp == 'Y') + yndx = cp; + if (xndx == NULL || yndx == NULL) + return(-1); + ord = 0; + if (xndx > yndx) ord |= YMAJOR; + if (xndx[-1] == '-') ord |= XDECR; + if (yndx[-1] == '-') ord |= YDECR; + if ((*xrp = atoi(xndx+1)) <= 0) + return(-1); + if ((*yrp = atoi(yndx+1)) <= 0) + return(-1); + return(ord); +} + + fwritecolrs(scanline, len, fp) /* write out a colr scanline */ register COLR *scanline; int len; @@ -308,7 +354,7 @@ colr_color(col, clr) /* convert short to float color register COLOR col; register COLR clr; { - double ldexp(), f; + double f; if (clr[EXP] == 0) col[RED] = col[GRN] = col[BLU] = 0.0; @@ -318,4 +364,60 @@ register COLR clr; col[GRN] = (clr[GRN] + 0.5)*f; col[BLU] = (clr[BLU] + 0.5)*f; } +} + + +normcolrs(scan, len, adjust) /* normalize a scanline of colrs */ +register COLR *scan; +int len; +int adjust; +{ + register int c; + register int shift; + + while (len-- > 0) { + shift = scan[0][EXP] + adjust - COLXS; + if (shift > 0) { + if (shift > 8) { + scan[0][RED] = + scan[0][GRN] = + scan[0][BLU] = 255; + } else { + shift--; + c = (scan[0][RED]<<1 | 1) << shift; + scan[0][RED] = c > 255 ? 255 : c; + c = (scan[0][GRN]<<1 | 1) << shift; + scan[0][GRN] = c > 255 ? 255 : c; + c = (scan[0][BLU]<<1 | 1) << shift; + scan[0][BLU] = c > 255 ? 255 : c; + } + } else if (shift < 0) { + if (shift < -8) { + scan[0][RED] = + scan[0][GRN] = + scan[0][BLU] = 0; + } else { + shift = -1-shift; + scan[0][RED] = ((scan[0][RED]>>shift)+1)>>1; + scan[0][GRN] = ((scan[0][GRN]>>shift)+1)>>1; + scan[0][BLU] = ((scan[0][BLU]>>shift)+1)>>1; + } + } + scan[0][EXP] = COLXS - adjust; + scan++; + } +} + + +bigdiff(c1, c2, md) /* c1 delta c2 > md? */ +register COLOR c1, c2; +double md; +{ + register int i; + + for (i = 0; i < 3; i++) + if (colval(c1,i)-colval(c2,i) > md*colval(c2,i) || + colval(c2,i)-colval(c1,i) > md*colval(c1,i)) + return(1); + return(0); }