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]; |