void saveview( /* save view to rad file */ char *s ) { char view[64]; char *fname; FILE *fp; if (*atos(view, sizeof(view), s)) { if (isint(view)) { error(COMMAND, "cannot write view by number"); return; } s = sskip(s); } if (nextword(rifname, sizeof(rifname), s) == NULL && !rifname[0]) { error(COMMAND, "no previous rad file"); return; } if ((fname = getpath(rifname, NULL, 0)) == NULL || (fp = fopen(fname, "a")) == NULL) { sprintf(errmsg, "cannot open \"%s\"", rifname); error(COMMAND, errmsg); return; } fputs("view= ", fp); fputs(view, fp); fprintview(&ourview, fp); putc('\n', fp); fclose(fp); }
static void appendview( /* append standard view */ char *nm, VIEW *vp ) { FILE *fp; /* check if already in there */ if (!memcmp(&thisview, vwl[currentview].v, sizeof(VIEW))) { error(COMMAND, "view already in standard list"); return; } /* append to file */ if ((fp = fopen(radfile, "a")) == NULL) { error(COMMAND, "cannot append rad input file"); return; } fputs("view=", fp); if (nm != NULL) { fputc(' ', fp); fputs(nm, fp); } fprintview(vp, fp); fputc('\n', fp); fclose(fp); /* append to our list */ while (vwl[currentview].v != NULL) currentview++; if (currentview >= MAXVIEW) error(INTERNAL, "too many views in appendview"); vwl[currentview].v = (VIEW *)bmalloc(sizeof(VIEW)); *(vwl[currentview].v) = thisview; if (nm != NULL) vwl[currentview].nam = savqstr(nm); }
void writepict( /* write the picture to a file */ char *s ) { static char buf[128]; char *fname; FILE *fp; COLR *scanline; int y; /* XXX relies on words.c 2.11 behavior */ if (nextword(buf, sizeof(buf), s) == NULL && !buf[0]) { error(COMMAND, "no file"); return; } if ((fname = getpath(buf, NULL, 0)) == NULL || (fp = fopen(fname, "w")) == NULL) { sprintf(errmsg, "cannot open \"%s\"", buf); error(COMMAND, errmsg); return; } SET_FILE_BINARY(fp); (*dev->comout)("writing \""); (*dev->comout)(fname); (*dev->comout)("\"...\n"); /* write header */ newheader("RADIANCE", fp); fputs(progname, fp); fprintview(&ourview, fp); if (octname != NULL) fprintf(fp, " %s\n", octname); else putc('\n', fp); fprintf(fp, "SOFTWARE= %s\n", VersionID); fputnow(fp); if (exposure != 1.0) fputexpos(exposure, fp); if (dev->pixaspect != 1.0) fputaspect(dev->pixaspect, fp); fputformat(COLRFMT, fp); putc('\n', fp); fprtresolu(hresolu, vresolu, fp); scanline = (COLR *)malloc(hresolu*sizeof(COLR)); if (scanline == NULL) { error(COMMAND, "not enough memory!"); fclose(fp); unlink(fname); return; } for (y = vresolu-1; y >= 0; y--) { getpictcolrs(y, scanline, &ptrunk, hresolu, vresolu); if (fwritecolrs(scanline, hresolu, fp) < 0) break; } free((void *)scanline); if (fclose(fp) < 0) error(COMMAND, "write error"); }
static void printview(void) /* print our current view to server stdout */ { fputs(VIEWSTR, sstdout); fprintview(&odev.v, sstdout); fputc('\n', sstdout); fflush(sstdout); }
static int getkey( /* get input key */ register XKeyPressedEvent *ekey ) { int n; char buf[8]; n = XLookupString(ekey, buf, sizeof(buf), NULL, NULL); if (n != 1) return(1); switch (buf[0]) { case 'h': /* turn on height motion lock */ headlocked = 1; break; case 'H': /* turn off height motion lock */ headlocked = 0; break; case 'l': /* retrieve last (premouse) view */ if (lastview.type) { VIEW vtmp; vtmp = thisview; dev_view(&lastview); lastview = vtmp; } else XBell(ourdisplay, 0); break; case 'n': /* move to next standard view */ gotoview(currentview+1); break; case 'p': /* move to last standard view */ gotoview(currentview-1); break; case '+': /* zoom in */ zoomview(100+ZOOMPCT, ekey->x, vres-1-ekey->y); break; case '-': /* zoom out */ zoomview(100-ZOOMPCT, ekey->x, vres-1-ekey->y); break; case 'v': /* spit current view to stdout */ fputs(VIEWSTR, stdout); fprintview(&thisview, stdout); fputc('\n', stdout); break; case 'V': /* append view to rad file */ appendview(NULL, &thisview); break; case 'q': /* quit the program */ return(0); default: XBell(ourdisplay, 0); break; } return(1); }
void getview( /* get/show/save view parameters */ char *s ) { FILE *fp; char buf[128]; char *fname; int change = 0; VIEW nv = ourview; while (isspace(*s)) s++; if (*s == '-') { /* command line parameters */ if (sscanview(&nv, s)) newview(&nv); else error(COMMAND, "bad view option(s)"); return; } if (nextword(buf, sizeof(buf), s) != NULL) { /* write to a file */ if ((fname = getpath(buf, NULL, 0)) == NULL || (fp = fopen(fname, "a")) == NULL) { sprintf(errmsg, "cannot open \"%s\"", buf); error(COMMAND, errmsg); return; } fputs(progname, fp); fprintview(&ourview, fp); fputs(sskip(s), fp); putc('\n', fp); fclose(fp); return; } sprintf(buf, "view type (%c): ", ourview.type); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (buf[0] && buf[0] != ourview.type) { nv.type = buf[0]; change++; } sprintf(buf, "view point (%.6g %.6g %.6g): ", ourview.vp[0], ourview.vp[1], ourview.vp[2]); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanvec(buf, nv.vp)) change++; sprintf(buf, "view direction (%.6g %.6g %.6g): ", ourview.vdir[0]*ourview.vdist, ourview.vdir[1]*ourview.vdist, ourview.vdir[2]*ourview.vdist); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanvec(buf, nv.vdir)) { nv.vdist = 1.; change++; } sprintf(buf, "view up (%.6g %.6g %.6g): ", ourview.vup[0], ourview.vup[1], ourview.vup[2]); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanvec(buf, nv.vup)) change++; sprintf(buf, "view horiz and vert size (%.6g %.6g): ", ourview.horiz, ourview.vert); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanf(buf, "%lf %lf", &nv.horiz, &nv.vert) == 2) change++; sprintf(buf, "fore and aft clipping plane (%.6g %.6g): ", ourview.vfore, ourview.vaft); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanf(buf, "%lf %lf", &nv.vfore, &nv.vaft) == 2) change++; sprintf(buf, "view shift and lift (%.6g %.6g): ", ourview.hoff, ourview.voff); (*dev->comout)(buf); (*dev->comin)(buf, NULL); if (buf[0] == CTRL('C')) return; if (sscanf(buf, "%lf %lf", &nv.hoff, &nv.voff) == 2) change++; if (change) newview(&nv); }