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

Comparing ray/src/rt/rc2.c (file contents):
Revision 2.14 by greg, Fri Aug 21 18:21:05 2015 UTC vs.
Revision 2.19 by greg, Mon Sep 12 20:31:34 2016 UTC

# Line 6 | Line 6 | static const char RCSid[] = "$Id$";
6   * File i/o and recovery
7   */
8  
9 + #include <ctype.h>
10 + #include "platform.h"
11   #include "rcontrib.h"
12   #include "resolu.h"
11 #include <ctype.h>
13  
14   /* Close output stream and free record */
15   static void
# Line 161 | Line 162 | getostream(const char *ospec, const char *mname, int b
162                          if (waitflush > 0)
163                                  fflush(stdout);
164                          stdos.xr = xres; stdos.yr = yres;
165 < #if 0
165 > #ifdef getc_unlocked
166                          flockfile(stdout);      /* avoid lock/unlock overhead */
167   #endif
168                          using_stdout = 1;
# Line 183 | Line 184 | getostream(const char *ospec, const char *mname, int b
184                  sop = (STREAMOUT *)malloc(sizeof(STREAMOUT));
185                  if (sop == NULL)
186                          error(SYSTEM, "out of memory in getostream");
187 <                sop->outpipe = oname[0] == '!';
187 >                sop->outpipe = (oname[0] == '!');
188                  sop->reclen = 0;
189                  sop->ofp = NULL;                /* open iff noopen==0 */
190                  sop->xr = xres; sop->yr = yres;
# Line 193 | Line 194 | getostream(const char *ospec, const char *mname, int b
194                          errno = EEXIST;         /* file exists */
195                          goto openerr;
196                  }
197 +        } else if (noopen && outfmt == 'c' &&   /* stream exists to picture? */
198 +                        (sop->xr > 0) & (sop->yr > 0)) {
199 +                if (ofl & OF_BIN)
200 +                        return(NULL);           /* let caller offset bins */
201 +                sprintf(errmsg, "output '%s' not a valid picture", oname);
202 +                error(WARNING, errmsg);
203          }
204          if (!noopen && sop->ofp == NULL) {      /* open output stream */
205                  if (oname[0] == '!')            /* output to command */
# Line 203 | Line 210 | getostream(const char *ospec, const char *mname, int b
210                          goto openerr;
211                  if (outfmt != 'a')
212                          SET_FILE_BINARY(sop->ofp);
213 < #if 0
213 > #ifdef getc_unlocked
214                  flockfile(sop->ofp);            /* avoid lock/unlock overhead */
215   #endif
216                  if (accumulate > 0) {           /* global resolution */
# Line 261 | Line 268 | getvec(FVECT vec)
268                  }
269                  break;
270          case 'f':                                       /* binary float */
271 <                if (fread((char *)vf, sizeof(float), 3, stdin) != 3)
271 >                if (getbinary((char *)vf, sizeof(float), 3, stdin) != 3)
272                          return(-1);
273                  VCOPY(vec, vf);
274                  break;
275          case 'd':                                       /* binary double */
276 <                if (fread((char *)vd, sizeof(double), 3, stdin) != 3)
276 >                if (getbinary((char *)vd, sizeof(double), 3, stdin) != 3)
277                          return(-1);
278                  VCOPY(vec, vd);
279                  break;
# Line 302 | Line 309 | put_contrib(const DCOLOR cnt, FILE *fout)
309                          scalecolor(fv, sf);
310                  } else
311                          copycolor(fv, cnt);
312 <                fwrite(fv, sizeof(float), 3, fout);
312 >                putbinary(fv, sizeof(float), 3, fout);
313                  break;
314          case 'd':
315                  if (accumulate > 1) {
316                          DCOLOR  dv;
317                          copycolor(dv, cnt);
318                          scalecolor(dv, sf);
319 <                        fwrite(dv, sizeof(double), 3, fout);
319 >                        putbinary(dv, sizeof(double), 3, fout);
320                  } else
321 <                        fwrite(cnt, sizeof(double), 3, fout);
321 >                        putbinary(cnt, sizeof(double), 3, fout);
322                  break;
323          case 'c':
324                  if (accumulate > 1)
325                          setcolr(cv, sf*cnt[0], sf*cnt[1], sf*cnt[2]);
326                  else
327                          setcolr(cv, cnt[0], cnt[1], cnt[2]);
328 <                fwrite(cv, sizeof(cv), 1, fout);
328 >                putbinary(cv, sizeof(cv), 1, fout);
329                  break;
330          default:
331                  error(INTERNAL, "botched output format");
# Line 330 | Line 337 | put_contrib(const DCOLOR cnt, FILE *fout)
337   void
338   mod_output(MODCONT *mp)
339   {
340 <        STREAMOUT       *sop = getostream(mp->outspec, mp->modname, 0, 0);
340 >        STREAMOUT       *sop = getostream(mp->outspec, mp->modname, mp->bin0, 0);
341          int             j;
342  
343          put_contrib(mp->cbin[0], sop->ofp);
344          if (mp->nbins > 3 &&    /* minor optimization */
345 <                        sop == getostream(mp->outspec, mp->modname, 1, 0)) {
345 >                        sop == getostream(mp->outspec, mp->modname, mp->bin0+1, 0)) {
346                  for (j = 1; j < mp->nbins; j++)
347                          put_contrib(mp->cbin[j], sop->ofp);
348          } else {
349                  for (j = 1; j < mp->nbins; j++) {
350 <                        sop = getostream(mp->outspec, mp->modname, j, 0);
350 >                        sop = getostream(mp->outspec, mp->modname, mp->bin0+j, 0);
351                          put_contrib(mp->cbin[j], sop->ofp);
352                  }
353          }
# Line 393 | Line 400 | get_contrib(DCOLOR cnt, FILE *finp)
400          case 'a':
401                  return(fscanf(finp,"%lf %lf %lf",&cnt[0],&cnt[1],&cnt[2]) == 3);
402          case 'f':
403 <                if (fread(fv, sizeof(fv[0]), 3, finp) != 3)
403 >                if (getbinary(fv, sizeof(fv[0]), 3, finp) != 3)
404                          return(0);
405                  copycolor(cnt, fv);
406                  return(1);
407          case 'd':
408 <                return(fread(cnt, sizeof(cnt[0]), 3, finp) == 3);
408 >                return(getbinary(cnt, sizeof(cnt[0]), 3, finp) == 3);
409          case 'c':
410 <                if (fread(cv, sizeof(cv), 1, finp) != 1)
410 >                if (getbinary(cv, sizeof(cv), 1, finp) != 1)
411                          return(0);
412                  colr_color(fv, cv);
413                  copycolor(cnt, fv);
# Line 474 | Line 481 | reload_output()
481                                          error(WARNING, errmsg);
482                                          break;
483                                  }
484 < #if 0
484 > #ifdef getc_unlocked
485                                  flockfile(sout.ofp);
486   #endif
487                                  if (header && checkheader(sout.ofp, outvfmt, NULL) != 1) {
# Line 482 | Line 489 | reload_output()
489                                                          oname);
490                                          error(USER, errmsg);
491                                  }
492 <                                if ((sout.xr > 0) & (sout.yr > 0) &&
492 >                                if ((sout.reclen == 1) & (sout.xr > 0) & (sout.yr > 0) &&
493                                                  (!fscnresolu(&xr, &yr, sout.ofp) ||
494                                                          (xr != sout.xr) |
495                                                          (yr != sout.yr))) {
# Line 592 | Line 599 | recover_output()
599                          } else {
600                                  sout.reclen = 0;
601                                  sout.outpipe = 0;
602 +                                sout.xr = xres;
603 +                                sout.yr = yres;
604                                  sout.ofp = NULL;
605                          }
606                          if (sout.ofp != NULL) { /* already open? */
# Line 632 | Line 641 | recover_output()
641                                                  oname);
642                                  error(USER, errmsg);
643                          }
644 <                        sout.xr = xres; sout.yr = yres;
636 <                        if ((sout.xr > 0) & (sout.yr > 0) &&
644 >                        if ((sout.reclen == 1) & (sout.xr > 0) & (sout.yr > 0) &&
645                                          (!fscnresolu(&xr, &yr, sout.ofp) ||
646                                                  (xr != sout.xr) |
647                                                  (yr != sout.yr))) {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines