--- ray/src/cv/mgflib/context.c 1994/07/01 18:06:56 1.13 +++ ray/src/cv/mgflib/context.c 1994/09/02 16:04:19 1.16 @@ -67,6 +67,7 @@ register char **av; lp = lu_find(&clr_tab, av[1]); /* lookup context */ if (lp == NULL) return(MG_EMEM); + c_ccname = lp->key; c_ccolor = (C_COLOR *)lp->data; if (ac == 2) { /* reestablish previous context */ if (c_ccolor == NULL) @@ -83,10 +84,10 @@ register char **av; lp->data = (char *)malloc(sizeof(C_COLOR)); if (lp->data == NULL) return(MG_EMEM); + c_ccname = lp->key; c_ccolor = (C_COLOR *)lp->data; c_ccolor->clock = 0; } - c_ccname = lp->key; i = c_ccolor->clock; if (ac == 3) { /* use default template */ *c_ccolor = c_dfcolor; @@ -176,6 +177,7 @@ register char **av; lp = lu_find(&mat_tab, av[1]); /* lookup context */ if (lp == NULL) return(MG_EMEM); + c_cmname = lp->key; c_cmaterial = (C_MATERIAL *)lp->data; if (ac == 2) { /* reestablish previous context */ if (c_cmaterial == NULL) @@ -192,10 +194,10 @@ register char **av; lp->data = (char *)malloc(sizeof(C_MATERIAL)); if (lp->data == NULL) return(MG_EMEM); + c_cmname = lp->key; c_cmaterial = (C_MATERIAL *)lp->data; c_cmaterial->clock = 0; } - c_cmname = lp->key; i = c_cmaterial->clock; if (ac == 3) { /* use default template */ *c_cmaterial = c_dfmaterial; @@ -309,6 +311,7 @@ register char **av; lp = lu_find(&vtx_tab, av[1]); /* lookup context */ if (lp == NULL) return(MG_EMEM); + c_cvname = lp->key; c_cvertex = (C_VERTEX *)lp->data; if (ac == 2) { /* reestablish previous context */ if (c_cvertex == NULL) @@ -325,9 +328,9 @@ register char **av; lp->data = (char *)malloc(sizeof(C_VERTEX)); if (lp->data == NULL) return(MG_EMEM); + c_cvname = lp->key; c_cvertex = (C_VERTEX *)lp->data; } - c_cvname = lp->key; i = c_cvertex->clock; if (ac == 3) { /* use default template */ *c_cvertex = c_dfvertex; @@ -373,12 +376,15 @@ c_clearall() /* empty context tables */ { c_uncolor = c_dfcolor; c_ccolor = &c_uncolor; + c_ccname = NULL; lu_done(&clr_tab); c_unmaterial = c_dfmaterial; c_cmaterial = &c_unmaterial; + c_cmname = NULL; lu_done(&mat_tab); c_unvertex = c_dfvertex; c_cvertex = &c_unvertex; + c_cvname = NULL; lu_done(&vtx_tab); } @@ -439,11 +445,12 @@ int fl; double x, y, z; register int i; - if (clr->flags & fl) /* already done */ + fl &= ~clr->flags; /* ignore what's done */ + if (!fl) /* everything's done! */ return; if (!(clr->flags & (C_CSXY|C_CSSPEC))) /* nothing set! */ *clr = c_dfcolor; - else if (fl & C_CSXY) { /* cspec -> cxy */ + if (fl & C_CSXY) { /* cspec -> cxy */ x = y = z = 0.; for (i = 0; i < C_CNSS; i++) { x += cie_xf.ssamp[i] * clr->ssamp[i]; @@ -454,7 +461,7 @@ int fl; clr->cx = x / z; clr->cy = y / z; clr->flags |= C_CSXY; - } else { /* cxy -> cspec */ + } else if (fl & C_CSSPEC) { /* cxy -> cspec */ z = (cie_xf.ssum + cie_yf.ssum + cie_zf.ssum) / 3.; x = clr->cx * z / cie_xf.ssum; y = clr->cy * z / cie_yf.ssum; @@ -467,6 +474,18 @@ int fl; z * cie_zf.ssamp[i] ; clr->flags |= C_CSSPEC; } + if (fl & C_CSEFF) { /* compute efficacy */ + if (clr->flags & C_CDSPEC) { /* from spectrum */ + y = 0.; + for (i = 0; i < C_CNSS; i++) + y += cie_yf.ssamp[i] * clr->ssamp[i]; + clr->eff = C_CLPWM * y / clr->ssum; + } else /* clr->flags & C_CDXY */ { /* from (x,y) */ + clr->eff = clr->cx*cie_xf.eff + clr->cy*cie_yf.eff + + (1. - clr->cx - clr->cy)*cie_zf.eff; + } + clr->flags |= C_CSEFF; + } } @@ -537,10 +556,10 @@ double w1, w2; register int i; if ((c1->flags|c2->flags) & C_CDSPEC) { /* spectral mixing */ - c_ccvt(c1, C_CSSPEC); - c_ccvt(c2, C_CSSPEC); - w1 /= (double)c1->ssum; - w2 /= (double)c2->ssum; + c_ccvt(c1, C_CSSPEC|C_CSEFF); + c_ccvt(c2, C_CSSPEC|C_CSEFF); + w1 /= c1->eff*c1->ssum; + w2 /= c1->eff*c2->ssum; scale = 0.; for (i = 0; i < C_CNSS; i++) { cmix[i] = w1*c1->ssamp[i] + w2*c2->ssamp[i];