68 |
|
tmnew->inpsf = WHTEFFICACY; |
69 |
|
tmnew->cmat[0][1] = tmnew->cmat[0][2] = tmnew->cmat[1][0] = |
70 |
|
tmnew->cmat[1][2] = tmnew->cmat[2][0] = tmnew->cmat[2][1] = 0.; |
71 |
+ |
tmnew->inpdat = NULL; |
72 |
|
tmnew->hbrmin = 10; tmnew->hbrmax = -10; |
73 |
|
tmnew->histo = NULL; |
74 |
|
tmnew->mbrmin = 10; tmnew->mbrmax = -10; |
87 |
|
tmSetSpace( /* set input color space for conversions */ |
88 |
|
TMstruct *tms, |
89 |
|
RGBPRIMP pri, |
90 |
< |
double sf |
90 |
> |
double sf, |
91 |
> |
MEM_PTR dat |
92 |
|
) |
93 |
|
{ |
94 |
|
static const char funcName[] = "tmSetSpace"; |
99 |
|
if (sf <= 1e-12) |
100 |
|
returnErr(TM_E_ILLEGAL); |
101 |
|
/* check if no change */ |
102 |
< |
if (pri == tms->inppri && FEQ(sf, tms->inpsf)) |
102 |
> |
if (pri == tms->inppri && FEQ(sf, tms->inpsf) && dat == tms->inpdat) |
103 |
|
returnOK; |
104 |
|
tms->inppri = pri; /* let's set it */ |
105 |
|
tms->inpsf = sf; |
106 |
+ |
tms->inpdat = dat; |
107 |
|
|
108 |
|
if (tms->flags & TM_F_BW) { /* color doesn't matter */ |
109 |
|
tms->monpri = tms->inppri; /* eliminate xform */ |
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 : |
227 |
< |
(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 : |
230 |
< |
(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 : |
233 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
245 |
> |
cs[3*i+2] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
246 |
|
} |
247 |
|
returnOK; |
248 |
+ |
} |
249 |
+ |
|
250 |
+ |
|
251 |
+ |
TMbright |
252 |
+ |
tmCvLuminance( /* convert a single luminance */ |
253 |
+ |
double lum |
254 |
+ |
) |
255 |
+ |
{ |
256 |
+ |
double d; |
257 |
+ |
|
258 |
+ |
if (lum <= TM_NOLUM) |
259 |
+ |
return(TM_NOBRT); |
260 |
+ |
d = TM_BRTSCALE*log(lum); |
261 |
+ |
if (d > 0.) |
262 |
+ |
return((TMbright)(d+.5)); |
263 |
+ |
return((TMbright)(d-.5)); |
264 |
|
} |
265 |
|
|
266 |
|
|