void x2pmp(FILE *in, FILE *out, int scale, int p_width, int p_length, int x_pos, int y_pos, /* in pels (units of PPI) */ char *head, char *foot, enum orientation orient, int invert) { unsigned char *buffer, *win_name; unsigned int win_name_size, width, height, ncolors; unsigned int buffer_size, one_plane_size, byte_width, fixed_width; int no_of_bits; unsigned long swaptest = 1; XWDFileHeader header; /* Read header from file */ if (fread((char *)&header, sizeof(header), 1, in) != 1) { if (feof(in)) return; else leave("fread"); } if (*(char *) &swaptest) _swaplong((char *) &header, sizeof(header)); if (header.file_version != XWD_FILE_VERSION) { fprintf(stderr,"%s: file format version %d, not %d\n", progname, (int)header.file_version, XWD_FILE_VERSION); } win_name_size = abs_(header.header_size - sizeof(header)); if ((win_name = (unsigned char *) calloc(win_name_size, (unsigned) sizeof(char))) == NULL) leave("Can't calloc window name storage."); /* Read window name from file */ if (fread((char *) win_name, sizeof(char), (int) win_name_size, in) != win_name_size) leave("Unable to read window name from dump file."); DEBUG(>= 1) fprintf(stderr,"win_name =%s\n", win_name); width = header.pixmap_width; height = header.pixmap_height; fixed_width = 8 * (byte_width = header.bytes_per_line); one_plane_size = byte_width * height; buffer_size = one_plane_size * ((header.pixmap_format == ZPixmap)? header.pixmap_depth: 1); /* Determine orientation and scale if not specified */ if (orient == UNSPECIFIED) orient = (fixed_width <= height)? PORTRAIT: LANDSCAPE; if (scale <= 0) { int real_height = height; if (head) real_height += FONT_HEIGHT_PIXELS << 1; if (foot) real_height += FONT_HEIGHT_PIXELS << 1; switch(orient) { default: case PORTRAIT: case UPSIDE_DOWN: scale = min_((p_width - 2*x_pos) / fixed_width, (p_length - 2*y_pos) / real_height); break; case LANDSCAPE: case LANDSCAPE_LEFT: scale = min_((p_length - 2*y_pos) / fixed_width, (p_width - 2*x_pos) / real_height); break; } if (scale <= 0) leave("PixMap doesn't fit on page."); else DEBUG(>1) fprintf(stderr, "scaling by %d to yield %d x %d image\n", scale, fixed_width*scale, height*scale); }
int main(int argc, char *argv[]) { Display *dpy; int screen; register int i; XImage in_image_struct; XImage *in_image, *out_image; XSetWindowAttributes attributes; XVisualInfo vinfo, *vinfos; long mask; register char *buffer; unsigned long swaptest = 1; int count, stdcnt; unsigned buffer_size; int win_name_size; int ncolors; char *file_name = NULL; char *win_name; Bool inverse = False, rawbits = False, newmap = False; Bool onclick = True; Bool scale = False; int plane = -1; char *std = NULL; char *vis = NULL; char *display_name = NULL; char *fgname = NULL; char *bgname = NULL; char *geom = NULL; int gbits = 0; XSizeHints hints; XTextProperty textprop; XClassHint class_hint; XColor *colors = NULL, color, igncolor; Window image_win; Colormap colormap; XEvent event; register XExposeEvent *expose = (XExposeEvent *)&event; GC gc; XGCValues gc_val; XWDFileHeader header; XWDColor xwdcolor; FILE *in_file = stdin; char *map_name; Atom map_prop; XStandardColormap *stdmaps, *stdmap = NULL; char c; int win_width, win_height; progname = argv[0]; for (i = 1; i < argc; i++) { if (strcmp(argv[i], "-bg") == 0) { if (++i >= argc) usage(); bgname = argv[i]; continue; } if (strcmp(argv[i], "-display") == 0) { if (++i >= argc) usage(); display_name = argv[i]; continue; } if (strcmp(argv[i], "-fg") == 0) { if (++i >= argc) usage(); fgname = argv[i]; continue; } if (strcmp(argv[i], "-geometry") == 0) { if (++i >= argc) usage(); geom = argv[i]; continue; } if (strcmp(argv[i], "-help") == 0) { usage(); } if (strcmp(argv[i], "-in") == 0) { if (++i >= argc) usage(); file_name = argv[i]; continue; } if (strcmp(argv[i], "-inverse") == 0) { /* for compatibility */ inverse = True; continue; } if (strcmp(argv[i], "-new") == 0) { newmap = True; if (std) usage(); continue; } if (strcmp(argv[i], "-noclick") == 0) { onclick = False; continue; } if (strcmp(argv[i], "-plane") == 0) { if (++i >= argc) usage(); plane = atoi(argv[i]); continue; } if (strcmp(argv[i], "-raw") == 0) { rawbits = True; if (std) usage(); continue; } if (strcmp(argv[i], "-rv") == 0) { inverse = True; continue; } if (strcmp(argv[i], "-scale") == 0) { scale = True; continue; } if (strcmp(argv[i], "-split") == 0) { split = True; continue; } if (strcmp(argv[i], "-std") == 0) { if (++i >= argc) usage(); std = argv[i]; if (newmap || rawbits) usage(); continue; } if (strcmp(argv[i], "-vis") == 0) { if (++i >= argc) usage(); vis = argv[i]; continue; } usage(); } if (file_name) { in_file = fopen(file_name, "rb"); if (in_file == NULL) Error("Can't open input file as specified."); } #ifdef WIN32 else _setmode(fileno(in_file), _O_BINARY); #endif dpy = XOpenDisplay(display_name); if (dpy == NULL) { fprintf(stderr, "%s: unable to open display \"%s\"\n", progname, XDisplayName(display_name)); exit(1); } screen = DefaultScreen(dpy); /* * Read in header information. */ if(!Read((char *)&header, SIZEOF(XWDheader), 1, in_file)) Error("Unable to read dump file header."); if (*(char *) &swaptest) _swaplong((char *) &header, SIZEOF(XWDheader)); /* check to see if the dump file is in the proper format */ if (header.file_version != XWD_FILE_VERSION) { fprintf(stderr,"xwud: XWD file format version mismatch."); Error("exiting."); } if (header.header_size < SIZEOF(XWDheader)) { fprintf(stderr,"xwud: XWD header size is too small."); Error("exiting."); } /* alloc window name */ win_name_size = (header.header_size - SIZEOF(XWDheader)); if((win_name = malloc((unsigned) win_name_size + 6)) == NULL) Error("Can't malloc window name storage."); strcpy(win_name, "xwud: "); /* read in window name */ if(!Read(win_name + 6, sizeof(char), win_name_size, in_file)) Error("Unable to read window name from dump file."); /* initialize the input image */ in_image = &in_image_struct; in_image->depth = header.pixmap_depth; in_image->format = header.pixmap_format; in_image->xoffset = header.xoffset; in_image->data = NULL; in_image->width = header.pixmap_width; in_image->height = header.pixmap_height; in_image->bitmap_pad = header.bitmap_pad; in_image->bytes_per_line = header.bytes_per_line; in_image->byte_order = header.byte_order; in_image->bitmap_unit = header.bitmap_unit; in_image->bitmap_bit_order = header.bitmap_bit_order; in_image->bits_per_pixel = header.bits_per_pixel; in_image->red_mask = header.red_mask; in_image->green_mask = header.green_mask; in_image->blue_mask = header.blue_mask; if (!XInitImage(in_image)) Error("Invalid input image header data."); /* read in the color map buffer */ if((ncolors = header.ncolors)) { colors = (XColor *)malloc((unsigned) ncolors * sizeof(XColor)); if (!colors) Error("Can't malloc color table"); for (i = 0; i < ncolors; i++) { if(!Read((char *) &xwdcolor, SIZEOF(XWDColor), 1, in_file)) Error("Unable to read color map from dump file."); colors[i].pixel = xwdcolor.pixel; colors[i].red = xwdcolor.red; colors[i].green = xwdcolor.green; colors[i].blue = xwdcolor.blue; colors[i].flags = xwdcolor.flags; } if (*(char *) &swaptest) { for (i = 0; i < ncolors; i++) { _swaplong((char *) &colors[i].pixel, sizeof(long)); _swapshort((char *) &colors[i].red, 3 * sizeof(short)); } } } else /* no color map exists, turn on the raw option */ rawbits = True; /* alloc the pixel buffer */ buffer_size = Image_Size(in_image); if((buffer = malloc(buffer_size)) == NULL) Error("Can't malloc data buffer."); /* read in the image data */ if (!Read(buffer, sizeof(char), (int)buffer_size, in_file)) Error("Unable to read pixmap from dump file."); /* close the input file */ (void) fclose(in_file); if (plane >= in_image->depth) Error("plane number exceeds image depth"); if ((in_image->format == XYPixmap) && (plane >= 0)) { buffer += in_image->bytes_per_line * in_image->height * (in_image->depth - (plane + 1)); in_image->depth = 1; ncolors = 0; } if (in_image->bits_per_pixel == 1 && in_image->depth == 1) { in_image->format = XYBitmap; newmap = False; rawbits = True; } in_image->data = buffer; if (std) { map_name = malloc(strlen(std) + 9); strcpy(map_name, "RGB_"); strcat(map_name, std); strcat(map_name, "_MAP"); Latin1Upper(map_name); map_prop = XInternAtom(dpy, map_name, True); if (!map_prop || !XGetRGBColormaps(dpy, RootWindow(dpy, screen), &stdmaps, &stdcnt, map_prop)) Error("specified standard colormap does not exist"); } vinfo.screen = screen; mask = VisualScreenMask; if (vis) { char *vt; vt = malloc(strlen(vis) + 1); strcpy(vt, vis); Latin1Upper(vt); if (strcmp(vt, "STATICGRAY") == 0) { vinfo.class = StaticGray; mask |= VisualClassMask; } else if (strcmp(vt, "GRAYSCALE") == 0) {