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

Comparing ray/src/util/rcrop.c (file contents):
Revision 1.1 by greg, Tue Mar 15 00:25:50 2022 UTC vs.
Revision 1.4 by greg, Tue Mar 15 02:28:05 2022 UTC

# Line 79 | Line 79 | colr_copyf(FILE *fp)
79                  return(1);
80   writerr:
81          fputs(progname, stderr);
82 <        fputs(": error writing scanline\n", stderr);
82 >        fputs(": error writing picture\n", stderr);
83          return(0);
84   readerr:
85          fputs(progname, stderr);
86 <        fputs(": error reading scanline\n", stderr);
86 >        fputs(": error reading picture\n", stderr);
87          return(0);
88   }
89  
# Line 91 | Line 91 | readerr:
91   static int
92   binary_copyf(FILE *fp, int asize)
93   {
94 +        const int       skip_thresh = 8192;
95          const size_t    elsiz = asize*ncomp;
96          const int       width = scanlen(&res);
97 <        char            *buf = (char *)malloc(elsiz*width);
97 >        const long      skip_len = (width-ncols)*elsiz;
98 >        char            *buf;
99          int             y;
100 <
101 <        if (!buf) {
102 <                fputs(progname, stderr);
103 <                fputs(": out of memory!\n", stderr);
104 <                return(0);
105 <        }
100 >                                        /* check if fseek() useful */
101 >        if (skip_len > skip_thresh &&
102 >                        fseek(fp, (rmin*width + cmin)*elsiz, SEEK_CUR) == 0) {
103 >                buf = (char *)malloc(ncols*elsiz);
104 >                if (!buf)
105 >                        goto memerr;
106 >                for (y = nrows; y-- > 0; ) {
107 >                        if (getbinary(buf, elsiz, ncols, fp) != ncols)
108 >                                goto readerr;
109 >                        if (putbinary(buf, elsiz, ncols, stdout) != ncols)
110 >                                goto writerr;
111 >                        if (y && fseek(fp, skip_len, SEEK_CUR) < 0) {
112 >                                fputs(progname, stderr);
113 >                                fputs(": unexpected seek error on input\n", stderr);
114 >                                return(0);
115 >                        }
116 >                }
117 >                free(buf);              /* success! */
118 >                return(1);
119 >        }                               /* else need to read it all... */
120 >        buf = (char *)malloc(width*elsiz);
121 >        if (!buf)
122 >                goto memerr;
123                                          /* skip rows as requested */
124 <        if (rmin && fseek(fp, rmin*width*elsiz, SEEK_CUR) < 0) {
124 >        if (skip_len > skip_thresh ||
125 >                        (rmin && fseek(fp, rmin*width*elsiz, SEEK_CUR) < 0))
126                  for (y = 0; y < rmin; y++)
127                          if (getbinary(buf, elsiz, width, fp) != width)
128                                  goto readerr;
109        }
129          for (y = 0; y < nrows; y++) {   /* copy portion */
130                  if (getbinary(buf, elsiz, width, fp) != width)
131                          goto readerr;
# Line 124 | Line 143 | readerr:
143          fputs(progname, stderr);
144          fputs(": error reading binary data\n", stderr);
145          return(0);
146 + memerr:
147 +        fputs(progname, stderr);
148 +        fputs(": out of memory!\n", stderr);
149 +        return(0);
150   }
151  
152   /* Read (and copy) specified number of white-space-separated words */
# Line 235 | Line 258 | main(int argc, char *argv[])
258                  return(1);
259          }
260          printargs(argc, argv, stdout);
261 <        if (gotvw) {
261 >        if (gotvw) {            /* adjust view? */
262                  double          p0[2], p1[2];
263                  const char      *err;
264                  if (res.rt & YMAJOR) {
# Line 264 | Line 287 | main(int argc, char *argv[])
287                          fputs(err, stderr);
288                          fputc('\n', stderr);
289                          return(1);
290 +                } else {
291 +                        fputs(VIEWSTR, stdout);
292 +                        fprintview(&vw, stdout);
293 +                        fputc('\n', stdout);
294                  }
268                fputs(VIEWSTR, stdout);
269                fprintview(&vw, stdout);
270                fputc('\n', stdout);
295          }
296          if (gotdims)
297                  printf("NROWS=%d\nNCOLS=%d\n", nrows, ncols);
# Line 295 | Line 319 | main(int argc, char *argv[])
319          } else if (globmatch(PICFMT, fmt)) {
320                  asiz = -1;
321                  if (!ncomp) ncomp = 3;
322 +                else ncomp *= (ncomp == 3);
323          } else if (strcasecmp(fmt, "ascii")) {
324                  fputs(progname, stderr);
325                  fputs(": unsupported format - ", stderr);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines