171 |
|
{ |
172 |
|
static const char funcName[] = "tmCvColors"; |
173 |
|
static COLOR csmall = {.5*MINLUM, .5*MINLUM, .5*MINLUM}; |
174 |
+ |
static BYTE gamtab[1024]; |
175 |
+ |
static double curgam = .0; |
176 |
|
COLOR cmon; |
177 |
|
double lum, slum; |
178 |
|
double d; |
182 |
|
returnErr(TM_E_TMINVAL); |
183 |
|
if ((ls == NULL) | (scan == NULL) | (len < 0)) |
184 |
|
returnErr(TM_E_ILLEGAL); |
185 |
+ |
if (cs != TM_NOCHROM && fabs(tms->mongam - curgam) > .02) { |
186 |
+ |
curgam = tms->mongam; /* (re)build table */ |
187 |
+ |
for (i = 1024; i--; ) |
188 |
+ |
gamtab[i] = (int)(256.*pow((i+.5)/1024., 1./curgam)); |
189 |
+ |
} |
190 |
|
for (i = len; i--; ) { |
191 |
|
if (tmNeedMatrix(tms)) { /* get monitor RGB */ |
192 |
|
colortrans(cmon, tms->cmat, scan[i]); |
195 |
|
cmon[GRN] = tms->inpsf*scan[i][GRN]; |
196 |
|
cmon[BLU] = tms->inpsf*scan[i][BLU]; |
197 |
|
} |
198 |
+ |
#ifdef isnan |
199 |
+ |
if (isnan(cmon[RED]) || isinf(cmon[RED])) cmon[RED] = .0f; |
200 |
+ |
if (isnan(cmon[GRN]) || isinf(cmon[GRN])) cmon[GRN] = .0f; |
201 |
+ |
if (isnan(cmon[BLU]) || isinf(cmon[BLU])) cmon[BLU] = .0f; |
202 |
+ |
#endif |
203 |
|
/* world luminance */ |
204 |
|
lum = tms->clf[RED]*cmon[RED] + |
205 |
|
tms->clf[GRN]*cmon[GRN] + |
238 |
|
cmon[RED] = cmon[GRN] = cmon[BLU] = lum; |
239 |
|
} |
240 |
|
d = tms->clf[RED]*cmon[RED]/lum; |
241 |
< |
cs[3*i ] = d>=.999 ? 255 : |
230 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
241 |
> |
cs[3*i ] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
242 |
|
d = tms->clf[GRN]*cmon[GRN]/lum; |
243 |
< |
cs[3*i+1] = d>=.999 ? 255 : |
233 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
243 |
> |
cs[3*i+1] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
244 |
|
d = tms->clf[BLU]*cmon[BLU]/lum; |
245 |
< |
cs[3*i+2] = d>=.999 ? 255 : |
236 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
245 |
> |
cs[3*i+2] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
246 |
|
} |
247 |
|
returnOK; |
248 |
|
} |