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]); |
233 |
|
cmon[RED] = cmon[GRN] = cmon[BLU] = lum; |
234 |
|
} |
235 |
|
d = tms->clf[RED]*cmon[RED]/lum; |
236 |
< |
cs[3*i ] = d>=.999 ? 255 : |
227 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
236 |
> |
cs[3*i ] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
237 |
|
d = tms->clf[GRN]*cmon[GRN]/lum; |
238 |
< |
cs[3*i+1] = d>=.999 ? 255 : |
230 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
238 |
> |
cs[3*i+1] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
239 |
|
d = tms->clf[BLU]*cmon[BLU]/lum; |
240 |
< |
cs[3*i+2] = d>=.999 ? 255 : |
233 |
< |
(int)(256.*pow(d, 1./tms->mongam)); |
240 |
> |
cs[3*i+2] = d>=.999 ? 255 : gamtab[(int)(1024.*d)]; |
241 |
|
} |
242 |
|
returnOK; |
243 |
+ |
} |
244 |
+ |
|
245 |
+ |
|
246 |
+ |
TMbright |
247 |
+ |
tmCvLuminance( /* convert a single luminance */ |
248 |
+ |
double lum |
249 |
+ |
) |
250 |
+ |
{ |
251 |
+ |
double d; |
252 |
+ |
|
253 |
+ |
if (lum <= TM_NOLUM) |
254 |
+ |
return(TM_NOBRT); |
255 |
+ |
d = TM_BRTSCALE*log(lum); |
256 |
+ |
if (d > 0.) |
257 |
+ |
return((TMbright)(d+.5)); |
258 |
+ |
return((TMbright)(d-.5)); |
259 |
|
} |
260 |
|
|
261 |
|
|