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

Comparing ray/src/hd/rhcopy.c (file contents):
Revision 3.18 by schorsch, Mon Jul 21 22:30:18 2003 UTC vs.
Revision 3.32 by greg, Mon Oct 21 18:19:32 2019 UTC

# Line 5 | Line 5 | static const char      RCSid[] = "$Id$";
5   * Copy data into a holodeck file
6   */
7  
8 + #include "platform.h"
9 + #include "rterror.h"
10   #include "holo.h"
11   #include "view.h"
12  
# Line 20 | Line 22 | char   obstr, unobstr;         /* flag pointer values */
22  
23   char    *progname;              /* global argv[0] */
24  
25 + struct phead {
26 +        VIEW    vw;
27 +        double  expos;
28 +        short   gotview;
29 +        short   badfmt;
30 +        short   altprims;
31 + };
32 + static int openholo(char *fname, int append);
33 + static void addray(FVECT ro, FVECT rd, double d, COLR cv);
34 + static gethfunc holheadline;
35 + static int bpcmp(const void *b1p, const void *b2p);
36 + static int addclump(HOLO *hp, int *bq, int nb);
37 + static void addholo(char *hdf);
38 + static gethfunc picheadline;
39 + static void addpicz(char *pcf, char *zbf);
40  
41 < main(argc, argv)
42 < int     argc;
43 < char    *argv[];
41 >
42 >
43 > int
44 > main(
45 >        int     argc,
46 >        char    *argv[]
47 > )
48   {
49          int     i;
50  
# Line 64 | Line 85 | char   *argv[];
85   userr:
86          fprintf(stderr, "Usage: %s output.hdk [-u][-d] -h inp1.hdk ..\n",
87                          progname);
88 <        fprintf(stderr, "   Or: %s output.hdk [-u][-d] -p inp1.pic inp1.zbf ..\n",
88 >        fprintf(stderr, "   Or: %s output.hdk [-u][-d] -p inp1.hdr inp1.zbf ..\n",
89                          progname);
90          exit(1);
91   }
# Line 74 | Line 95 | userr:
95   #define H_OBST  02
96   #define H_OBSF  04
97  
98 < int
99 < holheadline(s, hf)              /* check holodeck header line */
100 < register char   *s;
101 < int     *hf;
98 > static int
99 > holheadline(            /* check holodeck header line */
100 >        char    *s,
101 >        void    *vhf
102 > )
103   {
104 <        char    fmt[32];
104 >        char    fmt[MAXFMTLEN];
105 >        int     *hf = vhf;
106  
107          if (formatval(fmt, s)) {
108                  if (strcmp(fmt, HOLOFMT))
# Line 91 | Line 114 | int    *hf;
114          if (!strncmp(s, "OBSTRUCTIONS=", 13)) {
115                  s += 13;
116                  while (*s == ' ') s++;
117 <                if (*s == 't' | *s == 'T')
117 >                if ((*s == 't') | (*s == 'T'))
118                          *hf |= H_OBST;
119 <                else if (*s == 'f' | *s == 'F')
119 >                else if ((*s == 'f') | (*s == 'F'))
120                          *hf |= H_OBSF;
121                  else
122                          error(WARNING, "bad OBSTRUCTIONS value in holodeck");
# Line 103 | Line 126 | int    *hf;
126   }
127  
128   int
129 < openholo(fname, append)         /* open existing holodeck file for i/o */
130 < char    *fname;
131 < int     append;
129 > openholo(               /* open existing holodeck file for i/o */
130 >        char    *fname,
131 >        int     append
132 > )
133   {
134          FILE    *fp;
135          int     fd;
136          int     hflags = 0;
137 <        long    nextloc;
137 >        off_t   nextloc;
138          int     n;
139                                          /* open holodeck file */
140 <        if ((fp = fopen(fname, append ? "r+" : "r")) == NULL) {
140 >        if ((fp = fopen(fname, append ? "rb+" : "rb")) == NULL) {
141                  sprintf(errmsg, "cannot open \"%s\" for %s", fname,
142                                  append ? "appending" : "reading");
143                  error(SYSTEM, errmsg);
144          }
145                                          /* check header and magic number */
146 <        if (getheader(fp, holheadline, (char *)&hflags) < 0 ||
146 >        if (getheader(fp, holheadline, &hflags) < 0 ||
147                          hflags&H_BADF || getw(fp) != HOLOMAGIC) {
148                  sprintf(errmsg, "file \"%s\" not in holodeck format", fname);
149                  error(USER, errmsg);
# Line 128 | Line 152 | int    append;
152          nextloc = ftell(fp);                    /* get stdio position */
153          fclose(fp);                             /* done with stdio */
154          for (n = 0; nextloc > 0L; n++) {        /* initialize each section */
155 <                lseek(fd, (off_t)nextloc, 0);
155 >                lseek(fd, nextloc, SEEK_SET);
156                  read(fd, (char *)&nextloc, sizeof(nextloc));
157                  hdinit(fd, NULL)->priv = hflags&H_OBST ? &obstr :
158                                  hflags&H_OBSF ? &unobstr : (char *)NULL;
# Line 141 | Line 165 | int    append;
165   #undef H_OBSF
166  
167  
168 < addray(ro, rd, d, cv)           /* add a ray to our output holodeck */
169 < FVECT   ro, rd;
170 < double  d;
171 < COLR    cv;
168 > void
169 > addray(         /* add a ray to our output holodeck */
170 >        FVECT   ro,
171 >        FVECT   rd,
172 >        double  d,
173 >        COLR    cv
174 > )
175   {
176          int     sn, bi, n;
177 <        register HOLO   *hp;
177 >        HOLO    *hp;
178          GCOORD  gc[2];
179 <        BYTE    rr[2][2];
179 >        uby8    rr[2][2];
180          BEAM    *bp;
181          double  d0, d1;
182          unsigned        dc;
183 <        register RAYVAL *rv;
183 >        RAYVAL  *rv;
184                                  /* check each output section */
185          for (sn = noutsects; sn--; ) {
186                  hp = hdlist[sn];
# Line 191 | Line 218 | COLR   cv;
218   static BEAMI    *beamdir;
219  
220   static int
221 < bpcmp(b1p, b2p)                 /* compare beam positions on disk */
222 < int     *b1p, *b2p;
221 > bpcmp(                  /* compare beam positions on disk */
222 >        const void      *b1p,
223 >        const void      *b2p
224 > )
225   {
226 <        register off_t  pdif = beamdir[*b1p].fo - beamdir[*b2p].fo;
226 >        off_t   pdif = beamdir[*(int*)b1p].fo - beamdir[*(int*)b2p].fo;
227  
228          if (pdif > 0L) return(1);
229          if (pdif < 0L) return(-1);
# Line 202 | Line 231 | int    *b1p, *b2p;
231   }
232  
233   static int
234 < addclump(hp, bq, nb)            /* transfer the given clump and free */
235 < HOLO    *hp;
236 < int     *bq, nb;
234 > addclump(               /* transfer the given clump and free */
235 >        HOLO    *hp,
236 >        int     *bq,
237 >        int     nb
238 > )
239   {
240          GCOORD  gc[2];
241          FVECT   ro, rd;
242          double  d;
243          int     i;
244 <        register int    k;
245 <        register BEAM   *bp;
244 >        int     k;
245 >        BEAM    *bp;
246                                          /* sort based on file position */
247          beamdir = hp->bi;
248          qsort((char *)bq, nb, sizeof(*bq), bpcmp);
# Line 234 | Line 265 | int    *bq, nb;
265          return(0);
266   }
267  
268 < addholo(hdf)                    /* add a holodeck file */
269 < char    *hdf;
268 >
269 > void
270 > addholo(                        /* add a holodeck file */
271 >        char    *hdf
272 > )
273   {
274          int     fd;
275                                          /* open the holodeck for reading */
# Line 251 | Line 285 | char   *hdf;
285   }
286  
287  
254 struct phead {
255        VIEW    vw;
256        double  expos;
257        short   gotview;
258        short   badfmt;
259        short   altprims;
260 };
288  
289 <
290 < int
291 < picheadline(s, ph)              /* process picture header line */
292 < char    *s;
293 < struct phead    *ph;
289 > static int
290 > picheadline(            /* process picture header line */
291 >        char    *s,
292 >        void    *vph
293 > )
294   {
295          char    fmt[32];
296 +        struct phead *ph = vph;
297  
298          if (formatval(fmt, s)) {
299                  ph->badfmt = strcmp(fmt, COLRFMT);
# Line 287 | Line 315 | struct phead   *ph;
315   }
316  
317  
318 < addpicz(pcf, zbf)               /* add a picture + depth-buffer */
319 < char    *pcf, *zbf;
318 > void
319 > addpicz(                /* add a picture + depth-buffer */
320 >        char    *pcf,
321 >        char    *zbf
322 > )
323   {
324          FILE    *pfp;
325          int     zfd;
# Line 303 | Line 334 | char   *pcf, *zbf;
334          double  aftd;
335          COLOR   ctmp;
336          int     j;
337 <        register int    i;
337 >        int     i;
338                                  /* open files */
339 <        if ((pfp = fopen(pcf, "r")) == NULL) {
339 >        if ((pfp = fopen(pcf, "rb")) == NULL) {
340                  sprintf(errmsg, "cannot open picture file \"%s\"", pcf);
341                  error(SYSTEM, pcf);
342          }
# Line 313 | Line 344 | char   *pcf, *zbf;
344                  sprintf(errmsg, "cannot open depth file \"%s\"", zbf);
345                  error(SYSTEM, pcf);
346          }
347 +        SET_FD_BINARY(zfd);
348                                  /* load picture header */
349          phd.vw = stdview;
350          phd.expos = 1.0;
351          phd.badfmt = phd.gotview = phd.altprims = 0;
352 <        if (getheader(pfp, picheadline, (char *)&phd) < 0 ||
352 >        if (getheader(pfp, picheadline, &phd) < 0 ||
353                          phd.badfmt || !fgetsresolu(&prs, pfp)) {
354                  sprintf(errmsg, "bad format for picture file \"%s\"", pcf);
355                  error(USER, errmsg);
# Line 328 | Line 360 | char   *pcf, *zbf;
360                  error(USER, errmsg);
361          }
362          if (phd.altprims) {
363 <                sprintf(errmsg, "ignoring primary values in picture \"%s\"",
363 >                sprintf(errmsg, "ignoring color primaries in picture \"%s\"",
364                                  pcf);
365                  error(WARNING, errmsg);
366          }
367                                  /* figure out what to do about exposure */
368 <        if (phd.expos < 0.99 | phd.expos > 1.01) {
368 >        if ((phd.expos < 0.99) | (phd.expos > 1.01)) {
369                  emult = -log(phd.expos)/log(2.);
370                  eshft = emult >= 0. ? emult+.5 : emult-.5;
371                  emult -= (double)eshft;
372 <                if (emult <= 0.01 & emult >= -0.01)
372 >                if ((emult <= 0.01) & (emult >= -0.01))
373                          emult = -1.;
374                  else {
375                          emult = 1./phd.expos;
# Line 350 | Line 382 | char   *pcf, *zbf;
382                                  /* allocate buffers */
383          cscn = (COLR *)malloc(scanlen(&prs)*sizeof(COLR));
384          zscn = (float *)malloc(scanlen(&prs)*sizeof(float));
385 <        if (cscn == NULL | zscn == NULL)
385 >        if ((cscn == NULL) | (zscn == NULL))
386                  error(SYSTEM, "out of memory in addpicz");
387                                  /* read and process each scanline */
388          for (j = 0; j < numscans(&prs); j++) {
# Line 361 | Line 393 | char   *pcf, *zbf;
393                  }
394                  if (eshft)                              /* shift exposure */
395                          shiftcolrs(cscn, i, eshft);
396 <                i *= sizeof(float);                     /* read depth */
397 <                if (read(zfd, (char *)zscn, i) != i) {
396 >                                                        /* read depth */
397 >                if (read(zfd, zscn, i*sizeof(float)) != i*sizeof(float)) {
398                          sprintf(errmsg, "error reading depth file \"%s\"", zbf);
399                          error(USER, errmsg);
400                  }
401 <                for (i = scanlen(&prs); i--; ) {        /* do each pixel */
401 >                while (i--) {                           /* process each pixel */
402 >                        if (zscn[i] <= 0.0)
403 >                                continue;               /* illegal depth */
404                          pix2loc(vl, &prs, i, j);
405                          aftd = viewray(ro, rd, &phd.vw, vl[0], vl[1]);
406                          if (aftd < -FTINY)
# Line 393 | Line 427 | char   *pcf, *zbf;
427  
428  
429   void
430 < eputs(s)                        /* put error message to stderr */
431 < register char  *s;
430 > eputs(                  /* put error message to stderr */
431 >        char  *s
432 > )
433   {
434          static int  midline = 0;
435  
# Line 413 | Line 448 | register char  *s;
448  
449  
450   void
451 < quit(code)                      /* exit the program gracefully */
452 < int     code;
451 > quit(                   /* exit the program gracefully */
452 >        int     code
453 > )
454   {
455          hdsync(NULL, 1);        /* write out any buffered data */
456          exit(code);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines