|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 24217 (0x5e99)
Types: TextFile
Names: »showimg.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/showimg/showimg.c«
/* Program to display images on uVax II/GPX under the X window system.
*
* Bill Wyatt and Jim Gettys, Feb. 12 1986 et. seq.
*
* 4/23/86 WFW
* Added FITS file reading capability, selected via -fits option.
*
* 7/86 WFW
* Added disk fits format via -dfits option, for not swapping bytes,
* but file otherwise in disk format.
*
* 7/86 WFW
* Added palette subwindow, zoomx4 window, independently resizeable.
*
* 8/11/86 WFW
* If the palette window needs to be independent instead of a subwindow,
* then compile with PALWIND defined.
*
* 8/13/86 WFW
* Added ifdef support from Eric Mandel for ROSAT & Einstein images
*/
#include <stdio.h>
#include <sys/file.h>
#include <X/Xlib.h>
#include <X/XMenu.h>
#include <X/Xkeyboard.h>
#ifdef MC68000
#include <sys/types.h>
#endif
#include "show.icon.ic"
#include "shimg.h"
#include "shopt.h"
#define TESTDEFAULT "=512x512+100+134"
#define PICTDEFAULT "+50+100"
#define TESTNROWS 512
#define MIN(a,b) (((a) < (b)) ? (a) : (b))
#define MAX(a,b) (((a) > (b)) ? (a) : (b))
main(argc, argv)
int argc;
char **argv;
{
struct windmain maininfo;
struct colorwind colorinfo;
struct imagewind imageinfo;
Window wind, subwind, palwind, wzoom;
Window iconwindow, iconwzoom;
#ifdef PALWIND
Window iconpalwind; /* palette window is independent, needs icon */
#endif
WindowInfo winfo, palwinfo, wzoominfo;
Cursor imcursor, pancursor, printcursor, zoom2cursor, zoom4cursor;
Cursor palcursor;
int xcenter = -1;
int ycenter = -1; /* nominal center of displayed image */
int xtempzero, ytempzero;
int xzoomsize = 124, yzoomsize = 124;
XMenu *showmenu, *menusetup();
int XMenuSetFreeze(), XMenuActivate();
int *currentflags;
int pane = 0, sel = 0;
int lastpane = 0, lastsel = 0;
unsigned char palette[2048]; /* palette window array */
short *readheader(), *readpict();
int scalepict();
int zoomfactor = 0; /* replication factor for pixel display */
int oldzoomfactor = 0;
int fd, open(), close(), ipow();
int w_mapped = 1;
int rshift = 0;
int keycode = 0;
int xbut, ybut;
char *malloc();
char *keystring;
int j, k, l;
XEvent event, peekevent;
XExposeEvent *expw = (XExposeEvent *)&event;
register XKeyOrButtonEvent *but = (XButtonEvent *)&event;
register XMouseMovedEvent *mouse = (XMouseMovedEvent *)&event;
register int downbutton = -1; /* mouse button flag */
register int xzero, yzero; /* image coordinates of window(0,0) */
register int i;
/* **** MAIN EXECUTION CODE STARTS HERE **** */
maininfo.display = NULL;
colorinfo.nplanes = -1;
imageinfo.pmin = 70000;
imageinfo.pmax = -3000;
imageinfo.headskip = 0;
imageinfo.calibration = 0;
imageinfo.fitsflag = 0;
#ifdef XRAY
imageinfo.ein = 0;
imageinfo.ros = 0;
#endif
imageinfo.VOP_Flags = VOP_GrayScale | VOP_Initialize;
imageinfo.SOP_Flags = SOP_Linear;
imageinfo.COP_Flags = 0;
imageinfo.FOP_Flags = 0;
shgetopt(argc, argv, &maininfo, &colorinfo, &imageinfo);
/* create the cursors */
make_cursors(&imcursor,&pancursor,&printcursor,
&zoom2cursor, &zoom4cursor, &palcursor);
/* try for 8 planes (probably only gets 6) */
if (colorinfo.nplanes < 0)
colorinfo.nplanes = MAX(DisplayPlanes()-4,8);
/* iterate until cells allocated. Check if enough */
if (XGetColorCells(1, 1, colorinfo.nplanes,
&colorinfo.planes, &(colorinfo.pixels[0])) == 0)
{
while(--colorinfo.nplanes > 2)
if(XGetColorCells(1,1,colorinfo.nplanes,
&colorinfo.planes,
&(colorinfo.pixels[0])) != 0) break;
if(colorinfo.nplanes <= 2) {
fprintf(stderr,"Insufficient color planes resource!\n");
exit(1);
}
if(colorinfo.nplanes < 6)
fprintf(stderr, "Allocated %d planes\n",colorinfo.nplanes);
}
colorinfo.ncolors = ipow(2, colorinfo.nplanes);
/* figure out how many bits we have to left shift the pixels */
colorinfo.shift = 0;
i = colorinfo.pixels[0] | colorinfo.planes;
while (((i >>= 1) & 1) == 0) colorinfo.shift++;
/* get the menu selections ready */
showmenu = menusetup(argv[0]);
if(imageinfo.calibration) { /** GENERATE TEST SCREEN */
imageinfo.ncols = imageinfo.nrows = TESTNROWS;
rshift = DisplayPlanes() - colorinfo.nplanes - colorinfo.shift;
if((imageinfo.image =
(unsigned char *)malloc(imageinfo.nrows*imageinfo.ncols))
== NULL) {
fprintf(stderr,"Can't allocate test image!\n");
exit(1);
}
for (j = 0; j < imageinfo.nrows; j++)
for (i = 0; i < imageinfo.ncols; i++)
*(imageinfo.image + j*imageinfo.ncols + i) =
((((i + j)&255) >> rshift) & colorinfo.planes)
+ colorinfo.pixels[0];
wind = XCreate(argv[0], argv[0],
maininfo.geometry, TESTDEFAULT, &maininfo.frame,
100, 134);
}
else { /** READ IN IMAGE **/
#ifdef XRAY
/* code and conditional added by egm */
if( imageinfo.ein == 1 ){
eimgopen(imageinfo.ict, imageinfo.filename);
}
else if( imageinfo.ros == 1 ){
strcpy(imageinfo.poename, imageinfo.filename);
strcat(imageinfo.poename, ".poe");
strcpy(imageinfo.hdrname, imageinfo.filename);
strcat(imageinfo.hdrname, ".hdr");
openpoe(imageinfo.muthict, imageinfo.poename, imageinfo.hdrname);
}
else {
#endif
if((fd = open(imageinfo.filename,O_RDONLY,0)) < 0) {
fprintf(stderr,"Error opening file %s\n",imageinfo.filename);
exit(1);
}
if((imageinfo.header =
readheader(fd,imageinfo.headskip,
&imageinfo.nrows,&imageinfo.ncols,
imageinfo.fitsflag))
== NULL) {
fprintf(stderr,"Error reading header of file %s\n",
imageinfo.filename);
exit(1);
}
#ifdef PALWIND
sprintf(maininfo.filegeometry,"=%dx%d%s",imageinfo.ncols,
imageinfo.nrows, PICTDEFAULT);
#else
sprintf(maininfo.filegeometry,"=%dx%d%s",imageinfo.ncols,
imageinfo.nrows+PALHEIGHT+2*PALBORDER, PICTDEFAULT);
#endif
#ifdef XRAY
} /* end of conditional code added by egm */
#endif
if((imageinfo.image =
(unsigned char *)malloc(imageinfo.nrows*imageinfo.ncols))
== NULL) {
fprintf(stderr,"Can't allocate byte image?\n");
exit(1);
}
#ifdef XRAY
/* conditional added by egm */
if( imageinfo.ein == 1 ) { /* Einstein XRAY image */
if((imageinfo.picture =
(short *)malloc(imageinfo.nrows*imageinfo.ncols*2)) == NULL) {
fprintf(stderr,"Can't allocate xray image?\n");
exit(1);
}
eimgread(imageinfo.ict,imageinfo.picture,
imageinfo.ncols, imageinfo.nrows,
imageinfo.iy, imageinfo.iz,
imageinfo.zoom,imageinfo.zoom, imageinfo.energy);
}
else if( imageinfo.ros == 1) { /* ROSAT XRAY image */
selectcenter(imageinfo.muthict, imageinfo.iy, imageinfo.iz);
selectres(imageinfo.muthict, imageinfo.zoom, imageinfo.zoom);
if((imageinfo.picture =
(short *)malloc(imageinfo.nrows*imageinfo.ncols*2)) == NULL) {
fprintf(stderr,"Can't allocate xray image?\n");
exit(1);
}
readpoe(imageinfo.muthict, imageinfo.picture,
imageinfo.ncols, imageinfo.nrows);
}
else {
#endif
/* SAOCCD or FITS image */
if((imageinfo.picture =
readpict(fd,imageinfo.nrows,imageinfo.ncols,
imageinfo.fitsflag)) == NULL) {
fprintf(stderr,"Error reading file %s\n",imageinfo.filename);
exit(1);
}
close(fd);
#ifdef XRAY
} /* end of conditional added by egm */
#endif
if(imageinfo.pmin == 70000 && imageinfo.pmax == -3000)
maxminpict(imageinfo.picture, imageinfo.nrows, imageinfo.ncols,
&imageinfo.pmax, &imageinfo.pmin);
scalepict(imageinfo.image, imageinfo.picture,
imageinfo.pmax, imageinfo.pmin,
colorinfo.ncolors, colorinfo.pixels[0], colorinfo.shift,
imageinfo.nrows, imageinfo.ncols, imageinfo.SOP_Flags);
wind = XCreate(argv[0], argv[0],
maininfo.geometry, maininfo.filegeometry,
&maininfo.frame, 100, 100);
}
if (wind == 0) {
fprintf(stderr, "XCreate on root failed\n");
exit(1);
}
/* get current info so as to be ready for subwindow placing */
XQueryWindow(wind, &winfo);
if((iconwindow =
XCreateWindow(RootWindow, 0, 0,
show_width, show_height, 0, 0, 0)) == 0)
{
fprintf(stderr, "XCreateWindow on iconwindow failed\n");
exit(1);
}
XSetIconWindow(wind, iconwindow);
#ifdef PALWIND
if((palwind = XCreateWindow(RootWindow, winfo.x,
winfo.y+winfo.height,
winfo.width,
PALHEIGHT, border_width,
maininfo.frame.border, BlackPixmap))
== 0) {
fprintf(stderr, "XCreateWindow on palwind failed\n");
exit(1);
}
XStoreName(palwind, argv[0]);
#else
if((palwind = XCreateWindow(wind, 0,
winfo.height-PALHEIGHT-2*PALBORDER,
winfo.width-2*PALBORDER,
PALHEIGHT, PALBORDER,
WhitePixmap, BlackPixmap)) == 0) {
fprintf(stderr, "XCreateWindow on palwind failed\n");
exit(1);
}
#endif
if((wzoom = XCreateWindow(RootWindow,
winfo.x+winfo.width+
maininfo.frame.bdrwidth,
winfo.y,
xzoomsize, yzoomsize,
maininfo.frame.bdrwidth,
maininfo.frame.border, BlackPixmap)) == 0)
{
fprintf(stderr, "XCreateWindow on wzoom failed\n");
exit(1);
}
XStoreName(wzoom, argv[0]);
if((iconwzoom = XCreateWindow(RootWindow, 0, 0,
show_width, show_height, 0, 0, 0)) == 0) {
fprintf(stderr, "XCreateWindow on iconwzoom failed\n");
exit(1);
}
XSetIconWindow(wzoom, iconwzoom);
#ifdef PALWIND
if((iconpalwind = XCreateWindow(RootWindow, 0, 0,
show_width, show_height, 0, 0, 0)) == 0) {
fprintf(stderr, "XCreateWindow on iconpalwind failed\n");
exit(1);
}
XSetIconWindow(palwind, iconpalwind);
#endif
/* define the cursors */
XUndefineCursor(wind);
XDefineCursor(wind,imcursor);
XUndefineCursor(palwind);
XDefineCursor(palwind,palcursor);
/* assume we display center of image in center of window */
if(xcenter < 0) xcenter = imageinfo.ncols>>1;
if(ycenter < 0) ycenter = imageinfo.nrows>>1;
XSelectInput(wind, ButtonPressed | ButtonReleased | MouseMoved |
KeyPressed |
ExposeRegion | ExposeWindow | ExposeCopy | UnmapWindow);
XSelectInput(iconwindow, ExposeWindow);
XSelectInput(wzoom, ExposeWindow | UnmapWindow);
XSelectInput(iconwzoom, ExposeWindow);
#ifdef PALWIND
XSelectInput(palwind, ExposeWindow | UnmapWindow);
XSelectInput(iconpalwind, ExposeWindow);
#else
XSelectInput(palwind, ExposeWindow);
#endif
XMapWindow(wind);
XMapWindow(wzoom);
#ifdef PALWIND
XMapWindow(palwind);
#else
XMapSubwindows(wind);
#endif
XFlush();
while(1) {
if(imageinfo.VOP_Flags & VOP_Initialize) {
initcmap(colorinfo.ncolors,colorinfo.cmap,
colorinfo.pixels[0],colorinfo.nplanes,
imageinfo.VOP_Flags);
XStoreColors(colorinfo.ncolors, colorinfo.cmap);
imageinfo.VOP_Flags &= ~(VOP_Initialize);
}
XNextEvent(&event);
#ifdef GLOPEROO
describe_XEvent(event.type, event.window, but->detail,
wind, palwind, wzoom);
#endif
switch((int)event.type) {
case KeyPressed:
#ifdef VAX
keycode = but->detail & 0x00ff;
if(IsCursorKey(keycode)) {
XUpdateMouse(wind,&mouse->x,&mouse->y,&subwind);
i = 1<<zoomfactor;
if(keycode == KC_CURSOR_UP) mouse->y -= i;
if(keycode == KC_CURSOR_DOWN) mouse->y += i;
if(keycode == KC_CURSOR_RIGHT) mouse->x += i;
if(keycode == KC_CURSOR_LEFT) mouse->x -= i;
if(mouse->x < 0) mouse->x = 0;
if(mouse->y < 0) mouse->y = 0;
if(mouse->x >= winfo.width) mouse->x = winfo.width-1;
if(mouse->y >= winfo.height-PALHEIGHT-2*PALBORDER)
mouse->y = winfo.height-PALHEIGHT-2*PALBORDER-1;
XWarpMouse(wind,(int)mouse->x,(int)mouse->y);
}
#else
keystring = XLookupMapping(but, &j);
/* ANSI cursor keys are esc. seq. */
if(j > 0 && *keystring == '\033') {
i = 1<<zoomfactor;
if(strcmp(keystring,"\033[A") == 0) mouse->y -= i; /* up */
if(strcmp(keystring,"\033[B") == 0) mouse->y += i; /* down */
if(strcmp(keystring,"\033[C") == 0) mouse->x += i; /* right */
if(strcmp(keystring,"\033[D") == 0) mouse->x -= i; /* left */
if(mouse->x < 0) mouse->x = 0;
if(mouse->y < 0) mouse->y = 0;
if(mouse->x >= winfo.width) mouse->x = winfo.width-1;
if(mouse->y >= winfo.height-PALHEIGHT-2*PALBORDER)
XWarpMouse(wind,(int)mouse->x,(int)mouse->y);
}
#endif
break;
case ButtonPressed: /* Activate Menu ? */
if((but->detail &
(ControlMask | MetaMask | ShiftMask | ShiftLockMask))
== ControlMask)
{
XQueryWindow(wind, &winfo);
XMenuSetFreeze(showmenu);
pane = lastpane;
sel = lastsel;
if(XMenuActivate(showmenu,&pane,&sel,
but->x + winfo.x, but->y + winfo.y,
ButtonReleased, ¤tflags)
== XM_SUCCESS) { /* check out the selection */
lastpane = pane;
lastsel = sel;
switch(*currentflags & PANEMASK) {
/* EXIT */
case 0:
exit(0); /* normal exit */
/* Set `viewing mode' - manipulation of color map */
case VOP:
imageinfo.VOP_Flags &= ~(currentflags[1]);
imageinfo.VOP_Flags |=
(*currentflags & SELMASK);
XUndefineCursor(wind);
XDefineCursor(wind, imcursor);
imageinfo.COP_Flags = 0;
break;
/* Set cursor mode - other uses than above */
case COP:
/* if in test mode, disable all but viewing */
if(imageinfo.calibration) break;
imageinfo.COP_Flags &= ~(currentflags[1]);
imageinfo.COP_Flags |=
(*currentflags & SELMASK);
if(imageinfo.COP_Flags & COP_Print) {
XUndefineCursor(wind);
XDefineCursor(wind, printcursor);
} else if(imageinfo.COP_Flags & COP_Pan) {
XUndefineCursor(wind);
XDefineCursor(wind, pancursor);
} else if(imageinfo.COP_Flags & COP_Zoom2) {
XUndefineCursor(wind);
XDefineCursor(wind, zoom2cursor);
} else if(imageinfo.COP_Flags & COP_Zoom4) {
XUndefineCursor(wind);
XDefineCursor(wind, zoom4cursor);
}
break;
/* set picture scaling mode */
case SOP:
/* if in test mode, disable all but viewing */
if(imageinfo.calibration) break;
/* first, see if any different */
if((imageinfo.SOP_Flags &
(*currentflags & SELMASK)) == 0)
{
imageinfo.SOP_Flags &=
~(currentflags[1]);
imageinfo.SOP_Flags |=
(*currentflags & SELMASK);
scalepict(imageinfo.image,
imageinfo.picture,
imageinfo.pmax, imageinfo.pmin,
colorinfo.ncolors,
colorinfo.pixels[0],
colorinfo.shift,
imageinfo.nrows,
imageinfo.ncols,
imageinfo.SOP_Flags);
writepix( wind, imageinfo.image,
imageinfo.ncols,
imageinfo.nrows,
zoomfactor, 0, 0,
winfo.width, winfo.height,
xzero, yzero, 0, GXcopy,
AllPlanes);
}
break;
case FOP:
/* if in test mode, disable all but viewing */
if(imageinfo.calibration) break;
break;
default:
fprintf(stderr,"Unknown menu pane %d\n",
*currentflags>>16);
}
}
break;
}
else if((but->detail &
(ControlMask | MetaMask | ShiftMask |
ShiftLockMask)) == 0)
{
/* check if viewing or cursor operation selected */
if(imageinfo.COP_Flags) break;
downbutton = but->detail &
(RightButton | MiddleButton | LeftButton);
CalcMap(&winfo,colorinfo.cmap,(int)but->x,(int)but->y,
colorinfo.ncolors, imageinfo.VOP_Flags,
downbutton);
XStoreColors(colorinfo.ncolors,colorinfo.cmap);
break;
}
break;
case ButtonReleased:
/* check if viewing or cursor operation selected */
if(imageinfo.COP_Flags) {
if(imageinfo.COP_Flags & COP_Print) {
/* print 11x11 picture region */
prpict(imageinfo.picture, but->x>>zoomfactor,
but->y>>zoomfactor, xzero, yzero,
imageinfo.ncols, imageinfo.nrows, 11, 11);
}
/* recenter (pan) on cursor position */
if(imageinfo.COP_Flags &
(COP_Pan | COP_Zoom2 | COP_Zoom4)) {
xcenter = xzero + (but->x >> zoomfactor);
ycenter = yzero + (but->y >> zoomfactor);
/* alter zoomfactor to reflect new zoom */
if(imageinfo.COP_Flags & COP_Pan) zoomfactor = 0;
if(imageinfo.COP_Flags & COP_Zoom2) zoomfactor = 1;
if(imageinfo.COP_Flags & COP_Zoom4) zoomfactor = 2;
xtempzero =
MAX( 0, MIN(imageinfo.ncols -
(winfo.width>>zoomfactor),
xcenter - (winfo.width>>(zoomfactor+1))));
#ifdef PALWIND
ytempzero =
MAX( 0, MIN(imageinfo.nrows-
(winfo.height>>zoomfactor),
ycenter - (winfo.height>>(zoomfactor+1))));
#else
ytempzero =
MAX( 0, MIN(imageinfo.nrows-
((winfo.height-PALHEIGHT-2*PALBORDER)
>>zoomfactor),
ycenter - ((winfo.height-
PALHEIGHT-2*PALBORDER)
>>(zoomfactor+1))));
#endif
if(xzero != xtempzero || yzero != ytempzero ||
oldzoomfactor != zoomfactor)
{
xzero = xtempzero;
yzero = ytempzero;
writepix( wind, imageinfo.image,
imageinfo.ncols, imageinfo.nrows,
zoomfactor, 0, 0,
winfo.width, winfo.height,
xzero, yzero, 0, GXcopy, AllPlanes);
XWarpMouse(wind, (xcenter-xzero)<<zoomfactor,
(ycenter-yzero)<<zoomfactor);
}
/* COP_OldFlags = imageinfo.COP_Flags; */
oldzoomfactor = zoomfactor;
}
break;
}
if(downbutton < 0) break;
CalcMap(&winfo,colorinfo.cmap,(int)but->x,(int)but->y,
colorinfo.ncolors, imageinfo.VOP_Flags,
downbutton);
XStoreColors(colorinfo.ncolors,colorinfo.cmap);
downbutton = -1;
break;
case MouseMoved:
XUpdateMouse(wind, &xbut, &ybut, &subwind);
XQueryMouseButtons(wind, &xbut, &ybut,
&subwind, &mouse->detail);
if(subwind == 0 && downbutton >= 0) {
CalcMap(&winfo,colorinfo.cmap,xbut,ybut,
colorinfo.ncolors,
imageinfo.VOP_Flags,downbutton);
XStoreColors(colorinfo.ncolors,colorinfo.cmap);
}
else {
updatezoom(wzoom, xzoomsize, yzoomsize,
(xzero + (but->x >> zoomfactor)),
(yzero + (but->y >> zoomfactor)),
imageinfo.ncols, imageinfo.nrows,
imageinfo.image, (1<<zoomfactor));
}
break;
/* On ExposeWindow events, recalculate the image center and
* coordinates of upper left hand corner of window.
*/
case ExposeCopy:
case ExposeWindow:
if(QLength() > 0) {
XPeekEvent(&peekevent);
if(peekevent.type == ExposeWindow &&
peekevent.window == expw->window) break;
}
if(expw->window == iconwindow) {
XBitmapBitsPut(iconwindow, 0, 0,
show_width, show_height, show_bits,
WhitePixel, BlackPixel, 0,
GXcopy, AllPlanes);
break;
}
#ifdef PALWIND
if(expw->window == iconpalwind) {
XBitmapBitsPut(iconpalwind, 0, 0,
show_width, show_height, show_bits,
WhitePixel, BlackPixel, 0,
GXcopy, AllPlanes);
break;
}
#endif
if(expw->window == iconwzoom) {
XBitmapBitsPut(iconwzoom, 0, 0,
show_width, show_height, show_bits,
WhitePixel, BlackPixel, 0,
GXcopy, AllPlanes);
break;
}
if(w_mapped == 0) { /* check if to remap windows */
#ifdef PALWIND
if(expw->window != palwind) XMapWindow(palwind);
#endif
if(expw->window != wind) XMapWindow(wind);
if(expw->window != wzoom) XMapWindow(wzoom);
w_mapped++;
}
XQueryWindow(wind,&winfo);
if(expw->window == wind) {
XQueryWindow(palwind,&palwinfo);
#ifdef PALWIND
XConfigureWindow(palwind, winfo.x,
winfo.y+winfo.height+
maininfo.frame.bdrwidth,
winfo.width, PALHEIGHT);
#else
XConfigureWindow(palwind, 0,
winfo.height-PALHEIGHT-2*PALBORDER,
winfo.width-2*PALBORDER,
PALHEIGHT);
#endif
XQueryWindow(wzoom,&wzoominfo);
xzoomsize = wzoominfo.width;
yzoomsize = wzoominfo.height;
XConfigureWindow(wzoom,
winfo.x+winfo.width+
maininfo.frame.bdrwidth,
winfo.y, wzoominfo.width,
wzoominfo.height);
xzero = MAX( 0,
MIN(imageinfo.ncols-(winfo.width>>zoomfactor),
xcenter -
(winfo.width>>(zoomfactor+1))));
#ifdef PALWIND
yzero = MAX( 0,
MIN(nrows-
(winfo.height>>zoomfactor),
ycenter -
(winfo.height>>(zoomfactor+1))));
#else
yzero = MAX( 0,
MIN(imageinfo.nrows-
((winfo.height-PALHEIGHT-2*PALBORDER)
>>zoomfactor),
ycenter - ((winfo.height -
PALHEIGHT-2*PALBORDER)
>>(zoomfactor+1))));
#endif
}
if(event.type == ExposeCopy) break;
/* drop through to ExposeRegion to draw the window, and
* redraw the supporting windows */
case ExposeRegion:
if(expw->window == palwind) {
XQueryWindow(palwind,&palwinfo);
for(i=0; i<palwinfo.width; i++)
palette[i] =
((colorinfo.ncolors * i)/palwinfo.width) +
colorinfo.pixels[0];
for(i=0; i<palwinfo.height; i++)
XPixmapBitsPutZ(palwind, 0, i,
palwinfo.width, 1,
palette, 0, GXcopy, AllPlanes);
}
else if(expw->window == wzoom) {
XQueryWindow(wzoom,&wzoominfo);
xzoomsize = wzoominfo.width;
yzoomsize = wzoominfo.height;
updatezoom(wzoom, xzoomsize, yzoomsize,
xcenter, ycenter,
imageinfo.ncols, imageinfo.nrows,
imageinfo.image, (1<<zoomfactor));
}
else {
if( expw->x > imageinfo.ncols<<zoomfactor ||
expw->y > imageinfo.nrows<<zoomfactor)
break;
writepix( wind, imageinfo.image,
imageinfo.ncols, imageinfo.nrows,
zoomfactor, expw->x, expw->y,
expw->width, expw->height,
xzero, yzero, 0, GXcopy, AllPlanes);
}
break;
/* If any window is unmapped, all three are unmapped */
case UnmapWindow:
#ifdef PALWIND
if(event.window != palwind) XUnmapWindow(palwind);
#endif
if(event.window != wzoom) XUnmapWindow(wzoom);
if(event.window != wind) XUnmapWindow(wind);
w_mapped = 0;
break;
}
}
}
#ifdef GLOPEROO
describe_XEvent(etype, ewindow, detail, wind, palwind, wzoom)
unsigned long etype;
unsigned short detail;
Window ewindow, wind, palwind, wzoom;
{
fprintf(stderr,"Window ");
if(ewindow == wind) {
fprintf(stderr,"wind, ");
} else if(ewindow == palwind) {
fprintf(stderr,"palwind, ");
} else if(ewindow == wzoom) {
fprintf(stderr,"wzoom, ");
} else {
fprintf("ERROR %d\n", ewindow);
}
switch((int)etype) {
case KeyPressed: fprintf(stderr,"KeyPressed");
fprintf(stderr," detail = %x", detail);
break;
case KeyReleased: fprintf(stderr,"KeyReleased");
fprintf(stderr," detail = %x", detail);
break;
case ButtonPressed: fprintf(stderr,"ButtonPressed");
fprintf(stderr," detail = %x", detail);
break;
case ButtonReleased: fprintf(stderr,"ButtonReleased");
fprintf(stderr," detail = %x", detail);
break;
case EnterWindow: fprintf(stderr,"EnterWindow");
fprintf(stderr," detail = %x", detail);
break;
case LeaveWindow: fprintf(stderr,"LeaveWindow");
fprintf(stderr," detail = %x", detail);
break;
case MouseMoved: fprintf(stderr,"MouseMoved");
fprintf(stderr," detail = %x", detail);
break;
case ExposeWindow: fprintf(stderr,"ExposeWindow"); break;
case ExposeRegion: fprintf(stderr,"ExposeRegion"); break;
case ExposeCopy: fprintf(stderr,"ExposeCopy"); break;
case UnmapWindow: fprintf(stderr,"UnmapWindow"); break;
case FocusChange: fprintf(stderr,"FocusChange"); break;
default: fprintf(stderr,"ERROR %d", etype);
}
fprintf(stderr,"\n");
fflush(stderr);
}
#endif