| 60 |
|
{ |
| 61 |
|
int s = 0; |
| 62 |
|
|
| 63 |
+ |
if (!i) |
| 64 |
+ |
return(-1); |
| 65 |
|
while (!(i & 0x8000)) { |
| 66 |
|
i <<= 1; |
| 67 |
|
++s; |
| 83 |
|
|
| 84 |
|
/* convert at 48-bit tristimulus value to a COLOR */ |
| 85 |
|
static void |
| 86 |
< |
rgb48_color(COLOR col, uint16 clr48[3]) |
| 86 |
> |
rgb48_color(COLOR col, uint16 clr48[3], double gv) |
| 87 |
|
{ |
| 88 |
|
int nshft; |
| 89 |
|
|
| 90 |
< |
if (cur_gam == 1.) { /* linear case */ |
| 90 |
> |
if (gv == 1.) { /* linear case */ |
| 91 |
|
col[0] = clr48[0]*(1./(1L<<16)); |
| 92 |
|
col[1] = clr48[1]*(1./(1L<<16)); |
| 93 |
|
col[2] = clr48[2]*(1./(1L<<16)); |
| 94 |
|
return; |
| 95 |
|
} |
| 96 |
|
/* non-linear case */ |
| 97 |
+ |
/* XXX Uncomment if routine is made public |
| 98 |
+ |
if (gv != cur_gam) |
| 99 |
+ |
mkGamTable(gv); |
| 100 |
+ |
*/ |
| 101 |
|
nshft = normShift48(clr48); |
| 102 |
+ |
if (nshft < 0) { |
| 103 |
+ |
col[0] = col[1] = col[2] = .0f; |
| 104 |
+ |
return; |
| 105 |
+ |
} |
| 106 |
|
col[0] = gamtab[imultpow2(clr48[0],GAMTABBITS-16+nshft)] * |
| 107 |
|
gammul[nshft]; |
| 108 |
|
col[1] = gamtab[imultpow2(clr48[1],GAMTABBITS-16+nshft)] * |
| 124 |
|
|
| 125 |
|
if (tmTop == NULL) |
| 126 |
|
returnErr(TM_E_TMINVAL); |
| 127 |
< |
if (ls == NULL | scan == NULL | len < 0 | gv <= MINGAM) |
| 127 |
> |
if (ls == NULL | scan == NULL | len < 0) |
| 128 |
|
returnErr(TM_E_ILLEGAL); |
| 129 |
+ |
if (gv <= 0.) |
| 130 |
+ |
gv = DEFGAM; |
| 131 |
|
/* initialize log table */ |
| 132 |
|
if (logtab[0] == 0.f) |
| 133 |
|
mkLogTable(); |
| 136 |
|
/* convert 16-bit grays */ |
| 137 |
|
while (len--) { |
| 138 |
|
nshft = normShift16(*scan); |
| 139 |
+ |
if (nshft < 0) { /* bogus value */ |
| 140 |
+ |
*ls++ = TM_NOBRT; |
| 141 |
+ |
scan++; |
| 142 |
+ |
continue; |
| 143 |
+ |
} |
| 144 |
|
d = logtab[ imultpow2(*scan,LOGTABBITS-15+nshft) & |
| 145 |
|
((1L<<LOGTABBITS)-1) ] |
| 146 |
|
- M_LN2*nshft; |
| 162 |
|
|
| 163 |
|
if (tmTop == NULL) |
| 164 |
|
returnErr(TM_E_TMINVAL); |
| 165 |
< |
if (ls == NULL | scan == NULL | len < 0 | gv <= MINGAM) |
| 165 |
> |
if (ls == NULL | scan == NULL | len < 0) |
| 166 |
|
returnErr(TM_E_ILLEGAL); |
| 167 |
+ |
if (gv <= 0.) |
| 168 |
+ |
gv = DEFGAM; |
| 169 |
|
/* update gamma table */ |
| 170 |
|
if (gv != 1. & gv != cur_gam) |
| 171 |
|
mkGamTable(gv); |
| 179 |
|
if (newscan == NULL) |
| 180 |
|
returnErr(TM_E_NOMEM); |
| 181 |
|
for (i = len; i--; ) |
| 182 |
< |
rgb48_color(newscan[i], scan[i]); |
| 182 |
> |
rgb48_color(newscan[i], scan[i], gv); |
| 183 |
|
return(tmCvColors(ls, cs, newscan, len)); |
| 184 |
|
} |
| 185 |
|
#if 0 |