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

Comparing ray/src/util/rcomb.c (file contents):
Revision 2.28 by greg, Fri Mar 28 00:06:36 2025 UTC vs.
Revision 2.35 by greg, Thu Oct 30 16:46:49 2025 UTC

# Line 21 | Line 21 | static const char RCSid[] = "$Id$";
21   #define M_PI    3.14159265358979323846
22   #endif
23  
24 #ifndef MAXCOMP
25 #define MAXCOMP         MAXCSAMP        /* #components we support */
26 #endif
27
24   /* Unary matrix operation(s) */
25   typedef struct {
26          double          cmat[MAXCOMP*MAXCOMP];  /* component transformation */
# Line 66 | Line 62 | int            inchild = -1;                   /* our child ID (-1: parent) */
62  
63   extern int      checksymbolic(ROPMAT *rop);
64  
65 + /* Split input matrices to allow for certain operations */
66   int
67   split_input(ROPMAT *rop)
68   {
# Line 198 | Line 195 | checksymbolic(ROPMAT *rop)
195          double          cf = 1;
196          int             i, j;
197                                          /* check suffix => reference file */
198 <        if (strchr(rop->preop.csym, '.') > rop->preop.csym)
198 >        if (strchr(rop->preop.csym, '.') != NULL)
199                  return(checkreffile(rop));
200  
201          if (nc < 3) {
# Line 304 | Line 301 | checksymbolic(ROPMAT *rop)
301          return(1);
302   }
303  
304 + /* Set up color transform for matrix */
305   int
306   get_component_xfm(ROPMAT *rop)
307   {
# Line 387 | Line 385 | get_component_xfm(ROPMAT *rop)
385          return(1);
386   }
387  
388 + /* Apply the given color transform and/or scaling operation */
389   int
390   apply_op(RMATRIX *dst, const RMATRIX *src, const RUNARYOP *ro)
391   {
# Line 406 | Line 405 | apply_op(RMATRIX *dst, const RMATRIX *src, const RUNAR
405          return(1);
406   }
407  
408 + /* Open the associated input file and load/check header */
409   int
410   open_input(ROPMAT *rop)
411   {
# Line 419 | Line 419 | open_input(ROPMAT *rop)
419                  rop->infp = popen(rop->inspec+1, "r");
420          else
421                  rop->infp = fopen(rop->inspec, "rb");
422 <
422 >        
423 >        if (!rop->infp) {
424 >                fprintf(stderr, "Cannot open for reading: %s\n",
425 >                                rop->inspec);
426 >                return(0);
427 >        }
428          if (!rmx_load_header(&rop->imx, rop->infp)) {
429                  fprintf(stderr, "Bad header from: %s\n", rop->inspec);
430                  return(0);
# Line 477 | Line 482 | l_chanin(char *nam)
482          return(mop[mi].rmp->mtx[cur_col*in_ncomp + chan]);
483   }
484  
485 + /* Set up our operations and check consistency */
486   int
487   initialize(RMATRIX *imp)
488   {
# Line 524 | Line 530 | initialize(RMATRIX *imp)
530          return(1);
531   }
532  
533 + /* Copy input header information to output header, indented */
534   void
535   output_headinfo(FILE *fp)
536   {
# Line 547 | Line 554 | output_headinfo(FILE *fp)
554          }
555   }
556  
557 + /* Spawn the indicated number of children and return 1 in parent */
558   int
559   spawned_children(int np)
560   {
# Line 654 | Line 662 | memerror:
662          exit(1);
663   }
664  
665 + /* Run parental feeder loop */
666   int
667   parent_loop(void)
668   {
# Line 703 | Line 712 | parent_loop(void)
712          return(1);                              /* return success! */
713   }
714  
715 + /* Main operation loop, may be run in each child */
716   int
717   combine_input(void)
718   {
# Line 798 | Line 808 | multerror:
808          return(0);
809   }
810  
811 + /* Run output process loop when #processes > 1 */
812   int
813   output_loop(void)
814   {
# Line 837 | Line 848 | output_loop(void)
848          return(fflush(stdout) != EOF);
849   }
850  
851 + /* Check/convert floating-point arguments following this */
852   int
853   get_factors(double da[], int n, char *av[])
854   {
# Line 847 | Line 859 | get_factors(double da[], int n, char *av[])
859          return(ac);
860   }
861  
862 + /* Resize/reallocate the input array as requested */
863   void
864   resize_inparr(int n2alloc)
865   {
# Line 880 | Line 893 | main(int argc, char *argv[])
893          int             stdin_used = 0;
894          int             nproc = 1;
895          const char      *mcat_spec = NULL;
896 +        int             transpose_mcat = 0;
897          int             n2comp = 0;
898          uby8            comp_ndx[128];
899          int             i;
# Line 974 | Line 988 | main(int argc, char *argv[])
988                                  mop[nmats].preop.csym = NULL;
989                                  break;
990                          case 'm':
977                                mcat_last = 1;
991                                  if (!n) goto userr;
992 +                                mcat_last = 1;
993 +                                transpose_mcat = (argv[i][2] == 't');
994                                  if (argv[++i][0] == '-' && !argv[i][1]) {
995                                          if (stdin_used++) goto stdin_error;
996                                          mcat_spec = stdin_name;
# Line 994 | Line 1009 | main(int argc, char *argv[])
1009          }
1010          resize_inparr(nmats+1);         /* extra matrix at end for result */
1011          mop[nmats].inspec = "trailing_ops";
1012 <                                        /* load final concatenation matrix */
1013 <        if (mcat_spec && !(mcat = rmx_load(mcat_spec, RMPnone))) {
1014 <                fprintf(stderr, "%s: error loading concatenation matrix: %s\n",
1015 <                                argv[0], mcat_spec);
1016 <                return(1);
1012 >
1013 >        if (mcat_spec) {                /* load final concatenation matrix? */
1014 >                mcat = rmx_load(mcat_spec);
1015 >                if (!mcat) {
1016 >                        fprintf(stderr, "%s: error loading concatenation matrix: %s\n",
1017 >                                        argv[0], mcat_spec);
1018 >                        return(1);
1019 >                }
1020 >                if (transpose_mcat && !rmx_transpose(mcat)) {
1021 >                        fprintf(stderr, "%s: error transposing concatenation matrix: %s\n",
1022 >                                        argv[0], mcat_spec);
1023 >                        return(1);
1024 >                }
1025          }
1026                                          /* get/check inputs, set constants */
1027          if (!initialize(&mop[nmats].imx))
# Line 1038 | Line 1061 | main(int argc, char *argv[])
1061                          return(1);
1062                  mop[nmats].rmp->ncols = mcat->ncols;
1063          }
1064 + #if DTrmx_native==DTfloat
1065 +        if (outfmt == DTdouble)
1066 +                fprintf(stderr, "%s: warning - writing float result as double\n", argv[0]);
1067 + #endif
1068          newheader("RADIANCE", stdout);  /* write output header */
1069          if (echoheader)
1070                  output_headinfo(stdout);

Diff Legend

Removed lines
+ Added lines
< Changed lines (old)
> Changed lines (new)