| 445 |
|
double x, y, z; |
| 446 |
|
register int i; |
| 447 |
|
|
| 448 |
< |
if (clr->flags & fl) /* already done */ |
| 448 |
> |
fl &= ~clr->flags; /* ignore what's done */ |
| 449 |
> |
if (!fl) /* everything's done! */ |
| 450 |
|
return; |
| 451 |
|
if (!(clr->flags & (C_CSXY|C_CSSPEC))) /* nothing set! */ |
| 452 |
|
*clr = c_dfcolor; |
| 453 |
< |
else if (fl & C_CSXY) { /* cspec -> cxy */ |
| 453 |
> |
if (fl & C_CSXY) { /* cspec -> cxy */ |
| 454 |
|
x = y = z = 0.; |
| 455 |
|
for (i = 0; i < C_CNSS; i++) { |
| 456 |
|
x += cie_xf.ssamp[i] * clr->ssamp[i]; |
| 461 |
|
clr->cx = x / z; |
| 462 |
|
clr->cy = y / z; |
| 463 |
|
clr->flags |= C_CSXY; |
| 464 |
< |
} else { /* cxy -> cspec */ |
| 464 |
> |
} else if (fl & C_CSSPEC) { /* cxy -> cspec */ |
| 465 |
|
z = (cie_xf.ssum + cie_yf.ssum + cie_zf.ssum) / 3.; |
| 466 |
|
x = clr->cx * z / cie_xf.ssum; |
| 467 |
|
y = clr->cy * z / cie_yf.ssum; |
| 474 |
|
z * cie_zf.ssamp[i] ; |
| 475 |
|
clr->flags |= C_CSSPEC; |
| 476 |
|
} |
| 477 |
+ |
if (fl & C_CSEFF) { /* compute efficacy */ |
| 478 |
+ |
if (clr->flags & C_CDSPEC) { /* from spectrum */ |
| 479 |
+ |
y = 0.; |
| 480 |
+ |
for (i = 0; i < C_CNSS; i++) |
| 481 |
+ |
y += cie_yf.ssamp[i] * clr->ssamp[i]; |
| 482 |
+ |
clr->eff = C_CLPWM * y / clr->ssum; |
| 483 |
+ |
} else /* clr->flags & C_CDXY */ { /* from (x,y) */ |
| 484 |
+ |
clr->eff = clr->cx*cie_xf.eff + clr->cy*cie_yf.eff + |
| 485 |
+ |
(1. - clr->cx - clr->cy)*cie_zf.eff; |
| 486 |
+ |
} |
| 487 |
+ |
clr->flags |= C_CSEFF; |
| 488 |
+ |
} |
| 489 |
|
} |
| 490 |
|
|
| 491 |
|
|
| 556 |
|
register int i; |
| 557 |
|
|
| 558 |
|
if ((c1->flags|c2->flags) & C_CDSPEC) { /* spectral mixing */ |
| 559 |
< |
c_ccvt(c1, C_CSSPEC); |
| 560 |
< |
c_ccvt(c2, C_CSSPEC); |
| 561 |
< |
w1 /= (double)c1->ssum; |
| 562 |
< |
w2 /= (double)c2->ssum; |
| 559 |
> |
c_ccvt(c1, C_CSSPEC|C_CSEFF); |
| 560 |
> |
c_ccvt(c2, C_CSSPEC|C_CSEFF); |
| 561 |
> |
w1 /= c1->eff*c1->ssum; |
| 562 |
> |
w2 /= c1->eff*c2->ssum; |
| 563 |
|
scale = 0.; |
| 564 |
|
for (i = 0; i < C_CNSS; i++) { |
| 565 |
|
cmix[i] = w1*c1->ssamp[i] + w2*c2->ssamp[i]; |