Annotation of 43BSDTahoe/new/X/showimg/showimg.c, revision 1.1

1.1     ! root        1: /* Program to display images on uVax II/GPX under the X window system.
        !             2:  *
        !             3:  * Bill Wyatt and Jim Gettys, Feb. 12 1986 et. seq.
        !             4:  *
        !             5:  * 4/23/86 WFW
        !             6:  *     Added FITS file reading capability, selected via -fits option.
        !             7:  *
        !             8:  * 7/86  WFW
        !             9:  *     Added disk fits format via -dfits option, for not swapping bytes,
        !            10:  *     but file otherwise in disk format.
        !            11:  *
        !            12:  * 7/86  WFW
        !            13:  *     Added palette subwindow, zoomx4 window, independently resizeable.
        !            14:  *
        !            15:  * 8/11/86  WFW
        !            16:  *     If the palette window needs to be independent instead of a subwindow,
        !            17:  *     then compile with PALWIND defined.
        !            18:  * 
        !            19:  * 8/13/86 WFW
        !            20:  *     Added  ifdef support from Eric Mandel for ROSAT & Einstein images
        !            21:  */
        !            22: 
        !            23: #include <stdio.h>
        !            24: #include <sys/file.h>
        !            25: #include <X/Xlib.h>
        !            26: #include <X/XMenu.h>
        !            27: #include <X/Xkeyboard.h>
        !            28: 
        !            29: #ifdef MC68000
        !            30: #include <sys/types.h>
        !            31: #endif
        !            32: 
        !            33: #include "show.icon.ic"
        !            34: 
        !            35: #include "shimg.h"
        !            36: #include "shopt.h"
        !            37: 
        !            38: #define TESTDEFAULT "=512x512+100+134"
        !            39: #define PICTDEFAULT "+50+100"
        !            40: #define TESTNROWS  512
        !            41: 
        !            42: #define MIN(a,b) (((a) < (b)) ? (a) : (b))
        !            43: #define MAX(a,b) (((a) > (b)) ? (a) : (b))
        !            44: 
        !            45: main(argc, argv)
        !            46: int argc;
        !            47: char **argv;
        !            48: {
        !            49:     struct windmain  maininfo;
        !            50:     struct colorwind colorinfo;
        !            51:     struct imagewind imageinfo;
        !            52: 
        !            53:     Window wind, subwind, palwind, wzoom;
        !            54:     Window iconwindow, iconwzoom;
        !            55: #ifdef PALWIND
        !            56:     Window iconpalwind;   /* palette window is independent, needs icon */
        !            57: #endif
        !            58:     WindowInfo winfo, palwinfo, wzoominfo;
        !            59: 
        !            60: 
        !            61:     Cursor imcursor, pancursor, printcursor, zoom2cursor, zoom4cursor;
        !            62:     Cursor palcursor;
        !            63:     int xcenter = -1;
        !            64:     int ycenter = -1;      /* nominal center of displayed image  */
        !            65:     int xtempzero, ytempzero;
        !            66:     int xzoomsize = 124, yzoomsize = 124;
        !            67:     XMenu *showmenu, *menusetup();
        !            68:     int XMenuSetFreeze(), XMenuActivate();
        !            69:     int *currentflags;
        !            70:     int pane = 0, sel = 0;
        !            71:     int lastpane = 0, lastsel = 0;
        !            72:     unsigned char palette[2048]; /* palette window array */
        !            73:     short *readheader(), *readpict();
        !            74:     int scalepict();
        !            75:     int zoomfactor = 0;     /* replication factor for pixel display */
        !            76:     int oldzoomfactor = 0;
        !            77:     int fd, open(), close(), ipow();
        !            78:     int w_mapped = 1;
        !            79:     int rshift = 0;
        !            80:     int keycode = 0;
        !            81:     int xbut, ybut;
        !            82:     char *malloc();
        !            83:     char *keystring;  
        !            84:     int j, k, l;
        !            85:     
        !            86:     XEvent event, peekevent;
        !            87:     XExposeEvent               *expw  = (XExposeEvent *)&event;
        !            88:     register XKeyOrButtonEvent *but   = (XButtonEvent *)&event;
        !            89:     register XMouseMovedEvent  *mouse = (XMouseMovedEvent *)&event;
        !            90:     
        !            91:     register int downbutton = -1; /* mouse button flag */
        !            92:     register int xzero, yzero;   /* image coordinates of window(0,0) */
        !            93:     register int i;
        !            94:     
        !            95: 
        !            96: /* **** MAIN EXECUTION CODE STARTS HERE  **** */
        !            97: 
        !            98:     maininfo.display = NULL;
        !            99:     colorinfo.nplanes = -1;
        !           100:     imageinfo.pmin = 70000;
        !           101:     imageinfo.pmax = -3000;
        !           102:     imageinfo.headskip = 0;
        !           103:     imageinfo.calibration = 0;
        !           104:     imageinfo.fitsflag = 0;
        !           105: 
        !           106: #ifdef XRAY
        !           107:     imageinfo.ein = 0;
        !           108:     imageinfo.ros = 0;  
        !           109: #endif
        !           110: 
        !           111:     imageinfo.VOP_Flags = VOP_GrayScale | VOP_Initialize;
        !           112:     imageinfo.SOP_Flags = SOP_Linear;
        !           113:     imageinfo.COP_Flags = 0;
        !           114:     imageinfo.FOP_Flags = 0;
        !           115: 
        !           116:     shgetopt(argc, argv, &maininfo, &colorinfo, &imageinfo);
        !           117: 
        !           118:     /* create the cursors */
        !           119:     make_cursors(&imcursor,&pancursor,&printcursor,
        !           120:                 &zoom2cursor, &zoom4cursor, &palcursor);
        !           121:     
        !           122:     /* try for 8 planes (probably only gets 6) */
        !           123:     if (colorinfo.nplanes < 0) 
        !           124:       colorinfo.nplanes = MAX(DisplayPlanes()-4,8);
        !           125:     
        !           126:     /* iterate until cells allocated. Check if enough */
        !           127:     if (XGetColorCells(1, 1, colorinfo.nplanes, 
        !           128:                       &colorinfo.planes, &(colorinfo.pixels[0])) == 0) 
        !           129:       {
        !           130:           while(--colorinfo.nplanes > 2)
        !           131:            if(XGetColorCells(1,1,colorinfo.nplanes,
        !           132:                              &colorinfo.planes,
        !           133:                              &(colorinfo.pixels[0])) != 0)  break;
        !           134:          if(colorinfo.nplanes <= 2) {
        !           135:              fprintf(stderr,"Insufficient color planes resource!\n");
        !           136:              exit(1);
        !           137:          }
        !           138:          if(colorinfo.nplanes < 6) 
        !           139:            fprintf(stderr, "Allocated %d planes\n",colorinfo.nplanes);
        !           140:       }
        !           141: 
        !           142:     colorinfo.ncolors = ipow(2, colorinfo.nplanes);
        !           143: 
        !           144:     /* figure out how many bits we have to left shift the pixels */
        !           145:     colorinfo.shift = 0;
        !           146:     i = colorinfo.pixels[0] | colorinfo.planes;
        !           147:     while (((i >>= 1) & 1) == 0) colorinfo.shift++;
        !           148: 
        !           149:     /* get the menu selections ready */
        !           150:     showmenu = menusetup(argv[0]);
        !           151: 
        !           152:     if(imageinfo.calibration) { /** GENERATE TEST SCREEN */
        !           153:        imageinfo.ncols = imageinfo.nrows = TESTNROWS;
        !           154:        rshift = DisplayPlanes() - colorinfo.nplanes - colorinfo.shift;
        !           155:        if((imageinfo.image = 
        !           156:            (unsigned char *)malloc(imageinfo.nrows*imageinfo.ncols))
        !           157:           == NULL) {
        !           158:            fprintf(stderr,"Can't allocate test image!\n");
        !           159:            exit(1);
        !           160:        }
        !           161:        for (j = 0; j < imageinfo.nrows; j++)
        !           162:          for (i = 0; i < imageinfo.ncols; i++)
        !           163:            *(imageinfo.image + j*imageinfo.ncols + i) = 
        !           164:              ((((i + j)&255) >> rshift) & colorinfo.planes)
        !           165:                + colorinfo.pixels[0];
        !           166:        
        !           167:        wind = XCreate(argv[0], argv[0], 
        !           168:                       maininfo.geometry, TESTDEFAULT, &maininfo.frame,
        !           169:                       100, 134);
        !           170:     }
        !           171:     else {  /** READ IN IMAGE **/
        !           172: 
        !           173: #ifdef XRAY
        !           174:        /* code and conditional added by egm */
        !           175: 
        !           176:        if( imageinfo.ein == 1 ){
        !           177:            eimgopen(imageinfo.ict, imageinfo.filename);
        !           178:        }
        !           179:        else if( imageinfo.ros == 1 ){
        !           180:            strcpy(imageinfo.poename, imageinfo.filename);
        !           181:            strcat(imageinfo.poename, ".poe");
        !           182:            strcpy(imageinfo.hdrname, imageinfo.filename);
        !           183:            strcat(imageinfo.hdrname, ".hdr");
        !           184:            openpoe(imageinfo.muthict, imageinfo.poename, imageinfo.hdrname);
        !           185:        }
        !           186:        else {
        !           187: #endif
        !           188: 
        !           189:            if((fd = open(imageinfo.filename,O_RDONLY,0)) < 0) {
        !           190:                fprintf(stderr,"Error opening file %s\n",imageinfo.filename);
        !           191:                exit(1);
        !           192:            }
        !           193:            if((imageinfo.header =
        !           194:                readheader(fd,imageinfo.headskip,
        !           195:                           &imageinfo.nrows,&imageinfo.ncols,
        !           196:                           imageinfo.fitsflag))
        !           197:               == NULL) {
        !           198:                   fprintf(stderr,"Error reading header of file %s\n",
        !           199:                           imageinfo.filename);
        !           200:                   exit(1);
        !           201:            }
        !           202: 
        !           203: #ifdef PALWIND
        !           204:            sprintf(maininfo.filegeometry,"=%dx%d%s",imageinfo.ncols, 
        !           205:                    imageinfo.nrows, PICTDEFAULT);
        !           206: #else
        !           207:            sprintf(maininfo.filegeometry,"=%dx%d%s",imageinfo.ncols,
        !           208:                    imageinfo.nrows+PALHEIGHT+2*PALBORDER, PICTDEFAULT);
        !           209: #endif 
        !           210: 
        !           211: #ifdef XRAY
        !           212:        }  /* end of conditional code added by egm */
        !           213: #endif
        !           214: 
        !           215:        if((imageinfo.image = 
        !           216:            (unsigned char *)malloc(imageinfo.nrows*imageinfo.ncols))
        !           217:           == NULL) {
        !           218:            fprintf(stderr,"Can't allocate byte image?\n");
        !           219:            exit(1);
        !           220:        }
        !           221: 
        !           222: #ifdef XRAY
        !           223:        /* conditional added by egm */
        !           224: 
        !           225:        if( imageinfo.ein == 1 ) {   /* Einstein XRAY image */
        !           226:            if((imageinfo.picture = 
        !           227:                (short *)malloc(imageinfo.nrows*imageinfo.ncols*2)) == NULL) {
        !           228:                  fprintf(stderr,"Can't allocate xray image?\n");
        !           229:                  exit(1);
        !           230:                }
        !           231:            eimgread(imageinfo.ict,imageinfo.picture, 
        !           232:                     imageinfo.ncols, imageinfo.nrows, 
        !           233:                     imageinfo.iy, imageinfo.iz, 
        !           234:                     imageinfo.zoom,imageinfo.zoom, imageinfo.energy);
        !           235:        }
        !           236:        else if( imageinfo.ros == 1) {   /* ROSAT XRAY image */
        !           237:            selectcenter(imageinfo.muthict, imageinfo.iy, imageinfo.iz);
        !           238:            selectres(imageinfo.muthict, imageinfo.zoom, imageinfo.zoom);
        !           239:            if((imageinfo.picture = 
        !           240:                (short *)malloc(imageinfo.nrows*imageinfo.ncols*2)) == NULL) {
        !           241:                  fprintf(stderr,"Can't allocate xray image?\n");
        !           242:                  exit(1);
        !           243:            }
        !           244:            readpoe(imageinfo.muthict, imageinfo.picture, 
        !           245:                    imageinfo.ncols, imageinfo.nrows);
        !           246:        }
        !           247:        else { 
        !           248: #endif
        !           249:          /* SAOCCD or FITS image */
        !           250:            if((imageinfo.picture =
        !           251:                readpict(fd,imageinfo.nrows,imageinfo.ncols,
        !           252:                         imageinfo.fitsflag)) == NULL) {
        !           253:                fprintf(stderr,"Error reading file %s\n",imageinfo.filename);
        !           254:                exit(1);
        !           255:            }
        !           256:            close(fd);
        !           257: 
        !           258: #ifdef XRAY
        !           259:        }  /* end of conditional added by egm */
        !           260: #endif
        !           261: 
        !           262:        if(imageinfo.pmin == 70000 && imageinfo.pmax == -3000)
        !           263:          maxminpict(imageinfo.picture, imageinfo.nrows, imageinfo.ncols,
        !           264:                     &imageinfo.pmax, &imageinfo.pmin);
        !           265:        scalepict(imageinfo.image, imageinfo.picture, 
        !           266:                  imageinfo.pmax, imageinfo.pmin,
        !           267:                  colorinfo.ncolors, colorinfo.pixels[0], colorinfo.shift,
        !           268:                  imageinfo.nrows, imageinfo.ncols, imageinfo.SOP_Flags);
        !           269:        wind = XCreate(argv[0], argv[0], 
        !           270:                       maininfo.geometry, maininfo.filegeometry,
        !           271:                       &maininfo.frame, 100, 100);
        !           272:     }
        !           273:     if (wind == 0) { 
        !           274:        fprintf(stderr, "XCreate on root failed\n");
        !           275:        exit(1);
        !           276:     }
        !           277:        
        !           278:     /* get current info so as to be ready for subwindow placing */
        !           279:     XQueryWindow(wind, &winfo);
        !           280:     
        !           281:     if((iconwindow =
        !           282:        XCreateWindow(RootWindow, 0, 0,
        !           283:                      show_width, show_height, 0, 0, 0)) == 0)
        !           284:       {
        !           285:          fprintf(stderr, "XCreateWindow on iconwindow failed\n");
        !           286:          exit(1);
        !           287:       }
        !           288:     XSetIconWindow(wind, iconwindow);
        !           289: 
        !           290: #ifdef PALWIND 
        !           291:     if((palwind = XCreateWindow(RootWindow, winfo.x,
        !           292:                                winfo.y+winfo.height,
        !           293:                                winfo.width,
        !           294:                                PALHEIGHT, border_width,
        !           295:                                maininfo.frame.border, BlackPixmap))
        !           296:        == 0) {
        !           297:           fprintf(stderr, "XCreateWindow on palwind failed\n");
        !           298:           exit(1);
        !           299:        }
        !           300:     XStoreName(palwind, argv[0]);
        !           301: #else
        !           302:     if((palwind = XCreateWindow(wind, 0,
        !           303:                                winfo.height-PALHEIGHT-2*PALBORDER,
        !           304:                                winfo.width-2*PALBORDER,
        !           305:                                PALHEIGHT, PALBORDER,
        !           306:                                WhitePixmap, BlackPixmap)) == 0) {
        !           307:                                    fprintf(stderr, "XCreateWindow on palwind failed\n");
        !           308:                                    exit(1);
        !           309:                                }
        !           310: #endif
        !           311:     if((wzoom = XCreateWindow(RootWindow, 
        !           312:                              winfo.x+winfo.width+
        !           313:                              maininfo.frame.bdrwidth,
        !           314:                              winfo.y,
        !           315:                              xzoomsize, yzoomsize, 
        !           316:                              maininfo.frame.bdrwidth,
        !           317:                              maininfo.frame.border, BlackPixmap)) == 0)
        !           318:       {
        !           319:          fprintf(stderr, "XCreateWindow on wzoom failed\n");
        !           320:          exit(1);
        !           321:       }
        !           322:     XStoreName(wzoom, argv[0]);
        !           323:     
        !           324:     if((iconwzoom = XCreateWindow(RootWindow, 0, 0,
        !           325:                                   show_width, show_height, 0, 0, 0)) == 0) {
        !           326:        fprintf(stderr, "XCreateWindow on iconwzoom failed\n");
        !           327:        exit(1);
        !           328:     }
        !           329:     XSetIconWindow(wzoom, iconwzoom);
        !           330: 
        !           331: #ifdef PALWIND
        !           332:     if((iconpalwind = XCreateWindow(RootWindow, 0, 0,
        !           333:                                   show_width, show_height, 0, 0, 0)) == 0) {
        !           334:         fprintf(stderr, "XCreateWindow on iconpalwind failed\n");
        !           335:         exit(1);
        !           336:     }
        !           337:     XSetIconWindow(palwind, iconpalwind);
        !           338: #endif
        !           339: 
        !           340:     /* define the cursors */
        !           341:     XUndefineCursor(wind);
        !           342:     XDefineCursor(wind,imcursor);
        !           343:     
        !           344:     XUndefineCursor(palwind);
        !           345:     XDefineCursor(palwind,palcursor);
        !           346:     
        !           347:     /* assume we display center of image in center of window */
        !           348:     if(xcenter < 0) xcenter = imageinfo.ncols>>1;
        !           349:     if(ycenter < 0) ycenter = imageinfo.nrows>>1;
        !           350:     
        !           351:     XSelectInput(wind, ButtonPressed | ButtonReleased | MouseMoved |
        !           352:                 KeyPressed |
        !           353:                 ExposeRegion | ExposeWindow | ExposeCopy | UnmapWindow);
        !           354:     XSelectInput(iconwindow, ExposeWindow); 
        !           355: 
        !           356:     XSelectInput(wzoom, ExposeWindow | UnmapWindow);
        !           357:     XSelectInput(iconwzoom, ExposeWindow); 
        !           358: 
        !           359: #ifdef PALWIND
        !           360:     XSelectInput(palwind, ExposeWindow | UnmapWindow);
        !           361:     XSelectInput(iconpalwind, ExposeWindow); 
        !           362: #else
        !           363:     XSelectInput(palwind, ExposeWindow);
        !           364: #endif
        !           365: 
        !           366:     XMapWindow(wind);
        !           367:     XMapWindow(wzoom);
        !           368: 
        !           369: #ifdef PALWIND
        !           370:     XMapWindow(palwind);
        !           371: #else
        !           372:     XMapSubwindows(wind); 
        !           373: #endif
        !           374: 
        !           375:     XFlush();
        !           376: 
        !           377:     while(1) {
        !           378:        if(imageinfo.VOP_Flags & VOP_Initialize) {
        !           379:            initcmap(colorinfo.ncolors,colorinfo.cmap,
        !           380:                     colorinfo.pixels[0],colorinfo.nplanes,
        !           381:                     imageinfo.VOP_Flags);
        !           382:            XStoreColors(colorinfo.ncolors, colorinfo.cmap);
        !           383:            imageinfo.VOP_Flags &= ~(VOP_Initialize);
        !           384:        }
        !           385:        
        !           386:        XNextEvent(&event);
        !           387:        
        !           388: #ifdef GLOPEROO
        !           389:        describe_XEvent(event.type, event.window, but->detail,
        !           390:                        wind, palwind, wzoom);
        !           391: #endif
        !           392:        switch((int)event.type) {
        !           393:          case KeyPressed:
        !           394: 
        !           395: #ifdef VAX
        !           396:            keycode = but->detail & 0x00ff;
        !           397:            if(IsCursorKey(keycode)) {
        !           398:                XUpdateMouse(wind,&mouse->x,&mouse->y,&subwind);
        !           399:                i = 1<<zoomfactor;
        !           400:                if(keycode == KC_CURSOR_UP)    mouse->y -= i;
        !           401:                if(keycode == KC_CURSOR_DOWN)  mouse->y += i;
        !           402:                if(keycode == KC_CURSOR_RIGHT) mouse->x += i;
        !           403:                if(keycode == KC_CURSOR_LEFT)  mouse->x -= i;
        !           404:                if(mouse->x < 0) mouse->x = 0;
        !           405:                if(mouse->y < 0) mouse->y = 0;
        !           406:                if(mouse->x >= winfo.width) mouse->x = winfo.width-1;
        !           407:                if(mouse->y >= winfo.height-PALHEIGHT-2*PALBORDER)
        !           408:                    mouse->y = winfo.height-PALHEIGHT-2*PALBORDER-1;
        !           409:                XWarpMouse(wind,(int)mouse->x,(int)mouse->y);
        !           410:            }
        !           411: #else
        !           412:            keystring = XLookupMapping(but, &j);
        !           413:                 /* ANSI cursor keys are esc. seq. */
        !           414:            if(j > 0 && *keystring == '\033') {
        !           415:                i = 1<<zoomfactor;
        !           416:                if(strcmp(keystring,"\033[A") == 0) mouse->y -= i; /* up */
        !           417:                if(strcmp(keystring,"\033[B") == 0) mouse->y += i; /* down */
        !           418:                if(strcmp(keystring,"\033[C") == 0) mouse->x += i; /* right */
        !           419:                if(strcmp(keystring,"\033[D") == 0) mouse->x -= i; /* left */
        !           420:                if(mouse->x < 0) mouse->x = 0;
        !           421:                if(mouse->y < 0) mouse->y = 0;
        !           422:                if(mouse->x >= winfo.width) mouse->x = winfo.width-1;
        !           423:                if(mouse->y >= winfo.height-PALHEIGHT-2*PALBORDER)
        !           424:                XWarpMouse(wind,(int)mouse->x,(int)mouse->y);
        !           425:            }
        !           426: #endif
        !           427:            break;
        !           428: 
        !           429:          case ButtonPressed:   /* Activate Menu ? */
        !           430:            if((but->detail & 
        !           431:                (ControlMask | MetaMask | ShiftMask | ShiftLockMask))
        !           432:               == ControlMask)
        !           433:              {
        !           434:                  XQueryWindow(wind, &winfo);
        !           435:                  XMenuSetFreeze(showmenu);
        !           436:                  pane = lastpane;
        !           437:                  sel = lastsel;
        !           438:                  if(XMenuActivate(showmenu,&pane,&sel,
        !           439:                                   but->x + winfo.x, but->y + winfo.y,
        !           440:                                   ButtonReleased, &currentflags)
        !           441:                     == XM_SUCCESS) {  /* check out the selection */
        !           442:                         lastpane = pane;
        !           443:                         lastsel = sel;
        !           444: 
        !           445:                         switch(*currentflags & PANEMASK) {
        !           446:                      /* EXIT */
        !           447:                           case 0: 
        !           448:                             exit(0); /* normal exit */
        !           449: 
        !           450:                      /* Set `viewing mode' - manipulation of color map */
        !           451:                           case VOP:
        !           452:                             imageinfo.VOP_Flags &= ~(currentflags[1]);
        !           453:                             imageinfo.VOP_Flags |= 
        !           454:                               (*currentflags & SELMASK);
        !           455:                             XUndefineCursor(wind);
        !           456:                             XDefineCursor(wind, imcursor);
        !           457:                             imageinfo.COP_Flags = 0;
        !           458:                             break;
        !           459: 
        !           460:                       /* Set cursor mode - other uses than above */
        !           461:                           case COP:
        !           462:                             /* if in test mode, disable all but viewing */
        !           463:                             if(imageinfo.calibration) break;
        !           464:                             imageinfo.COP_Flags &= ~(currentflags[1]);
        !           465:                             imageinfo.COP_Flags |= 
        !           466:                               (*currentflags & SELMASK);
        !           467:                             if(imageinfo.COP_Flags & COP_Print) {
        !           468:                                 XUndefineCursor(wind);
        !           469:                                 XDefineCursor(wind, printcursor);
        !           470:                             } else if(imageinfo.COP_Flags & COP_Pan) {
        !           471:                                 XUndefineCursor(wind);
        !           472:                                 XDefineCursor(wind, pancursor);
        !           473:                             } else if(imageinfo.COP_Flags & COP_Zoom2) {
        !           474:                                 XUndefineCursor(wind);
        !           475:                                 XDefineCursor(wind, zoom2cursor);
        !           476:                             } else if(imageinfo.COP_Flags & COP_Zoom4) {
        !           477:                                 XUndefineCursor(wind);
        !           478:                                 XDefineCursor(wind, zoom4cursor);
        !           479:                             }
        !           480:                             break;
        !           481: 
        !           482:                     /* set picture scaling mode */
        !           483:                           case SOP:
        !           484:                             /* if in test mode, disable all but viewing */
        !           485:                             if(imageinfo.calibration) break;
        !           486:                             /* first, see if any different */
        !           487:                             if((imageinfo.SOP_Flags & 
        !           488:                                 (*currentflags & SELMASK)) == 0) 
        !           489:                               {
        !           490:                                   imageinfo.SOP_Flags &= 
        !           491:                                     ~(currentflags[1]);
        !           492:                                   imageinfo.SOP_Flags |= 
        !           493:                                     (*currentflags & SELMASK);
        !           494:                                   scalepict(imageinfo.image, 
        !           495:                                             imageinfo.picture,
        !           496:                                             imageinfo.pmax, imageinfo.pmin,
        !           497:                                             colorinfo.ncolors, 
        !           498:                                             colorinfo.pixels[0],
        !           499:                                             colorinfo.shift, 
        !           500:                                             imageinfo.nrows, 
        !           501:                                             imageinfo.ncols, 
        !           502:                                             imageinfo.SOP_Flags);
        !           503:                                   writepix( wind, imageinfo.image, 
        !           504:                                            imageinfo.ncols, 
        !           505:                                            imageinfo.nrows,
        !           506:                                            zoomfactor, 0, 0, 
        !           507:                                            winfo.width, winfo.height,
        !           508:                                            xzero, yzero, 0, GXcopy,
        !           509:                                            AllPlanes);
        !           510:                               }
        !           511:                             break;
        !           512: 
        !           513:                           case FOP:
        !           514:                             /* if in test mode, disable all but viewing */
        !           515:                             if(imageinfo.calibration) break;
        !           516:                             break;
        !           517:                               
        !           518:                           default:
        !           519:                             fprintf(stderr,"Unknown menu pane %d\n",
        !           520:                                     *currentflags>>16);
        !           521:                         }
        !           522:                     }
        !           523:                  break;
        !           524:              }
        !           525:            else if((but->detail &
        !           526:                     (ControlMask | MetaMask | ShiftMask |
        !           527:                      ShiftLockMask)) == 0)
        !           528:              {
        !           529:                  /* check if viewing or cursor operation selected */
        !           530:                  if(imageinfo.COP_Flags) break;
        !           531:                  downbutton = but->detail &
        !           532:                    (RightButton | MiddleButton | LeftButton);
        !           533:                  CalcMap(&winfo,colorinfo.cmap,(int)but->x,(int)but->y,
        !           534:                          colorinfo.ncolors, imageinfo.VOP_Flags,
        !           535:                          downbutton);
        !           536:                  XStoreColors(colorinfo.ncolors,colorinfo.cmap);
        !           537:                  break;
        !           538:              }
        !           539:            break;
        !           540: 
        !           541:          case ButtonReleased:
        !           542:            /* check if viewing or cursor operation selected */
        !           543:            if(imageinfo.COP_Flags) {
        !           544:                if(imageinfo.COP_Flags & COP_Print) {  
        !           545:                    /* print 11x11 picture region */
        !           546:                    prpict(imageinfo.picture, but->x>>zoomfactor,
        !           547:                           but->y>>zoomfactor, xzero, yzero,
        !           548:                           imageinfo.ncols, imageinfo.nrows, 11, 11);
        !           549:                }
        !           550:                /* recenter (pan) on cursor position */
        !           551:                if(imageinfo.COP_Flags & 
        !           552:                   (COP_Pan | COP_Zoom2 | COP_Zoom4)) {
        !           553:                        
        !           554:                       xcenter = xzero + (but->x >> zoomfactor);
        !           555:                       ycenter = yzero + (but->y >> zoomfactor);
        !           556:                        
        !           557:                       /* alter zoomfactor to reflect new zoom */
        !           558:                       if(imageinfo.COP_Flags & COP_Pan) zoomfactor = 0;
        !           559:                       if(imageinfo.COP_Flags & COP_Zoom2) zoomfactor = 1;
        !           560:                       if(imageinfo.COP_Flags & COP_Zoom4) zoomfactor = 2;
        !           561:                        
        !           562:                       xtempzero = 
        !           563:                          MAX( 0, MIN(imageinfo.ncols - 
        !           564:                                      (winfo.width>>zoomfactor),
        !           565:                                    xcenter - (winfo.width>>(zoomfactor+1))));
        !           566:                        
        !           567: #ifdef PALWIND
        !           568:                       ytempzero =
        !           569:                          MAX( 0, MIN(imageinfo.nrows-
        !           570:                                   (winfo.height>>zoomfactor),
        !           571:                                   ycenter - (winfo.height>>(zoomfactor+1))));
        !           572: #else
        !           573:                       ytempzero =
        !           574:                          MAX( 0, MIN(imageinfo.nrows-
        !           575:                                      ((winfo.height-PALHEIGHT-2*PALBORDER)
        !           576:                                       >>zoomfactor),
        !           577:                                  ycenter - ((winfo.height-
        !           578:                                              PALHEIGHT-2*PALBORDER)
        !           579:                                             >>(zoomfactor+1))));
        !           580: #endif
        !           581:                       if(xzero != xtempzero || yzero != ytempzero ||
        !           582:                          oldzoomfactor != zoomfactor)
        !           583:                         {
        !           584:                             xzero = xtempzero;
        !           585:                             yzero = ytempzero;
        !           586:                             writepix( wind, imageinfo.image, 
        !           587:                                      imageinfo.ncols, imageinfo.nrows,
        !           588:                                      zoomfactor, 0, 0, 
        !           589:                                      winfo.width, winfo.height,
        !           590:                                      xzero, yzero, 0, GXcopy, AllPlanes);
        !           591:                             XWarpMouse(wind, (xcenter-xzero)<<zoomfactor, 
        !           592:                                        (ycenter-yzero)<<zoomfactor);
        !           593:                         }
        !           594:                    /* COP_OldFlags = imageinfo.COP_Flags;  */
        !           595:                       oldzoomfactor = zoomfactor;
        !           596:                   }
        !           597:                break;
        !           598:            }
        !           599:            if(downbutton < 0) break;
        !           600:            CalcMap(&winfo,colorinfo.cmap,(int)but->x,(int)but->y,
        !           601:                    colorinfo.ncolors, imageinfo.VOP_Flags,
        !           602:                    downbutton);
        !           603:            XStoreColors(colorinfo.ncolors,colorinfo.cmap);
        !           604:            downbutton = -1;
        !           605:            break;
        !           606: 
        !           607:          case MouseMoved:
        !           608:            XUpdateMouse(wind, &xbut, &ybut, &subwind);
        !           609:            XQueryMouseButtons(wind, &xbut, &ybut,
        !           610:                               &subwind, &mouse->detail);
        !           611:            
        !           612:            if(subwind == 0 && downbutton >= 0) {
        !           613:                CalcMap(&winfo,colorinfo.cmap,xbut,ybut,
        !           614:                        colorinfo.ncolors,
        !           615:                        imageinfo.VOP_Flags,downbutton);
        !           616:                XStoreColors(colorinfo.ncolors,colorinfo.cmap);
        !           617:            }
        !           618:            else { 
        !           619:                updatezoom(wzoom, xzoomsize, yzoomsize,
        !           620:                           (xzero + (but->x >> zoomfactor)),
        !           621:                           (yzero + (but->y >> zoomfactor)),
        !           622:                           imageinfo.ncols, imageinfo.nrows, 
        !           623:                           imageinfo.image, (1<<zoomfactor));
        !           624:            }
        !           625:            break;
        !           626:                
        !           627:            /* On ExposeWindow events, recalculate the image center and
        !           628:             * coordinates of upper left hand corner of window.
        !           629:             */
        !           630:          case ExposeCopy: 
        !           631:          case ExposeWindow:
        !           632:            if(QLength() > 0) {
        !           633:                XPeekEvent(&peekevent);
        !           634:                if(peekevent.type == ExposeWindow &&
        !           635:                   peekevent.window == expw->window) break;
        !           636:            }
        !           637:            
        !           638:            if(expw->window == iconwindow) {
        !           639:                XBitmapBitsPut(iconwindow, 0, 0, 
        !           640:                               show_width, show_height, show_bits,
        !           641:                               WhitePixel, BlackPixel, 0,
        !           642:                               GXcopy, AllPlanes);
        !           643:                break;
        !           644:            }
        !           645:            
        !           646: #ifdef PALWIND
        !           647:            if(expw->window == iconpalwind) {
        !           648:                XBitmapBitsPut(iconpalwind, 0, 0, 
        !           649:                               show_width, show_height, show_bits,
        !           650:                               WhitePixel, BlackPixel, 0,
        !           651:                               GXcopy, AllPlanes);
        !           652:                break;
        !           653:            }
        !           654: #endif
        !           655:            if(expw->window == iconwzoom) {
        !           656:                XBitmapBitsPut(iconwzoom, 0, 0, 
        !           657:                               show_width, show_height, show_bits,
        !           658:                               WhitePixel, BlackPixel, 0,
        !           659:                               GXcopy, AllPlanes);
        !           660:                break;
        !           661:            }
        !           662:                
        !           663:            if(w_mapped == 0) {  /* check if to remap windows */
        !           664: #ifdef PALWIND
        !           665:                if(expw->window != palwind) XMapWindow(palwind);
        !           666: #endif
        !           667:                if(expw->window != wind)    XMapWindow(wind);
        !           668:                if(expw->window != wzoom)   XMapWindow(wzoom);
        !           669:                w_mapped++;
        !           670:            }
        !           671:                
        !           672:            XQueryWindow(wind,&winfo);
        !           673:                
        !           674:            if(expw->window == wind) {
        !           675:                XQueryWindow(palwind,&palwinfo);
        !           676: #ifdef PALWIND
        !           677:                XConfigureWindow(palwind, winfo.x,
        !           678:                                 winfo.y+winfo.height+
        !           679:                                 maininfo.frame.bdrwidth,
        !           680:                                 winfo.width, PALHEIGHT);
        !           681: #else
        !           682:                XConfigureWindow(palwind, 0,
        !           683:                                 winfo.height-PALHEIGHT-2*PALBORDER,
        !           684:                                 winfo.width-2*PALBORDER,
        !           685:                                 PALHEIGHT);
        !           686: #endif
        !           687:                XQueryWindow(wzoom,&wzoominfo);
        !           688:                xzoomsize = wzoominfo.width;
        !           689:                yzoomsize = wzoominfo.height;
        !           690:                XConfigureWindow(wzoom,
        !           691:                                 winfo.x+winfo.width+
        !           692:                                 maininfo.frame.bdrwidth,
        !           693:                                 winfo.y, wzoominfo.width,
        !           694:                                 wzoominfo.height);
        !           695:                
        !           696:                xzero = MAX( 0, 
        !           697:                            MIN(imageinfo.ncols-(winfo.width>>zoomfactor),
        !           698:                                xcenter - 
        !           699:                                (winfo.width>>(zoomfactor+1))));
        !           700: #ifdef PALWIND
        !           701:                yzero = MAX( 0, 
        !           702:                            MIN(nrows-
        !           703:                                (winfo.height>>zoomfactor),
        !           704:                                ycenter -
        !           705:                                (winfo.height>>(zoomfactor+1))));
        !           706: #else
        !           707:                yzero = MAX( 0, 
        !           708:                            MIN(imageinfo.nrows-
        !           709:                                ((winfo.height-PALHEIGHT-2*PALBORDER)
        !           710:                                 >>zoomfactor),
        !           711:                                ycenter - ((winfo.height -
        !           712:                                            PALHEIGHT-2*PALBORDER)
        !           713:                                           >>(zoomfactor+1))));
        !           714: #endif
        !           715:            }
        !           716:            
        !           717:            if(event.type == ExposeCopy) break;
        !           718: 
        !           719:            /* drop through to ExposeRegion to draw the window, and
        !           720:             * redraw the supporting windows */
        !           721: 
        !           722:          case ExposeRegion:
        !           723:            if(expw->window == palwind) {
        !           724:                XQueryWindow(palwind,&palwinfo);
        !           725:                for(i=0; i<palwinfo.width; i++)
        !           726:                  palette[i] =
        !           727:                    ((colorinfo.ncolors * i)/palwinfo.width) + 
        !           728:                      colorinfo.pixels[0];
        !           729:                for(i=0; i<palwinfo.height; i++)
        !           730:                  XPixmapBitsPutZ(palwind, 0, i, 
        !           731:                                  palwinfo.width, 1,
        !           732:                                  palette, 0, GXcopy, AllPlanes);
        !           733:            } 
        !           734:            else if(expw->window == wzoom) {
        !           735:                XQueryWindow(wzoom,&wzoominfo);
        !           736:                xzoomsize = wzoominfo.width;
        !           737:                yzoomsize = wzoominfo.height;
        !           738:                updatezoom(wzoom, xzoomsize, yzoomsize,
        !           739:                           xcenter, ycenter, 
        !           740:                           imageinfo.ncols, imageinfo.nrows,
        !           741:                           imageinfo.image, (1<<zoomfactor));
        !           742:            } 
        !           743:            else {
        !           744:                if( expw->x > imageinfo.ncols<<zoomfactor ||
        !           745:                   expw->y > imageinfo.nrows<<zoomfactor)
        !           746:                  break;
        !           747:                
        !           748:                writepix( wind, imageinfo.image,
        !           749:                         imageinfo.ncols, imageinfo.nrows,
        !           750:                         zoomfactor, expw->x, expw->y, 
        !           751:                         expw->width, expw->height,
        !           752:                         xzero, yzero, 0, GXcopy, AllPlanes);
        !           753:            }
        !           754:            break;
        !           755:                
        !           756:        /* If any window is unmapped, all three are unmapped */
        !           757: 
        !           758:          case UnmapWindow:
        !           759: 
        !           760: #ifdef PALWIND
        !           761:            if(event.window != palwind) XUnmapWindow(palwind);
        !           762: #endif
        !           763:            if(event.window != wzoom)   XUnmapWindow(wzoom);
        !           764:            if(event.window != wind)     XUnmapWindow(wind);
        !           765:            w_mapped = 0;
        !           766:            break;
        !           767:        }
        !           768:     }
        !           769: }
        !           770: 
        !           771: 
        !           772: #ifdef GLOPEROO
        !           773: describe_XEvent(etype, ewindow, detail, wind, palwind, wzoom)
        !           774:      unsigned long etype;
        !           775:      unsigned short detail;
        !           776:      Window ewindow, wind, palwind, wzoom;
        !           777: {
        !           778:     fprintf(stderr,"Window ");
        !           779:     if(ewindow == wind) {
        !           780:        fprintf(stderr,"wind, ");
        !           781:     } else if(ewindow == palwind) {
        !           782:        fprintf(stderr,"palwind, ");
        !           783:     } else if(ewindow == wzoom) {
        !           784:        fprintf(stderr,"wzoom, "); 
        !           785:     } else {
        !           786:        fprintf("ERROR %d\n", ewindow);
        !           787:     }
        !           788:     switch((int)etype) {
        !           789:       case KeyPressed: fprintf(stderr,"KeyPressed"); 
        !           790:                       fprintf(stderr," detail = %x", detail);
        !           791:                       break;
        !           792:       case KeyReleased: fprintf(stderr,"KeyReleased");
        !           793:                       fprintf(stderr," detail = %x", detail);
        !           794:                       break;
        !           795:       case ButtonPressed: fprintf(stderr,"ButtonPressed");
        !           796:                       fprintf(stderr," detail = %x", detail);
        !           797:                       break;
        !           798:       case ButtonReleased: fprintf(stderr,"ButtonReleased");
        !           799:                       fprintf(stderr," detail = %x", detail);
        !           800:                       break;
        !           801:       case EnterWindow: fprintf(stderr,"EnterWindow");
        !           802:                       fprintf(stderr," detail = %x", detail);
        !           803:                       break;
        !           804:       case LeaveWindow: fprintf(stderr,"LeaveWindow");
        !           805:                       fprintf(stderr," detail = %x", detail);
        !           806:                       break;
        !           807:       case MouseMoved: fprintf(stderr,"MouseMoved");
        !           808:                       fprintf(stderr," detail = %x", detail);
        !           809:                       break;
        !           810:       case ExposeWindow: fprintf(stderr,"ExposeWindow"); break;
        !           811:       case ExposeRegion: fprintf(stderr,"ExposeRegion"); break;
        !           812:       case ExposeCopy: fprintf(stderr,"ExposeCopy"); break;
        !           813:       case UnmapWindow: fprintf(stderr,"UnmapWindow"); break;
        !           814:       case FocusChange: fprintf(stderr,"FocusChange"); break;
        !           815:       default: fprintf(stderr,"ERROR %d", etype);
        !           816:                   }
        !           817:     fprintf(stderr,"\n");
        !           818:     fflush(stderr);
        !           819: }
        !           820: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.