--- ray/src/util/rmatrix.c 2022/03/05 01:45:21 2.53 +++ ray/src/util/rmatrix.c 2023/05/18 23:55:10 2.58 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rmatrix.c,v 2.53 2022/03/05 01:45:21 greg Exp $"; +static const char RCSid[] = "$Id: rmatrix.c,v 2.58 2023/05/18 23:55:10 greg Exp $"; #endif /* * General matrix operations. @@ -32,6 +32,7 @@ rmx_new(int nr, int nc, int n) dnew->nrows = nr; dnew->ncols = nc; dnew->ncomp = n; + setcolor(dnew->cexp, 1.f, 1.f, 1.f); } return(dnew); } @@ -206,7 +207,7 @@ rmx_load_double(RMATRIX *rm, FILE *fp) { int i; #ifdef MAP_FILE - long pos; /* map memory to file if possible */ + long pos; /* map memory for file > 1MB if possible */ if (!rm->swapin && array_size(rm) >= 1L<<20 && (pos = ftell(fp)) >= 0 && !(pos % sizeof(double))) { rm->mapped = mmap(NULL, array_size(rm)+pos, PROT_READ|PROT_WRITE, @@ -214,7 +215,7 @@ rmx_load_double(RMATRIX *rm, FILE *fp) if (rm->mapped != MAP_FAILED) { rm->mtx = (double *)rm->mapped + pos/sizeof(double); return(1); - } + } /* else fall back on reading into memory */ rm->mapped = NULL; } #endif @@ -241,7 +242,7 @@ rmx_load_rgbe(RMATRIX *rm, FILE *fp) if (!rmx_prepare(rm)) return(0); for (i = 0; i < rm->nrows; i++) { - double *dp = rmx_lval(rm,i,j); + double *dp = rmx_lval(rm,i,0); if (freadscan(scan, rm->ncols, fp) < 0) { free(scan); return(0); @@ -301,7 +302,6 @@ rmx_load(const char *inspec, RMPref rmp) return(NULL); } dnew->dtype = DTascii; /* assumed w/o FORMAT */ - dnew->cexp[0] = dnew->cexp[1] = dnew->cexp[2] = 1.f; if (getheader(fp, get_dminfo, dnew) < 0) { fclose(fp); return(NULL); @@ -338,16 +338,6 @@ rmx_load(const char *inspec, RMPref rmp) case DTxyze: if (!rmx_load_rgbe(dnew, fp)) goto loaderr; - /* undo exposure? */ - if ((dnew->cexp[0] != 1.f) | (dnew->cexp[1] != 1.f) | - (dnew->cexp[2] != 1.f)) { - double cmlt[3]; - cmlt[0] = 1./dnew->cexp[0]; - cmlt[1] = 1./dnew->cexp[1]; - cmlt[2] = 1./dnew->cexp[2]; - rmx_scale(dnew, cmlt); - } - dnew->swapin = 0; break; default: goto loaderr; @@ -362,6 +352,16 @@ rmx_load(const char *inspec, RMPref rmp) else funlockfile(fp); #endif + /* undo exposure? */ + if (dnew->ncomp == 3 && (dnew->cexp[0] != 1.f) | + (dnew->cexp[1] != 1.f) | (dnew->cexp[2] != 1.f)) { + double cmlt[3]; + cmlt[0] = 1./dnew->cexp[0]; + cmlt[1] = 1./dnew->cexp[1]; + cmlt[2] = 1./dnew->cexp[2]; + rmx_scale(dnew, cmlt); + setcolor(dnew->cexp, 1.f, 1.f, 1.f); + } return(dnew); loaderr: /* should report error? */ if (inspec[0] == '!') @@ -436,7 +436,10 @@ rmx_write_rgbe(const RMATRIX *rm, FILE *fp) for (i = 0; i < rm->nrows; i++) { for (j = rm->ncols; j--; ) { const double *dp = rmx_lval(rm,i,j); - setcolr(scan[j], dp[0], dp[1], dp[2]); + if (rm->ncomp == 1) + setcolr(scan[j], dp[0], dp[0], dp[0]); + else + setcolr(scan[j], dp[0], dp[1], dp[2]); } if (fwritecolrs(scan, rm->ncols, fp) < 0) { free(scan); @@ -485,22 +488,19 @@ rmx_write(const RMATRIX *rm, int dtype, FILE *fp) dtype = DTxyze; else if ((dtype == DTxyze) & (rm->dtype == DTrgbe)) dtype = DTrgbe; + if (rm->ncomp == 3) { /* write exposure? */ + if ((rm->cexp[RED] != rm->cexp[GRN]) | + (rm->cexp[GRN] != rm->cexp[BLU])) + fputcolcor(rm->cexp, fp); + else if (rm->cexp[GRN] != 1.f) + fputexpos(rm->cexp[GRN], fp); + } if ((dtype != DTrgbe) & (dtype != DTxyze)) { fprintf(fp, "NROWS=%d\n", rm->nrows); fprintf(fp, "NCOLS=%d\n", rm->ncols); fprintf(fp, "NCOMP=%d\n", rm->ncomp); - } else if (rm->ncomp != 3) { /* wrong # components? */ - CMATRIX *cm; /* convert & write */ - if (rm->ncomp != 1) /* only convert grayscale */ - return(0); - if (!(cm = cm_from_rmatrix(rm))) - return(0); - fputformat(cm_fmt_id[dtype], fp); - fputc('\n', fp); - ok = cm_write(cm, dtype, fp); - cm_free(cm); - return(ok); - } + } else if ((rm->ncomp != 3) & (rm->ncomp != 1)) + return(0); /* wrong # components */ if ((dtype == DTfloat) | (dtype == DTdouble)) fputendian(fp); /* important to record */ fputformat(cm_fmt_id[dtype], fp); @@ -570,7 +570,7 @@ RMATRIX * rmx_transpose(const RMATRIX *rm) { RMATRIX *dnew; - int i, j, k; + int i, j; if (!rm) return(0); @@ -590,9 +590,9 @@ rmx_transpose(const RMATRIX *rm) rmx_addinfo(dnew, "Transposed rows and columns\n"); } dnew->dtype = rm->dtype; - for (i = dnew->nrows; i--; ) - for (j = dnew->ncols; j--; ) - memcpy(rmx_lval(dnew,i,j), rmx_lval(rm,i,j), + for (j = dnew->ncols; j--; ) + for (i = dnew->nrows; i--; ) + memcpy(rmx_lval(dnew,i,j), rmx_lval(rm,j,i), sizeof(double)*dnew->ncomp); return(dnew); }