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

Comparing ray/src/common/normcodec.c (file contents):
Revision 2.1 by greg, Fri Jul 26 16:18:06 2019 UTC vs.
Revision 2.4 by greg, Mon Aug 26 23:33:24 2019 UTC

# Line 20 | Line 20 | set_nc_defaults(NORMCODEC *ncp)
20          ncp->finp = stdin;
21          ncp->inpname = "<stdin>";
22          ncp->format = 'a';
23 +        ncp->swapped = 0;
24          ncp->res.rt = PIXSTANDARD;
25          if (!progname) progname = "norm_codec";
26   }
# Line 30 | Line 31 | static int
31   headline(char *s, void *p)
32   {
33          NORMCODEC       *ncp = (NORMCODEC *)p;
34 +        int             rv;
35  
36          if (formatval(ncp->inpfmt, s))  /* don't pass format */
37                  return 0;
38  
39 +        if ((rv = isbigendian(s)) >= 0) {
40 +                ncp->swapped = (nativebigendian() != rv);
41 +                return 0;
42 +        }
43          if (ncp->hdrflags & HF_HEADOUT)
44                  fputs(s, stdout);       /* copy to standard output */
45          return 1;
# Line 46 | Line 52 | process_nc_header(NORMCODEC *ncp, int ac, char *av[])
52   {
53          if (ncp->hdrflags & HF_HEADIN &&
54                          getheader(ncp->finp, headline, ncp) < 0) {
55 <                fputs(ncp->inpname, stderr);
56 <                fputs(": bad header\n", stderr);
57 <                return 1;
55 >                if (ncp->hdrflags & HF_STDERR) {
56 >                        fputs(ncp->inpname, stderr);
57 >                        fputs(": bad header\n", stderr);
58 >                }
59 >                return 0;
60          }
61          if (ncp->hdrflags & HF_HEADOUT) {       /* finish header */
62                  if (!(ncp->hdrflags & HF_HEADIN))
# Line 63 | Line 71 | process_nc_header(NORMCODEC *ncp, int ac, char *av[])
71                                  fputformat("ascii", stdout);
72                                  break;
73                          case 'f':
74 +                                fputendian(stdout);
75                                  fputformat("float", stdout);
76                                  break;
77                          case 'd':
78 +                                fputendian(stdout);
79                                  fputformat("double", stdout);
80                                  break;
81                          }
# Line 73 | Line 83 | process_nc_header(NORMCODEC *ncp, int ac, char *av[])
83          }
84                                          /* get/put resolution string */
85          if (ncp->hdrflags & HF_RESIN && !fgetsresolu(&ncp->res, ncp->finp)) {
86 <                fputs(ncp->inpname, stderr);
87 <                fputs(": bad resolution string\n", stderr);
88 <                return 1;
86 >                if (ncp->hdrflags & HF_STDERR) {
87 >                        fputs(ncp->inpname, stderr);
88 >                        fputs(": bad resolution string\n", stderr);
89 >                }
90 >                return 0;
91          }
92          if (ncp->hdrflags & HF_RESOUT)
93                  fputsresolu(&ncp->res, stdout);
# Line 90 | Line 102 | int
102   check_decode_normals(NORMCODEC *ncp)
103   {
104          if (ncp->hdrflags & HF_ENCODE) {
105 <                fputs(progname, stderr);
106 <                fputs(": wrong header mode for decode\n", stderr);
105 >                if (ncp->hdrflags & HF_STDERR) {
106 >                        fputs(progname, stderr);
107 >                        fputs(": wrong header mode for decode\n", stderr);
108 >                }
109                  return 0;
110          }
111          if (ncp->inpfmt[0] && strcmp(ncp->inpfmt, NORMAL32FMT)) {
112 <                fputs(ncp->inpname, stderr);
113 <                fputs(": unexpected input format: ", stderr);
114 <                fputs(ncp->inpfmt, stderr);
115 <                fputc('\n', stderr);
112 >                if (ncp->hdrflags & HF_STDERR) {
113 >                        fputs(ncp->inpname, stderr);
114 >                        fputs(": unexpected input format: ", stderr);
115 >                        fputs(ncp->inpfmt, stderr);
116 >                        fputc('\n', stderr);
117 >                }
118                  return 0;
119          }
120          return 1;
# Line 109 | Line 125 | check_decode_normals(NORMCODEC *ncp)
125   int
126   decode_normal_next(FVECT nrm, NORMCODEC *ncp)
127   {
128 +        int32   lastc;
129 +        FVECT   lastv;
130          int32   c = getint(4, ncp->finp);
131  
132          if (c == EOF && feof(ncp->finp))
# Line 116 | Line 134 | decode_normal_next(FVECT nrm, NORMCODEC *ncp)
134  
135          ncp->curpos += 4;
136  
137 <        decodedir(nrm, c);
138 <
137 >        if (c == lastc) {                       /* optimization */
138 >                VCOPY(nrm, lastv);
139 >        } else {
140 >                decodedir(nrm, c);
141 >                if (c) {
142 >                        lastc = c;
143 >                        VCOPY(lastv, nrm);
144 >                }
145 >        }
146          return (c != 0);
147   }
148  
# Line 129 | Line 154 | seek_nc_pix(NORMCODEC *ncp, int x, int y)
154          long    seekpos;
155  
156          if ((ncp->res.xr <= 0) | (ncp->res.yr <= 0)) {
157 <                fputs(progname, stderr);
158 <                fputs(": need map resolution to seek\n", stderr);
157 >                if (ncp->hdrflags & HF_STDERR) {
158 >                        fputs(progname, stderr);
159 >                        fputs(": need map resolution to seek\n", stderr);
160 >                }
161                  return -1;
162          }
163          if ((x < 0) | (y < 0) ||
164                          (x >= scanlen(&ncp->res)) | (y >= numscans(&ncp->res))) {
165 <                fputs(ncp->inpname, stderr);
166 <                fputs(": warning - pixel index off map\n", stderr);
165 >                if (ncp->hdrflags & HF_STDERR) {
166 >                        fputs(ncp->inpname, stderr);
167 >                        fputs(": warning - pixel index off map\n", stderr);
168 >                }
169                  return 0;
170          }
171          seekpos = ncp->dstart + 4*((long)y*scanlen(&ncp->res) + x);
172  
173          if (seekpos != ncp->curpos &&
174                          fseek(ncp->finp, seekpos, SEEK_SET) == EOF) {
175 <                fputs(ncp->inpname, stderr);
176 <                fputs(": seek error\n", stderr);
175 >                if (ncp->hdrflags & HF_STDERR) {
176 >                        fputs(ncp->inpname, stderr);
177 >                        fputs(": seek error\n", stderr);
178 >                }
179                  return -1;
180          }
181          ncp->curpos = seekpos;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines