--- ray/src/px/x11image.c 1993/11/15 10:55:33 2.34 +++ ray/src/px/x11image.c 1995/12/13 09:52:38 2.42 @@ -1,4 +1,4 @@ -/* Copyright (c) 1993 Regents of the University of California */ +/* Copyright (c) 1995 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -56,6 +56,7 @@ static char SCCSid[] = "$SunId$ LBL"; #define redraw(x,y,w,h) patch_raster(wind,(x)-xoff,(y)-yoff,x,y,w,h,ourras) double gamcor = 2.2; /* gamma correction */ +char *gamstr = NULL; /* gamma value override */ int dither = 1; /* dither colors? */ int fast = 0; /* keep picture in Pixmap? */ @@ -73,7 +74,10 @@ int xoff = 0; /* x image offset */ int yoff = 0; /* y image offset */ int parent = 0; /* number of children, -1 if child */ +int sequential = 0; /* display images in sequence */ +char *tout = "od"; /* output of 't' command */ + VIEW ourview = STDVIEW; /* image view parameters */ int gotview = 0; /* got parameters from file */ @@ -112,10 +116,12 @@ char *progname; char errmsg[128]; -extern BYTE clrtab[256][3]; /* global color map */ +BYTE clrtab[256][3]; /* global color map */ extern long ftell(); +extern char *getenv(); + Display *thedisplay; Atom closedownAtom, wmProtocolsAtom; @@ -128,47 +134,50 @@ main(argc, argv) int argc; char *argv[]; { - extern char *getenv(); - char *gv; int headline(); int i; int pid; progname = argv[0]; - if ((gv = getenv("GAMMA")) != NULL) - gamcor = atof(gv); for (i = 1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { - case 'c': + case 'c': /* number of colors */ maxcolors = atoi(argv[++i]); break; - case 'b': + case 'b': /* greyscale only */ greyscale = !greyscale; break; - case 'm': + case 'm': /* monochrome */ + greyscale = 1; maxcolors = 2; break; - case 'd': + case 'd': /* display or dither */ if (argv[i][2] == 'i') dispname = argv[++i]; else dither = !dither; break; - case 'f': + case 'f': /* save pixmap */ fast = !fast; break; - case 'e': + case 's': /* one at a time */ + sequential = !sequential; + break; + case 'o': /* 't' output */ + tout = argv[i]+2; + break; + case 'e': /* exposure comp. */ if (argv[i+1][0] != '+' && argv[i+1][0] != '-') goto userr; scale = atoi(argv[++i]); break; - case 'g': + case 'g': /* gamma comp. */ if (argv[i][2] == 'e') geometry = argv[++i]; else - gamcor = atof(argv[++i]); + gamstr = argv[++i]; break; default: goto userr; @@ -215,15 +224,11 @@ char *argv[]; init(argc, argv); /* get file and open window */ - if (parent < 0) { - kill(getppid(), SIGCONT); /* signal parent if child */ - sigrecv--; - } for ( ; ; ) getevent(); /* main loop */ userr: fprintf(stderr, -"Usage: %s [-di disp][[-ge] spec][-b][-m][-d][-f][-c nclrs][-e +/-stops] pic ..\n", +"Usage: %s [-di disp][[-ge] spec][-b][-m][-d][-f][-c nclrs][-e +/-stops][-g gamcor][-s] pic ..\n", progname); exit(1); } @@ -273,6 +278,13 @@ char **argv; name += i+1; if ((thedisplay = XOpenDisplay(dispname)) == NULL) quiterr("cannot open display"); + /* set gamma value */ + if (gamstr == NULL) /* get it from the X server */ + gamstr = XGetDefault(thedisplay, "radiance", "gamma"); + if (gamstr == NULL) /* get it from the environment */ + gamstr = getenv("DISPLAY_GAMMA"); + if (gamstr != NULL) + gamcor = atof(gamstr); /* get best visual for default screen */ getbestvis(); /* store image */ @@ -299,17 +311,20 @@ char **argv; } } /* open window */ + i = CWEventMask|CWCursor|CWBackPixel|CWBorderPixel; ourwinattr.border_pixel = ourwhite; ourwinattr.background_pixel = ourblack; - ourwinattr.colormap = XCreateColormap(thedisplay, ourroot, - ourvis.visual, AllocNone); + if (ourvis.visual != DefaultVisual(thedisplay,ourscreen)) { + ourwinattr.colormap = newcmap(thedisplay, ourscreen, ourvis.visual); + i |= CWColormap; + } ourwinattr.event_mask = ExposureMask|KeyPressMask|ButtonPressMask| ButtonReleaseMask|ButtonMotionMask|StructureNotifyMask; ourwinattr.cursor = XCreateFontCursor(thedisplay, XC_diamond_cross); wind = XCreateWindow(thedisplay, ourroot, xszhints.x, xszhints.y, xszhints.width, xszhints.height, BORWIDTH, - ourvis.depth, InputOutput, ourvis.visual, CWEventMask| - CWCursor|CWBackPixel|CWBorderPixel|CWColormap, &ourwinattr); + ourvis.depth, InputOutput, ourvis.visual, + i, &ourwinattr); if (wind == 0) quiterr("cannot create window"); width = xmax; @@ -347,7 +362,6 @@ char **argv; XSetWMProtocols(thedisplay, wind, &closedownAtom, 1); XMapWindow(thedisplay, wind); - return; } /* end of init */ @@ -360,10 +374,9 @@ char *err; if (es = err != NULL) fprintf(stderr, "%s: %s: %s\n", progname, fname==NULL?"":fname, err); - if (parent > 0 & wind != 0) { - XDestroyWindow(thedisplay, wind); - XFlush(thedisplay); - } else if (parent < 0 & sigrecv == 0) + if (thedisplay != NULL) + XCloseDisplay(thedisplay); + if (parent < 0 & sigrecv == 0) kill(getppid(), SIGCONT); while (parent > 0 && wait(&cs) != -1) { /* wait for any children */ if (es == 0) @@ -557,6 +570,10 @@ getevent() /* process the next event */ map_rcolors(ourras, wind); if (fast) make_rpixmap(ourras, wind); + if (!sequential & parent < 0 & sigrecv == 0) { + kill(getppid(), SIGCONT); + sigrecv--; + } break; case UnmapNotify: if (!fast) @@ -583,21 +600,45 @@ getevent() /* process the next event */ } -traceray(xpos, ypos) /* print ray corresponding to pixel */ +traceray(xpos, ypos) /* print requested pixel data */ int xpos, ypos; { + extern char *index(); FLOAT hv[2]; FVECT rorg, rdir; + COLOR cval; + register char *cp; - if (!gotview) { /* no view, no can do */ - XBell(thedisplay, 0); - return(-1); - } + box.xmin = xpos; box.xsiz = 1; + box.ymin = ypos; box.ysiz = 1; + avgbox(cval); + scalecolor(cval, 1./exposure); pix2loc(hv, &inpres, xpos-xoff, ypos-yoff); - if (viewray(rorg, rdir, &ourview, hv[0], hv[1]) < 0) - return(-1); - printf("%e %e %e ", rorg[0], rorg[1], rorg[2]); - printf("%e %e %e\n", rdir[0], rdir[1], rdir[2]); + if (!gotview || viewray(rorg, rdir, &ourview, hv[0], hv[1]) < 0) + rorg[0] = rorg[1] = rorg[2] = + rdir[0] = rdir[1] = rdir[2] = 0.; + + for (cp = tout; *cp; cp++) /* print what they asked for */ + switch (*cp) { + case 'o': /* origin */ + printf("%e %e %e ", rorg[0], rorg[1], rorg[2]); + break; + case 'd': /* direction */ + printf("%e %e %e ", rdir[0], rdir[1], rdir[2]); + break; + case 'v': /* radiance value */ + printf("%e %e %e ", colval(cval,RED), + colval(cval,GRN), colval(cval,BLU)); + break; + case 'l': /* luminance */ + printf("%e ", luminance(cval)); + break; + case 'p': /* pixel position */ + printf("%d %d ", (int)(hv[0]*inpres.xr), + (int)(hv[1]*inpres.yr)); + break; + } + putchar('\n'); fflush(stdout); return(0); } @@ -942,14 +983,14 @@ getfull() /* get full (24-bit) data */ colrs_gambs(scanline, xmax); if (ourras->image->blue_mask & 1) for (x = 0; x < xmax; x++) - *dp++ = scanline[x][RED] << 16 | - scanline[x][GRN] << 8 | - scanline[x][BLU] ; + *dp++ = (unsigned int4)scanline[x][RED] << 16 | + (unsigned int4)scanline[x][GRN] << 8 | + (unsigned int4)scanline[x][BLU] ; else for (x = 0; x < xmax; x++) - *dp++ = scanline[x][RED] | - scanline[x][GRN] << 8 | - scanline[x][BLU] << 16 ; + *dp++ = (unsigned int4)scanline[x][RED] | + (unsigned int4)scanline[x][GRN] << 8 | + (unsigned int4)scanline[x][BLU] << 16 ; } } @@ -994,7 +1035,8 @@ getmapped() /* get color-mapped data */ /* set gamma correction */ setcolrgam(gamcor); /* make histogram */ - new_histo(); + if (new_histo((long)xmax*ymax) == -1) + quiterr("cannot initialize histogram"); for (y = 0; y < ymax; y++) { if (getscan(y) < 0) break;