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.8 by greg, Wed Aug 27 13:33:47 2014 UTC vs.
Revision 2.13 by greg, Mon May 4 20:53:21 2015 UTC

# Line 184 | 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 210 | 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 246 | 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 266 | 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 356 | 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 371 | 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 409 | 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 417 | 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; )
428 <                memcpy(rid->mtx+i*(dim*dim), rid->mtx,
429 <                                sizeof(rid->mtx[0])*dim*dim);
444 >            for (k = n; k--; )
445 >                rmx_lval(rid,i,i,k) = 1;
446          return(rid);
447   }
448  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines