Annotation of researchv9/X11/src/X.V11R1/clients/xwud/xwud.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * $Locker:  $ 
        !             3:  */ 
        !             4: static char    *rcsid = "$Header: xwud.c,v 1.14 87/09/11 19:01:19 rws Exp $";
        !             5: #include <X11/copyright.h>
        !             6: 
        !             7: /* Copyright 1985, 1986, Massachusetts Institute of Technology */
        !             8: 
        !             9: /*
        !            10:  * xwud.c - MIT Project Athena, X Window system window raster image
        !            11:  *         undumper.
        !            12:  *
        !            13:  * This program will read a raster image of a window from stdin or a file
        !            14:  * and display it on an X display.
        !            15:  *
        !            16:  *  Author:    Tony Della Fera, DEC
        !            17:  *
        !            18:  *  Modified 11/14/86 by William F. Wyatt,
        !            19:  *                        Smithsonian Astrophysical Observatory
        !            20:  *    allows writing of monochrome XYFormat window dump files on a color
        !            21:  *    display, using default WhitePixel for 1's and BlackPixel for 0's.
        !            22:  *
        !            23:  *  Modified 11/20/86 WFW
        !            24:  *    VERSION 6 - same as V5 for monochrome, but expects color map info
        !            25:  *    in the file for color images. Checks to see if the requested
        !            26:  *    colors are already in the display's map (e.g. if the window dump
        !            27:  *    and undump are contemporaneous to the same display). If so,
        !            28:  *    undump immediately. If not, request new colors, alter the 
        !            29:  *    pixels to the new values, then write the pixmap. Note that
        !            30:  *    multi-plane XY format undumps don't work if the pixel values
        !            31:  *    corresponding to the requested colors have to be changed.
        !            32:  */
        !            33: 
        !            34: #ifndef lint
        !            35: static char *rcsid_xwud_c = "$Header: xwud.c,v 1.14 87/09/11 19:01:19 rws Exp $";
        !            36: #endif
        !            37: 
        !            38: #include <X11/Xlib.h>
        !            39: #include <X11/Xutil.h>
        !            40: #include <stdio.h>
        !            41: #include <strings.h>
        !            42: #include <sys/types.h>
        !            43: extern char *calloc();
        !            44: #include "dsimple.h"
        !            45: 
        !            46: #include <X11/XWDFile.h>
        !            47: 
        !            48: extern int errno;
        !            49: 
        !            50: usage()
        !            51: {
        !            52:     outl("%s: %s [-help][-debug][-inverse][-in <file>][[host]:vs]\n",
        !            53:         program_name, program_name);
        !            54:     exit(1);
        !            55: }
        !            56: 
        !            57: main(argc, argv)
        !            58:     int argc;
        !            59:     char **argv;
        !            60: {
        !            61:     register int i;
        !            62:     XImage image;
        !            63:     XSetWindowAttributes attributes;
        !            64:     XVisualInfo vinfo, *vinfos;
        !            65:     Visual *visual = NULL;
        !            66:     register char *buffer;
        !            67: 
        !            68:     unsigned long swaptest = 1;
        !            69:     int j, status;
        !            70:     unsigned buffer_size;
        !            71:     int win_name_size;
        !            72:     int ncolors;
        !            73:     char *str_index;
        !            74:     char *file_name;
        !            75:     char *win_name;
        !            76:     Bool standard_in = True;
        !            77:     Bool debug = False, inverse = False;
        !            78: 
        !            79:     XColor *colors;
        !            80:     Window image_win;
        !            81:     int win_depth;
        !            82:     Colormap colormap;
        !            83:     XEvent event;
        !            84:     register XExposeEvent *expose = (XExposeEvent *)&event;
        !            85: 
        !            86:     GC gc;
        !            87:     XGCValues gc_val;
        !            88: 
        !            89:     XWDFileHeader header;
        !            90: 
        !            91:     FILE *in_file = stdin;
        !            92: 
        !            93:     INIT_NAME;
        !            94: 
        !            95:     Setup_Display_And_Screen(&argc, argv);
        !            96: 
        !            97:     for (i = 1; i < argc; i++) {
        !            98:        str_index = (char *) index (argv [i], '-');
        !            99:        if (str_index == NULL) usage();
        !           100:        if (strncmp(argv[i], "-help", 5) == 0) {
        !           101:            usage();
        !           102:        }
        !           103:        if (strncmp(argv[i], "-in", 4) == 0) {
        !           104:            if (++i >= argc) usage();
        !           105:            file_name = argv[i];
        !           106:            standard_in = False;
        !           107:            continue;
        !           108:        }
        !           109:        if(strcmp(argv[i], "-inverse") == 0) {
        !           110:            inverse = True;
        !           111:            continue;
        !           112:        }
        !           113:        if(strcmp(argv[i], "-debug") == 0) {
        !           114:            debug = True;
        !           115:            continue;
        !           116:        }
        !           117:        usage();
        !           118:     }
        !           119:     
        !           120:     if (!standard_in) {
        !           121:        /*
        !           122:         * Open the output file.
        !           123:         */
        !           124:        in_file = fopen(file_name, "r");
        !           125:        if (in_file == NULL) {
        !           126:            Error("Can't open output file as specified.");
        !           127:        }
        !           128:     }
        !           129:     
        !           130:     /*
        !           131:      * Read in header information.
        !           132:      */
        !           133:     if(fread((char *)&header, sizeof(header), 1, in_file) != 1)
        !           134:       Error("Unable to read dump file header.");
        !           135: 
        !           136:     if (*(char *) &swaptest)
        !           137:        _swaplong((char *) &header, sizeof(header));
        !           138: 
        !           139:     /*
        !           140:      * check to see if the dump file is in the proper format.
        !           141:      */
        !           142:     if (header.file_version != XWD_FILE_VERSION) {
        !           143:        fprintf(stderr,"xwud: XWD file format version missmatch.");
        !           144:        Error("exiting.");
        !           145:     }
        !           146:     if (header.header_size < sizeof(header)) {
        !           147:        fprintf(stderr,"xwud: XWD header size is too small.");
        !           148:        Error("exiting.");
        !           149:     }
        !           150: 
        !           151:     /*
        !           152:      * Calloc window name.
        !           153:      */
        !           154:     win_name_size = (header.header_size - sizeof(header));
        !           155:     if((win_name = calloc((unsigned) win_name_size, sizeof(char))) == NULL)
        !           156:       Error("Can't calloc window name storage.");
        !           157: 
        !           158:     /*
        !           159:      * Read in window name.
        !           160:      */
        !           161:     if(fread(win_name, sizeof(char), win_name_size, in_file) != win_name_size)
        !           162:       Error("Unable to read window name from dump file.");
        !           163: 
        !           164:     image.width = (int) header.pixmap_width;
        !           165:     image.height = (int) header.pixmap_height;
        !           166:     image.xoffset = (int) header.xoffset;
        !           167:     image.format = (int) header.pixmap_format;
        !           168:     image.byte_order = (int) header.byte_order;
        !           169:     image.bitmap_unit = (int) header.bitmap_unit;
        !           170:     image.bitmap_bit_order = (int) header.bitmap_bit_order;
        !           171:     image.bitmap_pad = (int) header.bitmap_pad;
        !           172:     image.depth = (int) header.pixmap_depth;
        !           173:     image.bits_per_pixel = (int) header.bits_per_pixel;
        !           174:     image.bytes_per_line = (int) header.bytes_per_line;
        !           175:     image.red_mask = header.red_mask;
        !           176:     image.green_mask = header.green_mask;
        !           177:     image.blue_mask = header.blue_mask;
        !           178:     image.obdata = NULL;
        !           179:     _XInitImageFuncPtrs(&image);
        !           180: 
        !           181: 
        !           182:     /* Calloc the color map buffer.
        !           183:      * Read it in, copy it and use the copy to query for the
        !           184:      * existing colors at those pixel values.
        !           185:      */
        !           186:     if(ncolors = header.ncolors) {
        !           187:        colors = (XColor *)calloc(ncolors,sizeof(XColor));
        !           188:        if(fread((char *) colors, sizeof(XColor), ncolors, in_file) != ncolors)
        !           189:          Error("Unable to read color map from dump file.");
        !           190:        if(debug)
        !           191:          fprintf(stderr,"Read %d colors\n", ncolors);
        !           192:        if (*(char *) &swaptest) {
        !           193:            for (i = 0; i < ncolors; i++) {
        !           194:                _swaplong((char *) &colors[i].pixel, sizeof(long));
        !           195:                _swapshort((char *) &colors[i].red, 3 * sizeof(short));
        !           196:            }
        !           197:        }
        !           198:     }
        !           199: 
        !           200:     /*
        !           201:      * Calloc the pixel buffer.
        !           202:      */
        !           203:     buffer_size = Image_Size(&image);
        !           204:     if((buffer = calloc(buffer_size, 1)) == NULL)
        !           205:       Error("Can't calloc data buffer.");
        !           206:     image.data = buffer;
        !           207: 
        !           208:     /*
        !           209:      * Read in the pixmap buffer.
        !           210:      */
        !           211:     if((status = fread(buffer, sizeof(char), (int)buffer_size, in_file))
        !           212:        != buffer_size){
        !           213:        /*  Add elaboration on error here. %%*/
        !           214:         Error("Unable to read pixmap from dump file.");
        !           215:     }
        !           216:     /*
        !           217:      * Close the input file.
        !           218:      */
        !           219:     (void) fclose(in_file);
        !           220: 
        !           221:     vinfo.screen = screen;
        !           222:     vinfo.depth = (int) header.pixmap_depth;
        !           223:     vinfo.class = (int) header.visual_class;
        !           224:     vinfo.red_mask = header.red_mask;
        !           225:     vinfo.green_mask = header.green_mask;
        !           226:     vinfo.blue_mask = header.blue_mask;
        !           227:     vinfo.colormap_size = (int) header.colormap_entries;
        !           228:     vinfo.bits_per_rgb = (int) header.bits_per_rgb;
        !           229: 
        !           230:     vinfos = (XVisualInfo *)
        !           231:             XGetVisualInfo(dpy,
        !           232:                            /* XXX ignoring rgb mask differences */
        !           233:                            VisualScreenMask|VisualDepthMask|VisualClassMask|
        !           234:                            VisualColormapSizeMask|VisualBitsPerRGBMask,
        !           235:                            &vinfo,
        !           236:                            &j);
        !           237:     if (j > 0) {
        !           238:         visual = vinfos[0].visual;
        !           239:        win_depth = vinfo.depth;
        !           240:     } else if (header.pixmap_depth == 1) {
        !           241:         visual = DefaultVisual(dpy, screen);
        !           242:        win_depth = DefaultDepth(dpy, screen);
        !           243:        image.format = XYBitmap;
        !           244:     } else {
        !           245:        fprintf(stderr, "xwud: could not find matching visual.\n");
        !           246:        Error("exiting.");
        !           247:     }
        !           248:     
        !           249:     /* XXX */
        !           250:     if (visual == DefaultVisual(dpy, screen))
        !           251:         colormap = DefaultColormap(dpy, screen);
        !           252:        /* XXX */
        !           253: #ifdef notdef
        !           254:        colormap = ModifyColors(image, visual, colormap, colors, ncolors);
        !           255: #endif
        !           256:     else {
        !           257:        colormap = XCreateColormap(dpy, RootWindow(dpy, screen), visual,
        !           258:                                   visual->class & 1);
        !           259:        if (visual->class & 1)
        !           260:            XStoreColors(dpy, colormap, colors, ncolors);
        !           261:        /* XXX colors may not be accurate for static maps */
        !           262:     }
        !           263: 
        !           264: 
        !           265:     if (colormap != DefaultColormap(dpy, screen))
        !           266:        XInstallColormap(dpy, colormap); /* XXX */
        !           267: 
        !           268:     /*
        !           269:      * Create the image window.
        !           270:      */
        !           271: 
        !           272:     attributes.override_redirect = True;
        !           273:     attributes.background_pixel = BlackPixel(dpy, screen); /* XXX */
        !           274:     attributes.colormap = colormap;
        !           275: 
        !           276:     image_win = XCreateWindow(dpy,
        !           277:        RootWindow(dpy, screen),
        !           278:        header.window_x, header.window_y,
        !           279:        header.pixmap_width, header.pixmap_height,
        !           280:        0, win_depth, InputOutput, visual,
        !           281:        CWOverrideRedirect|CWBackPixel|CWColormap, &attributes);
        !           282: 
        !           283:     if (!image_win) Error("Can't create image window.");
        !           284: 
        !           285:     /*
        !           286:      * Select mouse ButtonPressed on the window, this is how we determine
        !           287:      * when to stop displaying the window.
        !           288:      */
        !           289:     XSelectInput(dpy,image_win, (ButtonPressMask | ExposureMask));
        !           290:      
        !           291:     /*
        !           292:      * Store the window name string.
        !           293:      */
        !           294:     XStoreName(dpy, image_win, win_name);
        !           295:     
        !           296:     /*
        !           297:      * Map the image window.
        !           298:      */
        !           299:     XMapWindow(dpy, image_win);
        !           300: 
        !           301:     /* XXX */
        !           302:     if (inverse) {
        !           303:        gc_val.foreground = (unsigned long) WhitePixel (dpy, screen); 
        !           304:        gc_val.background = (unsigned long) BlackPixel (dpy, screen); 
        !           305:     } else {
        !           306:        gc_val.foreground = (unsigned long) BlackPixel (dpy, screen);
        !           307:        gc_val.background = (unsigned long) WhitePixel (dpy, screen); 
        !           308:     }
        !           309:     gc = XCreateGC (dpy, image_win, GCForeground|GCBackground, &gc_val);
        !           310: 
        !           311:     /*
        !           312:      * Set up a while loop to maintain the image.
        !           313:      */
        !           314: 
        !           315:     while (True) {
        !           316:        /*
        !           317:         * Wait on mouse input event to terminate.
        !           318:         */
        !           319:        XNextEvent(dpy, &event);
        !           320:        if (event.type == ButtonPress) break;
        !           321: 
        !           322:        switch((int)event.type) {
        !           323:          case Expose:
        !           324:              if (expose->x < image.width &&
        !           325:                  expose->y < image.height) {
        !           326:                  if ((image.width - expose->x) < expose->width)
        !           327:                      expose->width = image.width - expose->x;
        !           328:                  if ((image.height - expose->y) < expose->height)
        !           329:                      expose->height = image.height - expose->y;
        !           330:                  XPutImage(dpy, image_win, gc, &image,
        !           331:                            expose->x, expose->y, expose->x, expose->y,
        !           332:                            expose->width, expose->height);
        !           333:              }
        !           334:        }
        !           335:     }
        !           336: 
        !           337:     /*
        !           338:      * Destroy the image window.
        !           339:      */
        !           340:     XDestroyWindow(dpy, image_win);
        !           341:     
        !           342:     /*
        !           343:      * Free the pixmap buffer.
        !           344:      */
        !           345:     free(buffer);
        !           346: 
        !           347:     /*
        !           348:      * Free window name string.
        !           349:      */
        !           350:     free(win_name);
        !           351:     exit(0);
        !           352: }
        !           353: 
        !           354: #ifdef notdef
        !           355: Colormap
        !           356: ModifyColors(image, visual, colormap, colors, ncolors)
        !           357:        XImage *image;
        !           358:        Visual *visual;
        !           359:        Colormap colormap;
        !           360:        XColor *colors;
        !           361:        int ncolors;
        !           362: {
        !           363:     unsigned long *cplanes, *cpixels;
        !           364:     XColor *copycolors;
        !           365:     register int *histbuffer;
        !           366:     register u_short *wbuffer;
        !           367:        
        !           368:     /*
        !           369:      * If necessary, get and store the new colors, convert the pixels to the
        !           370:      * new colors appropriately.
        !           371:      */
        !           372:     if(ncolors) {
        !           373:        copycolors = (XColor *)calloc(ncolors,sizeof(XColor));
        !           374:        bcopy(colors, copycolors, sizeof(XColor)*ncolors);
        !           375:        if(XQueryColors(dpy, colormap, copycolors, ncolors) == 0)
        !           376:          Error("Can't query the color map?");
        !           377:        for(i=0; i<ncolors; i++)
        !           378:          if(!ColorEqual(&colors[i], &copycolors[i])) {
        !           379:              copycolors = True;
        !           380:              break;
        !           381:          }
        !           382:        if(debug) {
        !           383:            if(copycolors)  fprintf(stderr,"New colors needed\n");
        !           384:            else fprintf(stderr,"Old colors match!\n");
        !           385:        }
        !           386:        cpixels = (unsigned long *)calloc(ncolors+1,sizeof(int));
        !           387:        if(XAllocColorCells(dpy, colormap, 0, cplanes, 0, cpixels, 
        !           388:             (unsigned int) ncolors) == 0)
        !           389: 
        !           390: /*  Old arguments (for XGetColorCells() in X10) were: 
        !           391:                0, ncolors, 0, &cplanes, cpixels %%*/
        !           392: 
        !           393:          Error("Can't allocate colors.");
        !           394:        for(i=0; i<ncolors; i++) {
        !           395:            copycolors[i].pixel = cpixels[i];
        !           396:            copycolors[i].red   = colors[i].red;
        !           397:            copycolors[i].green = colors[i].green;
        !           398:            copycolors[i].blue  = colors[i].blue;
        !           399:            if(debug) 
        !           400:              fprintf(stderr,"Pixel %4d, r = %5d  g = %5d  b = %5d\n",
        !           401:                      copycolors[i].pixel, copycolors[i].red,
        !           402:                      copycolors[i].green, copycolors[i].blue);
        !           403:        }
        !           404:        XStoreColors(ncolors, copycolors);
        !           405: 
        !           406:        /* now, make a lookup table to convert old pixels into the new ones*/
        !           407:        if(header.pixmap_format == ZPixmap) {
        !           408:            if(header.display_planes < 9) {
        !           409:                histbuffer = (int *)calloc(256, sizeof(int));
        !           410:                bzero(histbuffer, 256*sizeof(int));
        !           411:                for(i=0; i<ncolors; i++)
        !           412:                  histbuffer[colors[i].pixel] = copycolors[i].pixel;
        !           413:                for(i=0; i<buffer_size; i++)
        !           414:                  buffer[i] = histbuffer[buffer[i]];
        !           415:            }
        !           416:            else if(header.display_planes < 17) {
        !           417:                histbuffer = (int *)calloc(65536, sizeof(int));
        !           418:                bzero(histbuffer, 65536*sizeof(int));
        !           419:                for(i=0; i<ncolors; i++)
        !           420:                  histbuffer[colors[i].pixel] = copycolors[i].pixel;
        !           421:                wbuffer = (u_short *)buffer;
        !           422:                for(i=0; i<(buffer_size/sizeof(u_short)); i++)
        !           423:                  wbuffer[i] = histbuffer[wbuffer[i]];
        !           424:            } 
        !           425:            else if(header.display_planes > 16) {
        !           426:                Error("Unable to handle more than 16 planes at this time");
        !           427:            }
        !           428:            free(histbuffer);
        !           429:        }
        !           430:        free(cpixels);
        !           431:        bcopy(copycolors, colors, sizeof(XColor)*ncolors);
        !           432:        free(copycolors);
        !           433:     }
        !           434:     return colormap;
        !           435: }
        !           436: 
        !           437: /*
        !           438:  * test two color map entries for equality
        !           439:  */
        !           440: ColorEqual(color1, color2)
        !           441:      register XColor *color1, *color2;
        !           442: {
        !           443:     return(color1->pixel == color2->pixel &&
        !           444:           color1->red   == color2->red &&
        !           445:           color1->green == color2->green &&
        !           446:           color1->blue  == color2->blue);
        !           447: }
        !           448: 
        !           449: #endif
        !           450: 
        !           451: int Image_Size(image)
        !           452:      XImage *image;
        !           453: {
        !           454:     if (image->format != ZPixmap)
        !           455:       return(image->bytes_per_line * image->height * image->depth);
        !           456: 
        !           457:     return(image->bytes_per_line * image->height);
        !           458: 
        !           459: }
        !           460: 
        !           461: /*
        !           462:  * Error - Fatal xwud error.
        !           463:  */
        !           464: Error(string)
        !           465:        char *string;   /* Error description string. */
        !           466: {
        !           467:        fprintf(stderr, "xwud: Error => %s\n", string);
        !           468: 
        !           469:        if (errno != 0) {
        !           470:                perror("xwud");
        !           471:                fprintf(stderr, "\n");
        !           472:        }
        !           473: 
        !           474:        exit(1);
        !           475: }
        !           476: 
        !           477: /* End of xwud.c */

unix.superglobalmegacorp.com

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