--- ray/src/util/rmatrix.c 2014/05/31 05:02:37 2.1 +++ ray/src/util/rmatrix.c 2014/07/24 16:28:17 2.4 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmatrix.c,v 2.1 2014/05/31 05:02:37 greg Exp $"; +static const char RCSid[] = "$Id: rmatrix.c,v 2.4 2014/07/24 16:28:17 greg Exp $"; #endif /* * General matrix operations. @@ -173,16 +173,22 @@ rmx_load(const char *fname) #endif dinfo.nrows = dinfo.ncols = dinfo.ncomp = 0; dinfo.dtype = DTascii; - if (getheader(fp, &get_dminfo, &dinfo) < 0) { + if (getheader(fp, get_dminfo, &dinfo) < 0) { fclose(fp); return(NULL); } - if ((dinfo.dtype == DTrgbe) | (dinfo.dtype == DTxyze)) { + if ((dinfo.nrows <= 0) | (dinfo.ncols <= 0)) { if (!fscnresolu(&dinfo.ncols, &dinfo.nrows, fp)) { fclose(fp); return(NULL); } - dinfo.ncomp = 3; + if (dinfo.ncomp <= 0) + dinfo.ncomp = 3; + else if ((dinfo.dtype == DTrgbe) | (dinfo.dtype == DTxyze) && + dinfo.ncomp != 3) { + fclose(fp); + return(NULL); + } } dnew = rmx_alloc(dinfo.nrows, dinfo.ncols, dinfo.ncomp); if (dnew == NULL) { @@ -382,29 +388,23 @@ rmx_copy(const RMATRIX *rm) return(dnew); } -/* Swap rows and columns in the given matrix in situ */ -int -rmx_transpose(RMATRIX *rm) +/* Allocate and assign transposed matrix */ +RMATRIX * +rmx_transpose(const RMATRIX *rm) { - RMATRIX dswap; + RMATRIX *dnew; int i, j, k; if (rm == NULL) return(0); - dswap.nrows = rm->ncols; - dswap.ncols = rm->nrows; - dswap.ncomp = rm->ncomp; - for (i = 1; i < rm->nrows; i++) - for (j = 0; j < i; j++) - for (k = rm->ncomp; k--; ) { - double *opp = rm->mtx + rmx_indx(&dswap,j,i,k); - double d = *opp; - *opp = rmx_lval(rm,i,j,k); - rmx_lval(rm,i,j,k) = d; - } - rm->nrows = dswap.nrows; - rm->ncols = dswap.ncols; - return(1); + dnew = rmx_alloc(rm->ncols, rm->nrows, rm->ncomp); + if (dnew == NULL) + return(NULL); + for (i = dnew->nrows; i--; ) + for (j = dnew->ncols; j--; ) + for (k = dnew->ncomp; k--; ) + rmx_lval(dnew,i,j,k) = rmx_lval(rm,j,i,k); + return(dnew); } /* Multiply (concatenate) two matrices and allocate the result */