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

Comparing ray/src/util/rmatrix.c (file contents):
Revision 2.5 by greg, Fri Aug 1 23:37:24 2014 UTC vs.
Revision 2.7 by greg, Tue Aug 5 21:45:05 2014 UTC

# Line 12 | Line 12 | static const char RCSid[] = "$Id$";
12   #include "resolu.h"
13   #include "rmatrix.h"
14  
15 < #define MAX_INFO        16000
15 > static char     rmx_mismatch_warn[] = "WARNING: data type mismatch\n";
16  
17 typedef struct {
18        int     nrows, ncols, ncomp;
19        int     dtype;
20        int     info_len;
21        char    info[MAX_INFO];
22 } DMINFO;
23
17   /* Allocate a nr x nc matrix with n components */
18   RMATRIX *
19   rmx_alloc(int nr, int nc, int n)
# Line 34 | Line 27 | rmx_alloc(int nr, int nc, int n)
27          if (dnew == NULL)
28                  return(NULL);
29          dnew->nrows = nr; dnew->ncols = nc; dnew->ncomp = n;
30 +        dnew->dtype = DTdouble;
31          dnew->info = NULL;
32          return(dnew);
33   }
34  
35 + /* Free a RMATRIX array */
36 + void
37 + rmx_free(RMATRIX *rm)
38 + {
39 +        if (!rm) return;
40 +        if (rm->info)
41 +                free(rm->info);
42 +        free(rm);
43 + }
44 +
45 + /* Resolve data type based on two input types (returns 0 for mismatch) */
46 + int
47 + rmx_newtype(int dtyp1, int dtyp2)
48 + {
49 +        if ((dtyp1==DTxyze) | (dtyp1==DTrgbe) && dtyp1 != dtyp2)
50 +                return(0);
51 +        if (dtyp1 < dtyp2)
52 +                return(dtyp1);
53 +        return(dtyp2);
54 + }
55 +
56   /* Append header information associated with matrix data */
57   int
58   rmx_addinfo(RMATRIX *rm, const char *info)
# Line 58 | Line 73 | rmx_addinfo(RMATRIX *rm, const char *info)
73   static int
74   get_dminfo(char *s, void *p)
75   {
76 <        DMINFO  *ip = (DMINFO *)p;
76 >        RMATRIX *ip = (RMATRIX *)p;
77          char    fmt[64];
78          int     i;
79  
80 +        if (headidval(fmt, s))
81 +                return(0);
82          if (!strncmp(s, "NCOMP=", 6)) {
83                  ip->ncomp = atoi(s+6);
84                  return(0);
# Line 75 | Line 92 | get_dminfo(char *s, void *p)
92                  return(0);
93          }
94          if (!formatval(fmt, s)) {
95 <                if (headidval(fmt, s))
79 <                        return(0);
80 <                while (*s) {
81 <                        if (ip->info_len == MAX_INFO-2 &&
82 <                                        ip->info[MAX_INFO-3] != '\n')
83 <                                ip->info[ip->info_len++] = '\n';
84 <                        if (ip->info_len >= MAX_INFO-1)
85 <                                break;
86 <                        ip->info[ip->info_len++] = *s++;
87 <                }
88 <                ip->info[ip->info_len] = '\0';
95 >                rmx_addinfo(ip, s);
96                  return(0);
97          }
98          for (i = 1; i < DTend; i++)
# Line 179 | Line 186 | RMATRIX *
186   rmx_load(const char *fname)
187   {
188          FILE            *fp = stdin;
189 <        DMINFO          dinfo;
189 >        RMATRIX         dinfo;
190          RMATRIX         *dnew;
191  
192          if (fname == NULL) {                    /* reading from stdin? */
193                  fname = "<stdin>";
194 + #ifdef _WIN32
195 +                _setmode(fileno(stdin), _O_BINARY);
196 + #endif
197          } else {
198                  const char      *sp = fname;    /* check suffix */
199                  while (*sp)
# Line 206 | Line 216 | rmx_load(const char *fname)
216          flockfile(fp);
217   #endif
218          dinfo.nrows = dinfo.ncols = dinfo.ncomp = 0;
219 <        dinfo.dtype = DTascii;
220 <        dinfo.info_len = 0;
219 >        dinfo.dtype = DTascii;                  /* assumed w/o FORMAT */
220 >        dinfo.info = NULL;
221          if (getheader(fp, get_dminfo, &dinfo) < 0) {
222                  fclose(fp);
223                  return(NULL);
# Line 230 | Line 240 | rmx_load(const char *fname)
240                  fclose(fp);
241                  return(NULL);
242          }
243 <        if (dinfo.info_len)
234 <                rmx_addinfo(dnew, dinfo.info);
243 >        dnew->info = dinfo.info;
244          switch (dinfo.dtype) {
245          case DTascii:
246                  if (!rmx_load_ascii(dnew, fp))
# Line 240 | Line 249 | rmx_load(const char *fname)
249          case DTfloat:
250                  if (!rmx_load_float(dnew, fp))
251                          goto loaderr;
252 +                dnew->dtype = DTfloat;
253                  break;
254          case DTdouble:
255                  if (!rmx_load_double(dnew, fp))
256                          goto loaderr;
257 +                dnew->dtype = DTdouble;
258                  break;
259          case DTrgbe:
260          case DTxyze:
261                  if (!rmx_load_rgbe(dnew, fp))
262                          goto loaderr;
263 +                dnew->dtype = dinfo.dtype;
264                  break;
265          default:
266                  goto loaderr;
# Line 342 | Line 354 | rmx_write_rgbe(const RMATRIX *rm, FILE *fp)
354          return(1);
355   }
356  
357 < /* Write matrix to file type indicated by dt */
357 > /* Write matrix to file type indicated by dtype */
358   long
359   rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
360   {
# Line 354 | Line 366 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
366                                                  /* complete header */
367          if (rm->info)
368                  fputs(rm->info, fp);
369 +        if (dtype == DTfromHeader)
370 +                dtype = rm->dtype;
371 +        else if ((dtype == DTrgbe) & (rm->dtype == DTxyze))
372 +                dtype = DTxyze;
373 +        else if ((dtype = DTxyze) & (rm->dtype == DTrgbe))
374 +                dtype = DTrgbe;
375          if ((dtype != DTrgbe) & (dtype != DTxyze)) {
376                  fprintf(fp, "NROWS=%d\n", rm->nrows);
377                  fprintf(fp, "NCOLS=%d\n", rm->ncols);
# Line 423 | Line 441 | rmx_copy(const RMATRIX *rm)
441          if (dnew == NULL)
442                  return(NULL);
443          rmx_addinfo(dnew, rm->info);
444 +        dnew->dtype = rm->dtype;
445          memcpy(dnew->mtx, rm->mtx,
446                  sizeof(rm->mtx[0])*rm->ncomp*rm->nrows*rm->ncols);
447          return(dnew);
# Line 444 | Line 463 | rmx_transpose(const RMATRIX *rm)
463                  rmx_addinfo(dnew, rm->info);
464                  rmx_addinfo(dnew, "Transposed rows and columns\n");
465          }
466 +        dnew->dtype = rm->dtype;
467          for (i = dnew->nrows; i--; )
468              for (j = dnew->ncols; j--; )
469                  for (k = dnew->ncomp; k--; )
# Line 464 | Line 484 | rmx_multiply(const RMATRIX *m1, const RMATRIX *m2)
484          mres = rmx_alloc(m1->nrows, m2->ncols, m1->ncomp);
485          if (mres == NULL)
486                  return(NULL);
487 +        i = rmx_newtype(m1->dtype, m2->dtype);
488 +        if (i)
489 +                mres->dtype = i;
490 +        else
491 +                rmx_addinfo(mres, rmx_mismatch_warn);
492          for (i = mres->nrows; i--; )
493              for (j = mres->ncols; j--; )
494                  for (h = m1->ncols; h--; ) {
# Line 496 | Line 521 | rmx_sum(RMATRIX *msum, const RMATRIX *madd, const doub
521                          mysf[k] = 1;
522                  sf = mysf;
523          }
524 +        i = rmx_newtype(msum->dtype, madd->dtype);
525 +        if (i)
526 +                msum->dtype = i;
527 +        else
528 +                rmx_addinfo(msum, rmx_mismatch_warn);
529          for (i = msum->nrows; i--; )
530              for (j = msum->ncols; j--; )
531                  for (k = msum->ncomp; k--; )
# Line 533 | Line 563 | rmx_transform(const RMATRIX *msrc, int n, const double
563          dnew = rmx_alloc(msrc->nrows, msrc->ncols, n);
564          if (dnew == NULL)
565                  return(NULL);
566 +        dnew->dtype = msrc->dtype;
567          for (i = dnew->nrows; i--; )
568              for (j = dnew->ncols; j--; )
569                  for (kd = dnew->ncomp; kd--; ) {
# Line 556 | Line 587 | rmx_from_cmatrix(const CMATRIX *cm)
587          dnew = rmx_alloc(cm->nrows, cm->ncols, 3);
588          if (dnew == NULL)
589                  return(NULL);
590 +        dnew->dtype = DTfloat;
591          for (i = dnew->nrows; i--; )
592              for (j = dnew->ncols; j--; ) {
593                  const COLORV    *cv = cm_lval(cm,i,j);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines