--- ray/src/util/rmtxop.c 2014/05/31 05:02:37 2.1 +++ ray/src/util/rmtxop.c 2016/08/18 17:57:57 2.10 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmtxop.c,v 2.1 2014/05/31 05:02:37 greg Exp $"; +static const char RCSid[] = "$Id: rmtxop.c,v 2.10 2016/08/18 17:57:57 greg Exp $"; #endif /* * General component matrix operations. @@ -10,6 +10,7 @@ static const char RCSid[] = "$Id: rmtxop.c,v 2.1 2014/ #include "rtio.h" #include "resolu.h" #include "rmatrix.h" +#include "platform.h" #define MAXCOMP 50 /* #components we support */ @@ -18,11 +19,10 @@ typedef struct { int nsf; /* number of scalars */ double cmat[MAXCOMP*MAXCOMP]; /* component transformation */ int clen; /* number of coefficients */ - int transpose; /* do transpose? (<0 first) */ + int transpose; /* do transpose? */ int op; /* '*' or '+' */ } ROPERAT; /* matrix operation */ -int outfmt = DTascii; /* output format */ int verbose = 0; /* verbose reporting? */ static void @@ -36,6 +36,7 @@ static RMATRIX * operate(RMATRIX *mleft, ROPERAT *op, const char *fname) { RMATRIX *mright = rmx_load(fname); + RMATRIX *mtmp; int i; if (fname == NULL) @@ -45,8 +46,9 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname fputs(": cannot load matrix\n", stderr); return(NULL); } - if (op->transpose < 0) { /* transpose first? */ - if (!rmx_transpose(mright)) { + if (op->transpose) { /* transpose matrix? */ + mtmp = rmx_transpose(mright); + if (mtmp == NULL) { fputs(fname, stderr); fputs(": transpose failed\n", stderr); rmx_free(mright); @@ -56,6 +58,8 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname fputs(fname, stderr); fputs(": transposed rows and columns\n", stderr); } + rmx_free(mright); + mright = mtmp; } if (op->nsf > 0) { /* apply scalar(s) */ if (op->clen > 0) { @@ -88,7 +92,6 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname } } if (op->clen > 0) { /* apply transform */ - RMATRIX *mtmp; if (op->clen % mright->ncomp) { fprintf(stderr, "%s: -c must have N x %d coefficients\n", fname, mright->ncomp); @@ -107,18 +110,6 @@ operate(RMATRIX *mleft, ROPERAT *op, const char *fname rmx_free(mright); mright = mtmp; } - if (op->transpose > 0) { /* transpose after? */ - if (!rmx_transpose(mright)) { - fputs(fname, stderr); - fputs(": transpose failed\n", stderr); - rmx_free(mright); - return(NULL); - } - if (verbose) { - fputs(fname, stderr); - fputs(": transposed rows and columns\n", stderr); - } - } if (mleft == NULL) /* just one matrix */ return(mright); if (op->op == '*') { /* concatenate */ @@ -174,9 +165,9 @@ get_factors(double da[], int n, char *av[]) int main(int argc, char *argv[]) { + int outfmt = DTfromHeader; RMATRIX *mres = NULL; ROPERAT op; - long nbw; int i; /* initialize */ op_default(&op); @@ -220,10 +211,7 @@ main(int argc, char *argv[]) } break; case 't': - if (!op.nsf & !op.clen) - op.transpose = -1; - else - op.transpose = 1; + op.transpose = 1; break; case 's': if (n > MAXCOMP) n = MAXCOMP; @@ -244,20 +232,21 @@ main(int argc, char *argv[]) if (mres == NULL) /* check that we got something */ goto userr; /* write result to stdout */ + if (outfmt == DTfromHeader) + outfmt = mres->dtype; + if (outfmt != DTascii) + SET_FILE_BINARY(stdout); newheader("RADIANCE", stdout); printargs(argc, argv, stdout); - nbw = rmx_write(mres, outfmt, stdout); - /* rmx_free(mres); mres = NULL; */ - if (nbw <= 0) { + if (!rmx_write(mres, outfmt, stdout)) { fprintf(stderr, "%s: error writing result matrix\n", argv[0]); return(1); } - if (verbose) - fprintf(stderr, "%s: %ld bytes written\n", argv[0], nbw); + /* rmx_free(mres); mres = NULL; */ return(0); userr: fprintf(stderr, - "Usage: %s [-v][-f[adfc][-t][-s sf ..][-c ce ..] m1 [+] .. > mres\n", + "Usage: %s [-v][-f[adfc][-t][-s sf .. | -c ce ..] m1 [+] .. > mres\n", argv[0]); return(1); }