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

Comparing ray/src/util/cmatrix.c (file contents):
Revision 2.25 by greg, Wed Mar 25 01:51:09 2020 UTC vs.
Revision 2.27 by greg, Thu Mar 26 16:56:10 2020 UTC

# Line 21 | Line 21 | const char     *cm_fmt_id[] = {
21                  };
22  
23   const int       cm_elem_size[] = {
24 <                        0, 0, 4, 4, 3*sizeof(float), 3*sizeof(double)
24 >                        0, 4, 4, 3*sizeof(float), 0, 3*sizeof(double)
25                  };
26  
27   /* Allocate a color coefficient matrix */
# Line 259 | Line 259 | cm_load(const char *inspec, int nrows, int ncols, int
259          }
260          if (nrows <= 0) {                       /* don't know length? */
261                  int     guessrows = 147;        /* usually big enough */
262 <                if ((dtype != DTascii) & (fp != stdin) & (inspec[0] != '!')) {
262 >                if (cm_elem_size[dtype] && (fp != stdin) & (inspec[0] != '!')) {
263                          long    startpos = ftell(fp);
264                          if (fseek(fp, 0L, SEEK_END) == 0) {
265 +                                long    rowsiz = (long)ncols*cm_elem_size[dtype];
266                                  long    endpos = ftell(fp);
266                                long    elemsiz = 3*(dtype==DTfloat ?
267                                            sizeof(float) : sizeof(double));
267  
268 <                                if ((endpos - startpos) % (ncols*elemsiz)) {
268 >                                if ((endpos - startpos) % rowsiz) {
269                                          sprintf(errmsg,
270                                          "improper length for binary file '%s'",
271                                                          inspec);
272                                          error(USER, errmsg);
273                                  }
274 <                                guessrows = (endpos - startpos)/(ncols*elemsiz);
274 >                                guessrows = (endpos - startpos)/rowsiz;
275                                  if (fseek(fp, startpos, SEEK_SET) < 0) {
276                                          sprintf(errmsg,
277                                                  "fseek() error on file '%s'",
# Line 333 | Line 332 | cm_load(const char *inspec, int nrows, int ncols, int
332                                          goto EOFerror;
333                          } while (nread < cm->nrows*cm->ncols);
334  
335 +                        if (swap) {
336 +                                if (sizeof(COLORV) == 4)
337 +                                        swap32((char *)cm->cmem,
338 +                                                        3*cm->nrows*cm->ncols);
339 +                                else /* sizeof(COLORV) == 8 */
340 +                                        swap64((char *)cm->cmem,
341 +                                                        3*cm->nrows*cm->ncols);
342 +                        }
343                  } else if (dtype == DTdouble) {
344                          double  dc[3];                  /* load from double */
345                          COLORV  *cvp = cm->cmem;
# Line 343 | Line 350 | cm_load(const char *inspec, int nrows, int ncols, int
350                          while (n--) {
351                                  if (getbinary(dc, sizeof(double), 3, fp) != 3)
352                                          goto EOFerror;
353 +                                if (swap) swap64((char *)dc, 3);
354                                  copycolor(cvp, dc);
355                                  cvp += 3;
356                          }
# Line 356 | Line 364 | cm_load(const char *inspec, int nrows, int ncols, int
364                          while (n--) {
365                                  if (getbinary(fc, sizeof(float), 3, fp) != 3)
366                                          goto EOFerror;
367 +                                if (swap) swap32((char *)fc, 3);
368                                  copycolor(cvp, fc);
369                                  cvp += 3;
370                          }
# Line 366 | Line 375 | cm_load(const char *inspec, int nrows, int ncols, int
375                                                  inspec);
376                                  error(WARNING, errmsg);
377                  }
369        }
370        if (swap) {
371                if (dtype == DTfloat)
372                        swap32((char *)cm->cmem, 3*cm->nrows*cm->ncols);
373                else if (dtype == DTdouble)
374                        swap64((char *)cm->cmem, 3*cm->nrows*cm->ncols);
378          }
379   cleanup:
380          if (fp != stdin) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines