|
|
1.1 root 1: #include <X11/copyright.h>
2:
3: /* Copyright 1987 Massachusetts Institute of Technology */
4:
5: /*
6: * xwd.c MIT Project Athena, X Window system window raster image dumper.
7: *
8: * This program will dump a raster image of the contents of a window into a
9: * file for output on graphics printers or for other uses.
10: *
11: * Author: Tony Della Fera, DEC
12: * 17-Jun-85
13: *
14: * Modification history:
15: *
16: * 11/14/86 Bill Wyatt, Smithsonian Astrophysical Observatory
17: * - Removed Z format option, changing it to an XY option. Monochrome
18: * windows will always dump in XY format. Color windows will dump
19: * in Z format by default, but can be dumped in XY format with the
20: * -xy option.
21: *
22: * 11/18/86 Bill Wyatt
23: * - VERSION 6 is same as version 5 for monchrome. For colors, the
24: * appropriate number of Color structs are dumped after the header,
25: * which has the number of colors (=0 for monochrome) in place of the
26: * V5 padding at the end. Up to 16-bit displays are supported. I
27: * don't yet know how 24- to 32-bit displays will be handled under
28: * the Version 11 protocol.
29: *
30: * 6/15/87 David Krikorian, MIT Project Athena
31: * - VERSION 7 runs under the X Version 11 servers, while the previous
32: * versions of xwd were are for X Version 10. This version is based
33: * on xwd version 6, and should eventually have the same color
34: * abilities. (Xwd V7 has yet to be tested on a color machine, so
35: * all color-related code is commented out until color support
36: * becomes practical.)
37: */
38:
39: #ifndef lint
40: static char *rcsid_xwd_c = "$Header: xwd.c,v 1.28 87/09/11 16:57:09 rws Exp $";
41: #endif
42:
43: /*%
44: *% This is the format for commenting out color-related code until
45: *% color can be supported.
46: %*/
47:
48: #include <X11/Xlib.h>
49: #include <X11/Xutil.h>
50: #include <sys/types.h>
51: #include <stdio.h>
52: #include <strings.h>
53:
54: #define FEEP_VOLUME 0
55:
56: /* Include routines to do parsing */
57: #include "dsimple.h"
58:
59: /* Setable Options */
60:
61: int format = ZPixmap;
62: Bool nobdrs = False;
63: Bool standard_out = True;
64: Bool debug = False;
65:
66: extern int (*_XErrorFunction)();
67: extern int _XDefaultError();
68:
69: main(argc, argv)
70: int argc;
71: char **argv;
72: {
73: register i;
74: Window target_win;
75: FILE *out_file = stdout;
76:
77: INIT_NAME;
78:
79: Setup_Display_And_Screen(&argc, argv);
80:
81: /* Get window select on command line, if any */
82: target_win = Select_Window_Args(&argc, argv);
83:
84: for (i = 1; i < argc; i++) {
85: if (!strcmp(argv[i], "-nobdrs")) {
86: nobdrs = True;
87: continue;
88: }
89: if (!strcmp(argv[i], "-debug")) {
90: debug = True;
91: continue;
92: }
93: if (!strcmp(argv[i], "-help"))
94: usage();
95: if (!strcmp(argv[i], "-out")) {
96: if (++i >= argc) usage();
97: if (!(out_file = fopen(argv[i], "w")))
98: Error("Can't open output file as specified.");
99: standard_out = False;
100: continue;
101: }
102: if (!strcmp(argv[i], "-xy")) {
103: format = XYPixmap;
104: continue;
105: }
106: usage();
107: }
108:
109: /*
110: * Let the user select the target window.
111: */
112: if (!target_win)
113: target_win = Select_Window(dpy);
114:
115: /*
116: * Dump it!
117: */
118: Window_Dump(target_win, out_file);
119:
120: fclose(out_file);
121: }
122:
123:
124: /*
125: * Window_Dump: dump a window to a file which must already be open for
126: * writting.
127: */
128:
129: char *calloc();
130:
131: #include "X11/XWDFile.h"
132:
133: Window_Dump(window, out)
134: Window window;
135: FILE *out;
136: {
137: unsigned long swaptest = 1;
138: XColor *colors;
139: unsigned buffer_size;
140: int win_name_size;
141: int header_size;
142: int ncolors, i;
143: char win_name[100];
144: XWindowAttributes win_info;
145: XImage *image;
146:
147: XWDFileHeader header;
148:
149:
150: /*
151: * Inform the user not to alter the screen.
152: */
153: Beep();
154:
155: /*
156: * Get the parameters of the window being dumped.
157: */
158: if (debug) outl("xwd: Getting target window information.\n");
159: if(!XGetWindowAttributes(dpy, window, &win_info))
160: Fatal_Error("Can't get target window attributes.");
161:
162: XFetchName(dpy, window, win_name);
163: if (!win_name[0])
164: strcpy(win_name, "xwdump");
165:
166: /* sizeof(char) is included for the null string terminator. */
167: win_name_size = strlen(win_name) + sizeof(char);
168:
169: /*
170: * Snarf the pixmap with XGetImage.
171: */
172:
173: if (nobdrs) {
174: if (debug) outl("xwd: Image without borders selected.\n");
175: image = XGetImage ( dpy, window, 0, 0, win_info.width,
176: win_info.height, ~0, format);
177: }
178: else {
179: if (debug) outl("xwd: Image with borders selected.\n");
180: image = XGetImage ( dpy, window,
181: -win_info.border_width, -win_info.border_width,
182: win_info.width + (win_info.border_width << 1),
183: win_info.height + (win_info.border_width << 1),
184: ~0, format);
185: }
186: if (debug) outl("xwd: Getting pixmap.\n");
187:
188: /*
189: * Determine the pixmap size.
190: */
191: buffer_size = Image_Size(image);
192:
193: if (debug) outl("xwd: Getting Colors.\n");
194:
195: ncolors = Get_XColors(&win_info, &colors);
196:
197: /*
198: * Inform the user that the image has been retrieved.
199: */
200: XBell(dpy, FEEP_VOLUME);
201: XBell(dpy, FEEP_VOLUME);
202: XFlush(dpy);
203:
204: /*
205: * Calculate header size.
206: */
207: if (debug) outl("xwd: Calculating header size.\n");
208: header_size = sizeof(header) + win_name_size;
209:
210: /*
211: * Write out header information.
212: */
213: if (debug) outl("xwd: Constructing and dumping file header.\n");
214: header.header_size = (xwdval) header_size;
215: header.file_version = (xwdval) XWD_FILE_VERSION;
216: header.pixmap_format = (xwdval) format;
217: header.pixmap_depth = (xwdval) image->depth;
218: header.pixmap_width = (xwdval) image->width;
219: header.pixmap_height = (xwdval) image->height;
220: header.xoffset = (xwdval) image->xoffset;
221: header.byte_order = (xwdval) image->byte_order;
222: header.bitmap_unit = (xwdval) image->bitmap_unit;
223: header.bitmap_bit_order = (xwdval) image->bitmap_bit_order;
224: header.bitmap_pad = (xwdval) image->bitmap_pad;
225: header.bits_per_pixel = (xwdval) image->bits_per_pixel;
226: header.bytes_per_line = (xwdval) image->bytes_per_line;
227: header.visual_class = (xwdval) win_info.visual->class;
228: header.red_mask = (xwdval) win_info.visual->red_mask;
229: header.green_mask = (xwdval) win_info.visual->green_mask;
230: header.blue_mask = (xwdval) win_info.visual->blue_mask;
231: header.bits_per_rgb = (xwdval) win_info.visual->bits_per_rgb;
232: header.colormap_entries = (xwdval) win_info.visual->map_entries;
233: header.ncolors = ncolors;
234: header.window_width = (xwdval) win_info.width;
235: header.window_height = (xwdval) win_info.height;
236: if (nobdrs) {
237: header.window_x = (xwdval) (win_info.x + win_info.border_width);
238: header.window_y = (xwdval) (win_info.y + win_info.border_width);
239: } else {
240: header.window_x = (xwdval) win_info.x;
241: header.window_y = (xwdval) win_info.y;
242: }
243: header.window_bdrwidth = (xwdval) win_info.border_width;
244:
245: if (*(char *) &swaptest) {
246: _swaplong((char *) &header, sizeof(header));
247: for (i = 0; i < ncolors; i++) {
248: _swaplong((char *) &colors[i].pixel, sizeof(long));
249: _swapshort((char *) &colors[i].red, 3 * sizeof(short));
250: }
251: }
252:
253: (void) fwrite((char *)&header, sizeof(header), 1, out);
254: (void) fwrite(win_name, win_name_size, 1, out);
255:
256: /*
257: * Write out the color maps, if any
258: */
259:
260: if (debug) outl("xwd: Dumping %d colors.\n", ncolors);
261: (void) fwrite((char *) colors, sizeof(XColor), ncolors, out);
262:
263: /*
264: * Write out the buffer.
265: */
266: if (debug) outl("xwd: Dumping pixmap. bufsize=%d\n",buffer_size);
267:
268: /*
269: * This copying of the bit stream (data) to a file is to be replaced
270: * by an Xlib call which hasn't been written yet. It is not clear
271: * what other functions of xwd will be taken over by this (as yet)
272: * non-existant X function.
273: */
274: (void) fwrite(image->data, (int) buffer_size, 1, out);
275:
276: /*
277: * free the color buffer.
278: */
279:
280: if(debug && ncolors > 0) outl("xwd: Freeing colors.\n");
281: if(ncolors > 0) free(colors);
282:
283: /*
284: * Free window name string.
285: */
286: if (debug) outl("xwd: Freeing window name string.\n");
287: free(win_name);
288:
289: /*
290: * Free image
291: */
292: XDestroyImage(image);
293: }
294:
295: /*
296: * Report the syntax for calling xwd.
297: */
298: usage()
299: {
300: printf("%s: %s [-debug] [-help] %s [-nobdrs] [-out <file>]",
301: program_name, SELECT_USAGE);
302: printf(" [-xy] [[host]:vs]\n");
303: exit(1);
304: }
305:
306:
307: /*
308: * Error - Fatal xwd error.
309: */
310: extern int errno;
311:
312: Error(string)
313: char *string; /* Error description string. */
314: {
315: outl("\nxwd: Error => %s\n", string);
316: if (errno != 0) {
317: perror("xwd");
318: outl("\n");
319: }
320:
321: exit(1);
322: }
323:
324:
325: /*
326: * Determine the pixmap size.
327: */
328:
329: int Image_Size(image)
330: XImage *image;
331: {
332: if (format != ZPixmap)
333: return(image->bytes_per_line * image->height * image->depth);
334:
335: return(image->bytes_per_line * image->height);
336: }
337:
338:
339: /*
340: * Get the XColors of all pixels in image - returns # of colors
341: */
342: int Get_XColors(win_info, colors)
343: XWindowAttributes *win_info;
344: XColor **colors;
345: {
346: int i, ncolors;
347:
348: if (!win_info->colormap)
349: return(0);
350:
351: if (win_info->visual->class == TrueColor ||
352: win_info->visual->class == DirectColor)
353: return(0); /* XXX punt for now */
354:
355: ncolors = win_info->visual->map_entries;
356: if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors)))
357: Fatal_Error("Out of memory!");
358:
359: for (i=0; i<ncolors; i++)
360: (*colors)[i].pixel = i;
361:
362: XQueryColors(dpy, win_info->colormap, *colors, ncolors);
363:
364: return(ncolors);
365: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.