ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/util/rcomb.c
(Generate patch)

Comparing ray/src/util/rcomb.c (file contents):
Revision 2.1 by greg, Tue Dec 12 16:31:45 2023 UTC vs.
Revision 2.5 by greg, Tue Dec 19 20:38:38 2023 UTC

# Line 45 | Line 45 | int            nmats = 0;                      /* number of actual inputs */
45   RMATRIX         *mcat = NULL;                   /* final concatenation */
46   int             mcat_last = 0;                  /* goes after trailing ops? */
47  
48 < int             in_nrows;                       /* input row count */
49 < #define in_ncols        (mop[0].rmp->ncols)     /* input column count */
48 > int             in_nrows;                       /* number of input rows (or 0) */
49 > #define in_ncols        (mop[0].rmp->ncols)     /* number of input columns */
50   #define in_ncomp        (mop[0].rmp->ncomp)     /* input #components */
51  
52   extern int      nowarn;                         /* turn off warnings? */
# Line 186 | Line 186 | checksymbolic(ROPMAT *rop)
186   {
187          const int       nc = rop->imx.ncomp;
188          const int       dt = rop->imx.dtype;
189 +        double          cf = 1;
190          int             i, j;
191                                          /* check suffix => reference file */
192          if (strchr(rop->preop.csym, '.') > rop->preop.csym)
# Line 206 | Line 207 | checksymbolic(ROPMAT *rop)
207                  int     comp = 0;
208                  switch (rop->preop.csym[j]) {
209                  case 'B':
210 +                case 'b':
211                          ++comp;
212                          /* fall through */
213                  case 'G':
214 +                case 'g':
215                          ++comp;
216                          /* fall through */
217                  case 'R':
218 +                case 'r':
219 +                        if (rop->preop.csym[j] <= 'Z')
220 +                                cf = 1./WHTEFFICACY;
221                          if (dt == DTxyze) {
222                                  for (i = 3; i--; )
223 <                                        rop->preop.cmat[j*nc+i] = 1./WHTEFFICACY *
218 <                                                        xyz2rgbmat[comp][i];
223 >                                        rop->preop.cmat[j*nc+i] = cf*xyz2rgbmat[comp][i];
224                          } else if (nc == 3)
225                                  rop->preop.cmat[j*nc+comp] = 1.;
226                          else
227                                  rgbrow(rop, j, comp);
228                          break;
229                  case 'Z':
230 +                case 'z':
231                          ++comp;
232                          /* fall through */
233                  case 'Y':
234 +                case 'y':
235                          ++comp;
236                          /* fall through */
237                  case 'X':
238 +                case 'x':
239 +                        if ((rop->preop.csym[j] <= 'Z') & (dt != DTxyze))
240 +                                cf = WHTEFFICACY;
241                          if (dt == DTxyze) {
242                                  rop->preop.cmat[j*nc+comp] = 1.;
243                          } else if (nc == 3) {
# Line 239 | Line 249 | checksymbolic(ROPMAT *rop)
249                          else
250                                  xyzrow(rop, j, comp);
251  
252 <                        for (i = nc*(dt != DTxyze); i--; )
253 <                                rop->preop.cmat[j*nc+i] *= WHTEFFICACY;
252 >                        for (i = nc*(cf != 1); i--; )
253 >                                rop->preop.cmat[j*nc+i] *= cf;
254                          break;
255                  case 'S':               /* scotopic (il)luminance */
256 +                        cf = WHTSCOTOPIC;
257 +                        /* fall through */
258 +                case 's':
259                          sensrow(rop, j, scolor2scotopic);
260 <                        for (i = nc; i--; )
261 <                                rop->preop.cmat[j*nc+i] *= WHTSCOTOPIC;
260 >                        for (i = nc*(cf != 1); i--; )
261 >                                rop->preop.cmat[j*nc+i] *= cf;
262                          break;
263                  case 'M':               /* melanopic (il)luminance */
264 +                        cf = WHTMELANOPIC;
265 +                        /* fall through */
266 +                case 'm':
267                          sensrow(rop, j, scolor2melanopic);
268 <                        for (i = nc; i--; )
269 <                                rop->preop.cmat[j*nc+i] *= WHTMELANOPIC;
268 >                        for (i = nc*(cf != 1); i--; )
269 >                                rop->preop.cmat[j*nc+i] *= cf;
270                          break;
271                  case 'A':               /* average component */
272 +                case 'a':
273                          for (i = nc; i--; )
274                                  rop->preop.cmat[j*nc+i] = 1./(double)nc;
275                          break;
# Line 267 | Line 284 | checksymbolic(ROPMAT *rop)
284          memcpy(rop->rmp->wlpart, WLPART, sizeof(rop->rmp->wlpart));
285          rop->rmp->ncomp = rop->preop.clen / nc;
286                                          /* decide on output type */
287 <        if (!strcmp(rop->preop.csym, "XYZ")) {
287 >        if (!strcasecmp(rop->preop.csym, "XYZ")) {
288                  if (dt <= DTspec)
289                          rop->rmp->dtype = DTxyze;
290 <        } else if (!strcmp(rop->preop.csym, "RGB")) {
290 >        } else if (!strcasecmp(rop->preop.csym, "RGB")) {
291                  if (dt <= DTspec)
292                          rop->rmp->dtype = DTrgbe;
293          } else if (rop->rmp->dtype == DTspec)
# Line 469 | Line 486 | initialize(RMATRIX *imp)
486                          fprintf(stderr, "%s: warning - data type mismatch\n",
487                                          mop[i].inspec);
488                  if (!i) {
472                        imp->nrows = in_nrows = mop[0].rmp->nrows;
489                          imp->ncols = mop[0].rmp->ncols;
490                          imp->ncomp = mop[0].rmp->ncomp;
491                          memcpy(imp->wlpart, mop[0].rmp->wlpart, sizeof(imp->wlpart));
492 <                } else if ((mop[i].rmp->nrows != imp->nrows) |
493 <                                (mop[i].rmp->ncols != imp->ncols) |
494 <                                (mop[i].rmp->ncomp != imp->ncomp)) {
492 >                } else if ((mop[i].rmp->ncols != imp->ncols) |
493 >                                (mop[i].rmp->ncomp != imp->ncomp) |
494 >                                ((in_nrows > 0) & (mop[i].rmp->nrows > 0) &
495 >                                        (mop[i].rmp->nrows != in_nrows))) {
496                          fprintf(stderr, "%s: mismatch in size or #components\n",
497                                          mop[i].inspec);
498                          return(0);
499                  }                       /* XXX should check wlpart? */
500 +                if (in_nrows <= 0)
501 +                        in_nrows = imp->nrows = mop[i].rmp->nrows;
502          }                               /* set up .cal environment */
503          esupport |= E_VARIABLE|E_FUNCTION|E_RCONST;
504          esupport &= ~(E_OUTCHAN|E_INCHAN);
# Line 569 | Line 588 | combine_input(ROPMAT *res, FILE *fout)
588          } else                          /* save a little time */
589                  set_r = set_c = 0;
590                                          /* read/process row-by-row */
591 <        for (cur_row = 0; cur_row < in_nrows; cur_row++) {
591 >        for (cur_row = 0; (in_nrows <= 0) | (cur_row < in_nrows); cur_row++) {
592              RMATRIX     *mres = NULL;
593              for (i = 0; i < nmats; i++) {
594                  if (!rmx_load_row(mop[i].imx.mtx, &mop[i].imx, mop[i].infp)) {
595 +                        if (cur_row > in_nrows) /* unknown #input rows? */
596 +                                goto loop_exit;
597                          fprintf(stderr, "%s: read error at row %d\n",
598                                          mop[i].inspec, cur_row);
599                          return(0);
# Line 620 | Line 641 | combine_input(ROPMAT *res, FILE *fout)
641                                  res->rmp->ncols, res->rmp->dtype, fout))
642                  return(0);
643          }
644 + loop_exit:
645   #if 0           /* we're about to exit, so who cares? */
646          rmx_free(tmp);                  /* clean up */
647          rmx_reset(res->rmp);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines