--- ray/src/common/resolu.c 1990/09/22 10:44:55 1.1 +++ ray/src/common/resolu.c 2006/06/07 17:52:03 2.6 @@ -1,57 +1,104 @@ #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: resolu.c,v 2.6 2006/06/07 17:52:03 schorsch Exp $"; #endif - /* * Read and write image resolutions. + * + * Externals declared in resolu.h */ +#include "copyright.h" + +#include #include -#include "color.h" +#include "resolu.h" -fputresolu(ord, xres, yres, fp) /* put x and y resolution */ -register int ord; -int xres, yres; +char resolu_buf[RESOLU_BUFLEN]; /* resolution line buffer */ + + +void +fputresolu(ord, sl, ns, fp) /* put out picture dimensions */ +int ord; /* scanline ordering */ +int sl, ns; /* scanline length and number */ FILE *fp; { - if (ord&YMAJOR) - fprintf(fp, "%cY %d %cX %d\n", - ord&YDECR ? '-' : '+', yres, - ord&XDECR ? '-' : '+', xres); - else - fprintf(fp, "%cX %d %cY %d\n", - ord&XDECR ? '-' : '+', xres, - ord&YDECR ? '-' : '+', yres); + RESOLU rs; + + if ((rs.rt = ord) & YMAJOR) { + rs.xr = sl; + rs.yr = ns; + } else { + rs.xr = ns; + rs.yr = sl; + } + fputsresolu(&rs, fp); } -fgetresolu(xrp, yrp, fp) /* get x and y resolution */ -int *xrp, *yrp; +int +fgetresolu(sl, ns, fp) /* get picture dimensions */ +int *sl, *ns; /* scanline length and number */ FILE *fp; { - char buf[64], *xndx, *yndx; - register char *cp; - register int ord; + RESOLU rs; - if (fgets(buf, sizeof(buf), fp) == NULL) + if (!fgetsresolu(&rs, fp)) return(-1); + if (rs.rt & YMAJOR) { + *sl = rs.xr; + *ns = rs.yr; + } else { + *sl = rs.yr; + *ns = rs.xr; + } + return(rs.rt); +} + + +char * +resolu2str(buf, rp) /* convert resolution struct to line */ +char *buf; +register RESOLU *rp; +{ + if (rp->rt&YMAJOR) + sprintf(buf, "%cY %d %cX %d\n", + rp->rt&YDECR ? '-' : '+', rp->yr, + rp->rt&XDECR ? '-' : '+', rp->xr); + else + sprintf(buf, "%cX %d %cY %d\n", + rp->rt&XDECR ? '-' : '+', rp->xr, + rp->rt&YDECR ? '-' : '+', rp->yr); + return(buf); +} + + +int +str2resolu(rp, buf) /* convert resolution line to struct */ +register RESOLU *rp; +char *buf; +{ + register char *xndx, *yndx; + register char *cp; + + if (buf == NULL) + return(0); xndx = yndx = NULL; - for (cp = buf+1; *cp; cp++) + for (cp = buf; *cp; cp++) if (*cp == 'X') xndx = cp; else if (*cp == 'Y') yndx = cp; if (xndx == NULL || yndx == NULL) - return(-1); - ord = 0; - if (xndx > yndx) ord |= YMAJOR; - if (xndx[-1] == '-') ord |= XDECR; - if (yndx[-1] == '-') ord |= YDECR; - if ((*xrp = atoi(xndx+1)) <= 0) - return(-1); - if ((*yrp = atoi(yndx+1)) <= 0) - return(-1); - return(ord); + return(0); + rp->rt = 0; + if (xndx > yndx) rp->rt |= YMAJOR; + if (xndx[-1] == '-') rp->rt |= XDECR; + if (yndx[-1] == '-') rp->rt |= YDECR; + if ((rp->xr = atoi(xndx+1)) <= 0) + return(0); + if ((rp->yr = atoi(yndx+1)) <= 0) + return(0); + return(1); }