--- ray/src/util/rmtxop.c 2023/12/02 00:42:21 2.27 +++ ray/src/util/rmtxop.c 2023/12/19 16:09:20 2.32 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmtxop.c,v 2.27 2023/12/02 00:42:21 greg Exp $"; +static const char RCSid[] = "$Id: rmtxop.c,v 2.32 2023/12/19 16:09:20 greg Exp $"; #endif /* * General component matrix operations. @@ -69,7 +69,7 @@ checkreffile(ROPMAT *rop) fclose(fp); curRF = rop->preop.csym; } - if ((refm.ncomp == 3) & (refm.dtype != DTspec)) { + if (refm.ncomp == 3) { rop->preop.csym = (refm.dtype == DTxyze) ? "XYZ" : "RGB"; return(checksymbolic(rop)); } @@ -103,6 +103,7 @@ checkreffile(ROPMAT *rop) for (j = refm.ncomp; j-- > 0; ) rop->preop.cmat[j*nc + i] = scresp[j]; } + memcpy(rop->mtx->wlpart, refm.wlpart, sizeof(rop->mtx->wlpart)); return(0); } @@ -161,6 +162,7 @@ checksymbolic(ROPMAT *rop) { const int nc = rop->mtx->ncomp; const int dt = rop->mtx->dtype; + double cf = 1; int i, j; /* check suffix => reference file */ if (strchr(rop->preop.csym, '.') > rop->preop.csym) @@ -181,28 +183,37 @@ checksymbolic(ROPMAT *rop) int comp = 0; switch (rop->preop.csym[j]) { case 'B': + case 'b': ++comp; /* fall through */ case 'G': + case 'g': ++comp; /* fall through */ case 'R': + case 'r': + if (rop->preop.csym[j] <= 'Z') + cf = 1./WHTEFFICACY; if (dt == DTxyze) { for (i = 3; i--; ) - rop->preop.cmat[j*nc+i] = 1./WHTEFFICACY * - xyz2rgbmat[comp][i]; + rop->preop.cmat[j*nc+i] = cf*xyz2rgbmat[comp][i]; } else if (nc == 3) rop->preop.cmat[j*nc+comp] = 1.; else rgbrow(rop, j, comp); break; case 'Z': + case 'z': ++comp; /* fall through */ case 'Y': + case 'y': ++comp; /* fall through */ case 'X': + case 'x': + if ((rop->preop.csym[j] <= 'Z') & (dt != DTxyze)) + cf = WHTEFFICACY; if (dt == DTxyze) { rop->preop.cmat[j*nc+comp] = 1.; } else if (nc == 3) { @@ -214,20 +225,27 @@ checksymbolic(ROPMAT *rop) else xyzrow(rop, j, comp); - for (i = nc*(dt != DTxyze); i--; ) - rop->preop.cmat[j*nc+i] *= WHTEFFICACY; + for (i = nc*(cf != 1); i--; ) + rop->preop.cmat[j*nc+i] *= cf; break; case 'S': /* scotopic (il)luminance */ + cf = WHTSCOTOPIC; + /* fall through */ + case 's': sensrow(rop, j, scolor2scotopic); - for (i = nc; i--; ) - rop->preop.cmat[j*nc+i] *= WHTSCOTOPIC; + for (i = nc*(cf != 1); i--; ) + rop->preop.cmat[j*nc+i] *= cf; break; case 'M': /* melanopic (il)luminance */ + cf = WHTMELANOPIC; + /* fall through */ + case 'm': sensrow(rop, j, scolor2melanopic); - for (i = nc; i--; ) - rop->preop.cmat[j*nc+i] *= WHTMELANOPIC; + for (i = nc*(cf != 1); i--; ) + rop->preop.cmat[j*nc+i] *= cf; break; case 'A': /* average component */ + case 'a': for (i = nc; i--; ) rop->preop.cmat[j*nc+i] = 1./(double)nc; break; @@ -238,14 +256,13 @@ checksymbolic(ROPMAT *rop) } } /* return recommended output type */ - if (!strcmp(rop->preop.csym, "XYZ")) { + if (!strcasecmp(rop->preop.csym, "XYZ")) { if (dt <= DTspec) return(DTxyze); - } else if (!strcmp(rop->preop.csym, "RGB")) { + } else if (!strcasecmp(rop->preop.csym, "RGB")) { if (dt <= DTspec) return(DTrgbe); - } - if ((nc > 3) & (dt <= DTspec)) + } else if (dt == DTspec) return(DTfloat); /* probably not actual spectrum */ return(0); } @@ -274,15 +291,16 @@ loadop(ROPMAT *rop) if (rop->preop.nsf == 1) { for (i = rop->preop.clen; i--; ) rop->preop.cmat[i] *= rop->preop.sca[0]; - } else if (rop->preop.nsf != rop->mtx->ncomp) { + } else if (rop->preop.nsf*rop->mtx->ncomp != rop->preop.clen) { fprintf(stderr, "%s: -s must have one or %d factors\n", - rop->inspec, rop->mtx->ncomp); + rop->inspec, + rop->preop.clen/rop->mtx->ncomp); goto failure; } else { - for (j = rop->preop.clen/rop->preop.nsf; j--; ) - for (i = rop->preop.nsf; i--; ) - rop->preop.cmat[j*rop->preop.nsf+i] *= - rop->preop.sca[i]; + for (i = rop->preop.nsf; i--; ) + for (j = rop->mtx->ncomp; j--; ) + rop->preop.cmat[i*rop->mtx->ncomp+j] + *= rop->preop.sca[i]; } } mres = rmx_transform(rop->mtx, rop->preop.clen/rop->mtx->ncomp,