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

Comparing ray/src/util/rmtxop.c (file contents):
Revision 2.9 by schorsch, Sun Mar 6 01:13:18 2016 UTC vs.
Revision 2.12 by greg, Mon Aug 27 23:03:05 2018 UTC

# Line 7 | Line 7 | static const char RCSid[] = "$Id$";
7  
8   #include <stdio.h>
9   #include <stdlib.h>
10 + #include <errno.h>
11   #include "rtio.h"
12   #include "resolu.h"
13   #include "rmatrix.h"
14 + #include "platform.h"
15  
16   #define MAXCOMP         50              /* #components we support */
17  
# Line 28 | Line 30 | static void
30   op_default(ROPERAT *op)
31   {
32          memset(op, 0, sizeof(ROPERAT));
33 <        op->op = '*';
33 >        op->op = '.';
34   }
35  
36   static RMATRIX *
# Line 45 | Line 47 | operate(RMATRIX *mleft, ROPERAT *op, const char *fname
47                  fputs(": cannot load matrix\n", stderr);
48                  return(NULL);
49          }
48        if (op->transpose) {            /* transpose matrix? */
49                mtmp = rmx_transpose(mright);
50                if (mtmp == NULL) {
51                        fputs(fname, stderr);
52                        fputs(": transpose failed\n", stderr);
53                        rmx_free(mright);
54                        return(NULL);
55                }
56                if (verbose) {
57                        fputs(fname, stderr);
58                        fputs(": transposed rows and columns\n", stderr);
59                }
60                rmx_free(mright);
61                mright = mtmp;
62        }
50          if (op->nsf > 0) {              /* apply scalar(s) */
51                  if (op->clen > 0) {
52                          fputs("Options -s and -c are exclusive\n", stderr);
# Line 109 | Line 96 | operate(RMATRIX *mleft, ROPERAT *op, const char *fname
96                  rmx_free(mright);
97                  mright = mtmp;
98          }
99 +        if (op->transpose) {            /* transpose matrix? */
100 +                mtmp = rmx_transpose(mright);
101 +                if (mtmp == NULL) {
102 +                        fputs(fname, stderr);
103 +                        fputs(": transpose failed\n", stderr);
104 +                        rmx_free(mright);
105 +                        return(NULL);
106 +                }
107 +                if (verbose) {
108 +                        fputs(fname, stderr);
109 +                        fputs(": transposed rows and columns\n", stderr);
110 +                }
111 +                rmx_free(mright);
112 +                mright = mtmp;
113 +        }
114          if (mleft == NULL)              /* just one matrix */
115                  return(mright);
116 <        if (op->op == '*') {            /* concatenate */
116 >        if (op->op == '.') {            /* concatenate */
117                  RMATRIX *mres = rmx_multiply(mleft, mright);
118                  if (mres == NULL) {
119                          fputs(fname, stderr);
# Line 142 | Line 144 | operate(RMATRIX *mleft, ROPERAT *op, const char *fname
144                          fputs(": added in matrix\n", stderr);
145                  }
146                  rmx_free(mright);
147 +        } else if ((op->op == '*') | (op->op == '/')) {
148 +                const char *    tnam = (op->op == '/') ?
149 +                                        "division" : "multiplication";
150 +                errno = 0;
151 +                if (!rmx_elemult(mleft, mright, (op->op == '/'))) {
152 +                        fprintf(stderr, "%s: element-wise %s failed\n",
153 +                                        fname, tnam);
154 +                        rmx_free(mright);
155 +                        return(NULL);
156 +                }
157 +                if (errno)
158 +                        fprintf(stderr,
159 +                                "%s: warning - error during element-wise %s\n",
160 +                                        fname, tnam);
161 +                else if (verbose)
162 +                        fprintf(stderr, "%s: element-wise %s\n", fname, tnam);
163 +                rmx_free(mright);
164          } else {
165                  fprintf(stderr, "%s: unknown operation '%c'\n", fname, op->op);
166                  rmx_free(mright);
# Line 172 | Line 191 | main(int argc, char *argv[])
191          op_default(&op);
192                                          /* get options and arguments */
193          for (i = 1; i < argc; i++)
194 <                if (argv[i][0] == '+' && !argv[i][1]) {
195 <                        op.op = '+';
194 >                if (argv[i][0] && !argv[i][1] &&
195 >                                strchr("+*/", argv[i][0]) != NULL) {
196 >                        op.op = argv[i][0];
197                  } else if (argv[i][0] != '-' || !argv[i][1]) {
198                          char    *fname = NULL;  /* load matrix */
199                          if (argv[i][0] != '-')
# Line 233 | Line 253 | main(int argc, char *argv[])
253                                          /* write result to stdout */
254          if (outfmt == DTfromHeader)
255                  outfmt = mres->dtype;
236 #if defined(_WIN32) || defined(_WIN64)
256          if (outfmt != DTascii)
257 <                _setmode(fileno(stdout), _O_BINARY);
239 < #endif
257 >                SET_FILE_BINARY(stdout);
258          newheader("RADIANCE", stdout);
259          printargs(argc, argv, stdout);
260          if (!rmx_write(mres, outfmt, stdout)) {
# Line 247 | Line 265 | main(int argc, char *argv[])
265          return(0);
266   userr:
267          fprintf(stderr,
268 <        "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+] .. > mres\n",
268 >        "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+*/] .. > mres\n",
269                          argv[0]);
270          return(1);
271   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines