--- ray/src/util/rcrop.c 2022/03/15 01:44:27 1.3 +++ ray/src/util/rcrop.c 2022/03/16 01:51:16 1.9 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: rcrop.c,v 1.3 2022/03/15 01:44:27 greg Exp $"; +static const char RCSid[] = "$Id: rcrop.c,v 1.9 2022/03/16 01:51:16 greg Exp $"; #endif /* * rcrop.c - crop a Radiance picture or matrix data @@ -18,7 +18,7 @@ char *progname; /* global argv[0] */ VIEW vw = STDVIEW; int gotvw = 0; -char fmt[MAXFMTLEN] = "Unknown"; +char fmt[MAXFMTLEN] = "ascii"; /* assumed when unspecified */ int ncomp = 0; RESOLU res; int rmin, cmin, nrows, ncols; @@ -79,11 +79,11 @@ colr_copyf(FILE *fp) return(1); writerr: fputs(progname, stderr); - fputs(": error writing scanline\n", stderr); + fputs(": error writing picture\n", stderr); return(0); readerr: fputs(progname, stderr); - fputs(": error reading scanline\n", stderr); + fputs(": error reading picture\n", stderr); return(0); } @@ -234,6 +234,10 @@ main(int argc, char *argv[]) fputs(": cannot open for writing\n", stderr); return(1); } +#ifdef getc_unlocked /* avoid stupid semaphores */ + flockfile(fp); + flockfile(stdout); +#endif /* process information header */ if (getheader(fp, headline, NULL) < 0) { fputs(progname, stderr); @@ -257,8 +261,8 @@ main(int argc, char *argv[]) fputs(": illegal crop\n", stderr); return(1); } - printargs(argc, argv, stdout); - if (gotvw) { + printargs(5, argv, stdout); + if (gotvw) { /* adjust view? */ double p0[2], p1[2]; const char *err; if (res.rt & YMAJOR) { @@ -267,10 +271,10 @@ main(int argc, char *argv[]) p1[0] = (cmin+ncols)/(double)res.xr; p1[1] = (rmin+nrows)/(double)res.yr; } else { - p0[1] = cmin/(double)res.xr; - p0[0] = rmin/(double)res.yr; - p1[1] = (cmin+ncols)/(double)res.xr; - p1[0] = (rmin+nrows)/(double)res.yr; + p0[0] = rmin/(double)res.xr; + p0[1] = cmin/(double)res.yr; + p1[0] = (rmin+nrows)/(double)res.xr; + p1[1] = (cmin+ncols)/(double)res.yr; } if (res.rt & XDECR) { p0[0] = 1. - p0[0]; @@ -287,10 +291,11 @@ main(int argc, char *argv[]) fputs(err, stderr); fputc('\n', stderr); return(1); + } else { + fputs(VIEWSTR, stdout); + fprintview(&vw, stdout); + fputc('\n', stdout); } - fputs(VIEWSTR, stdout); - fprintview(&vw, stdout); - fputc('\n', stdout); } if (gotdims) printf("NROWS=%d\nNCOLS=%d\n", nrows, ncols); @@ -315,9 +320,16 @@ main(int argc, char *argv[]) asiz = sizeof(float); } else if (!strcmp(fmt, "double")) { asiz = sizeof(double); + } else if (!strcmp(fmt, "32-bit_encoded_normal")) { + asiz = 4; + ncomp = 1; + } else if (!strcmp(fmt, "16-bit_encoded_depth")) { + asiz = 2; + ncomp = 1; } else if (globmatch(PICFMT, fmt)) { asiz = -1; if (!ncomp) ncomp = 3; + else ncomp *= (ncomp == 3); } else if (strcasecmp(fmt, "ascii")) { fputs(progname, stderr); fputs(": unsupported format - ", stderr); @@ -333,6 +345,11 @@ main(int argc, char *argv[]) if (!(asiz < 0 ? colr_copyf(fp) : !asiz ? ascii_copyf(fp) : binary_copyf(fp, asiz))) return(1); + /* need to consume the rest? */ + if (fp == stdin && rmin+nrows < numscans(&res) && + fseek(fp, 0L, SEEK_END) < 0) + while (getc(fp) != EOF) + ; return(0); usage: fputs("Usage: ", stderr);