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.6 by greg, Sat Aug 2 17:10:43 2014 UTC vs.
Revision 2.13 by greg, Mon May 4 20:53:21 2015 UTC

# Line 59 | Line 59 | rmx_addinfo(RMATRIX *rm, const char *info)
59   {
60          if (!info || !*info)
61                  return(0);
62 <        if (!rm->info)
62 >        if (!rm->info) {
63                  rm->info = (char *)malloc(strlen(info)+1);
64 <        else
64 >                if (rm->info) rm->info[0] = '\0';
65 >        } else
66                  rm->info = (char *)realloc(rm->info,
67                                  strlen(rm->info)+strlen(info)+1);
68          if (!rm->info)
# Line 183 | Line 184 | rmx_load_rgbe(RMATRIX *rm, FILE *fp)
184  
185   /* Load matrix from supported file type */
186   RMATRIX *
187 < rmx_load(const char *fname)
187 > rmx_load(const char *inspec)
188   {
189          FILE            *fp = stdin;
190          RMATRIX         dinfo;
191          RMATRIX         *dnew;
192  
193 <        if (fname == NULL) {                    /* reading from stdin? */
194 <                fname = "<stdin>";
193 >        if (inspec == NULL) {                   /* reading from stdin? */
194 >                inspec = "<stdin>";
195 > #ifdef _WIN32
196 >                _setmode(fileno(stdin), _O_BINARY);
197 > #endif
198 >        } else if (inspec[0] == '!') {
199 >                if ((fp = popen(inspec+1, "r")) == NULL)
200 >                        return(NULL);
201 > #ifdef _WIN32
202 >                _setmode(fileno(fp), _O_BINARY);
203 > #endif
204          } else {
205 <                const char      *sp = fname;    /* check suffix */
205 >                const char      *sp = inspec;   /* check suffix */
206                  while (*sp)
207                          ++sp;
208 <                while (sp > fname && sp[-1] != '.')
208 >                while (sp > inspec && sp[-1] != '.')
209                          --sp;
210                  if (!strcasecmp(sp, "XML")) {   /* assume it's a BSDF */
211 <                        CMATRIX *cm = cm_loadBTDF((char *)fname);
211 >                        CMATRIX *cm = cm_loadBTDF((char *)inspec);
212                          if (cm == NULL)
213                                  return(NULL);
214                          dnew = rmx_from_cmatrix(cm);
# Line 206 | Line 216 | rmx_load(const char *fname)
216                          return(dnew);
217                  }
218                                                  /* else open it ourselves */
219 <                if ((fp = fopen(fname, "rb")) == NULL)
219 >                if ((fp = fopen(inspec, "rb")) == NULL)
220                          return(NULL);
221          }
222   #ifdef getc_unlocked
# Line 242 | Line 252 | rmx_load(const char *fname)
252          case DTascii:
253                  if (!rmx_load_ascii(dnew, fp))
254                          goto loaderr;
255 +                dnew->dtype = DTascii;          /* should leave double? */
256                  break;
257          case DTfloat:
258                  if (!rmx_load_float(dnew, fp))
# Line 262 | Line 273 | rmx_load(const char *fname)
273          default:
274                  goto loaderr;
275          }
276 <        if (fp != stdin)
277 <                fclose(fp);
276 >        if (fp != stdin) {
277 >                if (inspec[0] == '!')
278 >                        pclose(fp);
279 >                else
280 >                        fclose(fp);
281 >        }
282 > #ifdef getc_unlocked
283 >        else
284 >                funlockfile(fp);
285 > #endif
286          return(dnew);
287   loaderr:                                        /* should report error? */
288 <        fclose(fp);
288 >        if (inspec[0] == '!')
289 >                pclose(fp);
290 >        else
291 >                fclose(fp);
292          rmx_free(dnew);
293          return(NULL);
294   }
# Line 352 | Line 374 | rmx_write_rgbe(const RMATRIX *rm, FILE *fp)
374   }
375  
376   /* Write matrix to file type indicated by dtype */
377 < long
377 > int
378   rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
379   {
380          RMATRIX *mydm = NULL;
# Line 367 | Line 389 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
389                  dtype = rm->dtype;
390          else if ((dtype == DTrgbe) & (rm->dtype == DTxyze))
391                  dtype = DTxyze;
392 <        else if ((dtype = DTxyze) & (rm->dtype == DTrgbe))
392 >        else if ((dtype == DTxyze) & (rm->dtype == DTrgbe))
393                  dtype = DTrgbe;
394          if ((dtype != DTrgbe) & (dtype != DTxyze)) {
395                  fprintf(fp, "NROWS=%d\n", rm->nrows);
# Line 405 | Line 427 | rmx_write(const RMATRIX *rm, int dtype, FILE *fp)
427          }
428          ok &= (fflush(fp) == 0);
429          rmx_free(mydm);
430 <        return(ftell(fp) * ok);         /* return # bytes written */
430 >        return(ok);
431   }
432  
433   /* Allocate and assign square identity matrix with n components */
# Line 413 | Line 435 | RMATRIX *
435   rmx_identity(const int dim, const int n)
436   {
437          RMATRIX *rid = rmx_alloc(dim, dim, n);
438 <        int     i;
438 >        int     i, k;
439  
440          if (rid == NULL)
441                  return(NULL);
442 <        memset(rid->mtx, 0, sizeof(rid->mtx[0])*dim*dim);
442 >        memset(rid->mtx, 0, sizeof(rid->mtx[0])*n*dim*dim);
443          for (i = dim; i--; )
444 <                rmx_lval(rid,i,i,0) = 1;
445 <        for (i = n; --i; )
424 <                memcpy(rid->mtx+i*(dim*dim), rid->mtx,
425 <                                sizeof(rid->mtx[0])*dim*dim);
444 >            for (k = n; k--; )
445 >                rmx_lval(rid,i,i,k) = 1;
446          return(rid);
447   }
448  
# Line 488 | Line 508 | rmx_multiply(const RMATRIX *m1, const RMATRIX *m2)
508                  rmx_addinfo(mres, rmx_mismatch_warn);
509          for (i = mres->nrows; i--; )
510              for (j = mres->ncols; j--; )
511 <                for (h = m1->ncols; h--; ) {
511 >                for (k = mres->ncomp; k--; ) {
512                      long double d = 0;
513 <                    for (k = mres->ncomp; k--; )
513 >                    for (h = m1->ncols; h--; )
514                          d += (long double)rmx_lval(m1,i,h,k) *
515                                  (long double)rmx_lval(m2,h,j,k);
516                      rmx_lval(mres,i,j,k) = (double)d;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines