--- ray/src/util/cmatrix.c 2015/07/22 04:29:56 2.12 +++ ray/src/util/cmatrix.c 2018/04/10 22:11:30 2.19 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: cmatrix.c,v 2.12 2015/07/22 04:29:56 greg Exp $"; +static const char RCSid[] = "$Id: cmatrix.c,v 2.19 2018/04/10 22:11:30 greg Exp $"; #endif /* * Color matrix routines. @@ -8,10 +8,11 @@ static const char RCSid[] = "$Id: cmatrix.c,v 2.12 201 */ #include +#include "platform.h" #include "standard.h" #include "cmatrix.h" #include "platform.h" -#include "rtprocess.h" +#include "paths.h" #include "resolu.h" const char *cm_fmt_id[] = { @@ -20,7 +21,7 @@ const char *cm_fmt_id[] = { }; const int cm_elem_size[] = { - 0, 0, 3*sizeof(float), 3*sizeof(double), 4, 4 + 0, 0, 4, 4, 3*sizeof(float), 3*sizeof(double) }; /* Allocate a color coefficient matrix */ @@ -148,8 +149,9 @@ cm_getheader(int *dt, int *nr, int *nc, FILE *fp) CMATRIX * cm_load(const char *inspec, int nrows, int ncols, int dtype) { - FILE *fp = stdin; - CMATRIX *cm; + const int ROWINC = 2048; + FILE *fp = stdin; + CMATRIX *cm; if (inspec == NULL) inspec = ""; @@ -218,15 +220,16 @@ cm_load(const char *inspec, int nrows, int ncols, int int r, c; for (r = 0; r < maxrow; r++) { if (r >= cm->nrows) /* need more space? */ - cm = cm_resize(cm, 2*cm->nrows); + cm = cm_resize(cm, cm->nrows+ROWINC); for (c = 0; c < ncols; c++) { COLORV *cv = cm_lval(cm,r,c); - if (fscanf(fp, COLSPEC, cv, cv+1, cv+2) != 3) + if (fscanf(fp, COLSPEC, cv, cv+1, cv+2) != 3) { if ((nrows <= 0) & (r > 0) & !c) { cm = cm_resize(cm, maxrow=r); break; } else goto EOFerror; + } } } while ((c = getc(fp)) != EOF) @@ -241,14 +244,14 @@ cm_load(const char *inspec, int nrows, int ncols, int if (sizeof(COLOR) == cm_elem_size[dtype]) { int nread = 0; do { /* read all we can */ - nread += fread(cm->cmem + 3*nread, + nread += getbinary(cm->cmem + 3*nread, sizeof(COLOR), cm->nrows*cm->ncols - nread, fp); if (nrows <= 0) { /* unknown length */ if (nread == cm->nrows*cm->ncols) /* need more space? */ - cm = cm_resize(cm, 2*cm->nrows); + cm = cm_resize(cm, cm->nrows+ROWINC); else if (nread && !(nread % cm->ncols)) /* seem to be done */ cm = cm_resize(cm, nread/cm->ncols); @@ -266,7 +269,7 @@ cm_load(const char *inspec, int nrows, int ncols, int if (n <= 0) goto not_handled; while (n--) { - if (fread(dc, sizeof(double), 3, fp) != 3) + if (getbinary(dc, sizeof(double), 3, fp) != 3) goto EOFerror; copycolor(cvp, dc); cvp += 3; @@ -279,7 +282,7 @@ cm_load(const char *inspec, int nrows, int ncols, int if (n <= 0) goto not_handled; while (n--) { - if (fread(fc, sizeof(float), 3, fp) != 3) + if (getbinary(fc, sizeof(float), 3, fp) != 3) goto EOFerror; copycolor(cvp, fc); cvp += 3; @@ -400,9 +403,9 @@ cm_multiply(const CMATRIX *cm1, const CMATRIX *cm2) for (i = 0; i < cm1->ncols; i++) { const COLORV *cp1 = cm_lval(cm1,dr,i); const COLORV *cp2 = cm_lval(cm2,i,dc); - res[0] += cp1[0] * cp2[0]; - res[1] += cp1[1] * cp2[1]; - res[2] += cp1[2] * cp2[2]; + res[0] += (double)cp1[0] * cp2[0]; + res[1] += (double)cp1[1] * cp2[1]; + res[2] += (double)cp1[2] * cp2[2]; } copycolor(dp, res); } @@ -432,7 +435,7 @@ cm_write(const CMATRIX *cm, int dtype, FILE *fp) if (sizeof(COLOR) == cm_elem_size[dtype]) { r = cm->ncols*cm->nrows; while (r > 0) { - c = fwrite(mp, sizeof(COLOR), r, fp); + c = putbinary(mp, sizeof(COLOR), r, fp); if (c <= 0) return(0); mp += 3*c; @@ -443,7 +446,7 @@ cm_write(const CMATRIX *cm, int dtype, FILE *fp) r = cm->ncols*cm->nrows; while (r--) { copycolor(dc, mp); - if (fwrite(dc, sizeof(double), 3, fp) != 3) + if (putbinary(dc, sizeof(double), 3, fp) != 3) return(0); mp += 3; } @@ -452,7 +455,7 @@ cm_write(const CMATRIX *cm, int dtype, FILE *fp) r = cm->ncols*cm->nrows; while (r--) { copycolor(fc, mp); - if (fwrite(fc, sizeof(float), 3, fp) != 3) + if (putbinary(fc, sizeof(float), 3, fp) != 3) return(0); mp += 3; }