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.5 by greg, Thu Nov 7 23:20:28 2019 UTC

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

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines