v04i095: Another xwps program, Part01/01
Dan Heller
argv at island.uu.net
Sat Aug 26 04:16:11 AEST 1989
Submitted-by: bchen at esvax.Berkeley.EDU (Benjamin Chen)
Posting-number: Volume 4, Issue 95
Archive-name: xwps2/part01
[ Here's another xwps program. What I like best about it is that it has
a set of common routines that all beginning X programmers are always
asking how to do. Novices: check out dsimple.c. Much content of this
program was taken from other existing programs. Works under R2 and does
not use widgets. README is at the end of the file. --argv ]
#! /bin/sh
export PATH || exec /bin/sh $0 $*
: # This is a shell archive. Remove anything before #! /bin/sh line, then
: # unpack it by saving it in a file and typing "sh file", creating files:
: # 'dsimple.c'
: # 'psfile.c'
: # 'xwps.c'
: # 'dsimple.h'
: # 'extern.h'
: # 'Makefile'
: # 'README'
: # Made by wong on Thu Jul 20 14:31:47 PDT 1989
PATH="/bin:/usr/bin:/usr/ucb:$PATH"
export PATH
prog="`basename \"$0\"`"
error=0
if test -f 'dsimple.c' -o -d 'dsimple.c'; then
echo "$prog: \"dsimple.c\" exists, skipping" >&2
error=1
else
echo 'x - dsimple.c'
sed -e 's/^X//' << 'EOF dsimple.c' > 'dsimple.c'
X/* $Header: dsimple.c,v 1.5 88/02/09 11:28:35 jim Exp $ */
X#include <X11/Xos.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <X11/cursorfont.h>
X#include <stdio.h>
X/*
X * Other_stuff.h: Definitions of routines in other_stuff.
X *
X * Written by Mark Lillibridge. Last updated 7/1/87
X *
X * Send bugs, etc. to chariot at athena.mit.edu.
X */
X
Xunsigned long Resolve_Color();
XPixmap Bitmap_To_Pixmap();
XWindow Select_Window();
Xvoid out();
Xvoid blip();
XWindow Window_With_Name();
X/*
X * Just_display: A group of routines designed to make the writting of simple
X * X11 applications which open a display but do not open
X * any windows much faster and easier. Unless a routine says
X * otherwise, it may be assumed to require program_name, dpy,
X * and screen already defined on entry.
X *
X * Written by Mark Lillibridge. Last updated 7/1/87
X *
X * Send bugs, etc. to chariot at athena.mit.edu.
X */
X
X
X/* This stuff is defined in the calling program by just_display.h */
Xextern char *program_name;
Xextern Display *dpy;
Xextern int screen;
X
X
X/*
X * Standard fatal error routine - call like printf but maximum of 7 arguments.
X * Does not require dpy or screen defined.
X */
Xvoid Fatal_Error(msg, arg0,arg1,arg2,arg3,arg4,arg5,arg6)
Xchar *msg;
Xchar *arg0, *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
X{
X fflush(stdout);
X fflush(stderr);
X fprintf(stderr, "%s: error: ", program_name);
X fprintf(stderr, msg, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
X fprintf(stderr, "\n");
X exit(1);
X}
X
X
X/*
X * Malloc: like malloc but handles out of memory using Fatal_Error.
X */
Xchar *Malloc(size)
X unsigned size;
X{
X char *data, *malloc();
X
X if (!(data = malloc(size)))
X Fatal_Error("Out of memory!");
X
X return(data);
X}
X
X
X/*
X * Realloc: like Malloc except for realloc, handles NULL using Malloc.
X */
Xchar *Realloc(ptr, size)
X char *ptr;
X int size;
X{
X char *new_ptr, *realloc();
X
X if (!ptr)
X return(Malloc(size));
X
X if (!(new_ptr = realloc(ptr, size)))
X Fatal_Error("Out of memory!");
X
X return(new_ptr);
X}
X
X
X/*
X * Get_Display_Name (argc, argv) Look for -display, -d, or host:dpy (obselete)
X * If found, remove it from command line. Don't go past a lone -.
X */
Xchar *Get_Display_Name(pargc, argv)
X int *pargc; /* MODIFIED */
X char **argv; /* MODIFIED */
X{
X int argc = *pargc;
X char **pargv = argv+1;
X char *displayname = NULL;
X int i;
X
X for (i = 1; i < argc; i++) {
X char *arg = argv[i];
X
X if (!strcmp (arg, "-display") || !strcmp (arg, "-d")) {
X if (++i >= argc) usage ();
X
X displayname = argv[i];
X *pargc -= 2;
X continue;
X }
X if (!strcmp(arg,"-")) {
X while (i<argc)
X *pargv++ = argv[i++];
X break;
X }
X *pargv++ = arg;
X }
X
X *pargv = NULL;
X return (displayname);
X}
X
X
X/*
X * Open_Display: Routine to open a display with correct error handling.
X * Does not require dpy or screen defined on entry.
X */
XDisplay *Open_Display(display_name)
Xchar *display_name;
X{
X Display *d;
X
X d = XOpenDisplay(display_name);
X if (d == NULL) {
X fprintf (stderr, "%s: unable to open display '%s'\n",
X program_name, XDisplayName (display_name));
X usage ();
X /* doesn't return */
X }
X
X return(d);
X}
X
X
X/*
X * Setup_Display_And_Screen: This routine opens up the correct display (i.e.,
X * it calls Get_Display_Name) and then stores a
X * pointer to it in dpy. The default screen
X * for this display is then stored in screen.
X * Does not require dpy or screen defined.
X */
Xvoid Setup_Display_And_Screen(argc, argv)
Xint *argc; /* MODIFIED */
Xchar **argv; /* MODIFIED */
X{
X dpy = Open_Display (Get_Display_Name(argc, argv));
X screen = DefaultScreen(dpy);
X}
X
X
X/*
X * Open_Font: This routine opens a font with error handling.
X */
XXFontStruct *Open_Font(name)
Xchar *name;
X{
X XFontStruct *font;
X
X if (!(font=XLoadQueryFont(dpy, name)))
X Fatal_Error("Unable to open font %s!", name);
X
X return(font);
X}
X
X
X/*
X * Beep: Routine to beep the display.
X */
Xvoid Beep()
X{
X XBell(dpy, 50);
X}
X
X
X/*
X * ReadBitmapFile: same as XReadBitmapFile except it returns the bitmap
X * directly and handles errors using Fatal_Error.
X */
Xstatic void _bitmap_error(status, filename)
X int status;
X char *filename;
X{
X if (status == BitmapOpenFailed)
X Fatal_Error("Can't open file %s!", filename);
X else if (status == BitmapFileInvalid)
X Fatal_Error("file %s: Bad bitmap format.", filename);
X else
X Fatal_Error("Out of memory!");
X}
X
XPixmap ReadBitmapFile(d, filename, width, height, x_hot, y_hot)
X Drawable d;
X char *filename;
X int *width, *height, *x_hot, *y_hot;
X{
X Pixmap bitmap;
X int status;
X
X status = XReadBitmapFile(dpy, RootWindow(dpy, screen), filename, width,
X height, &bitmap, x_hot, y_hot);
X if (status != BitmapSuccess)
X _bitmap_error(status, filename);
X
X return(bitmap);
X}
X
X
X/*
X * WriteBitmapFile: same as XWriteBitmapFile except it handles errors
X * using Fatal_Error.
X */
Xvoid WriteBitmapFile(filename, bitmap, width, height, x_hot, y_hot)
X char *filename;
X Pixmap bitmap;
X int width, height, x_hot, y_hot;
X{
X int status;
X
X status= XWriteBitmapFile(dpy, filename, bitmap, width, height, x_hot,
X y_hot);
X if (status != BitmapSuccess)
X _bitmap_error(status, filename);
X}
X
X
X/*
X * Select_Window_Args: a rountine to provide a common interface for
X * applications that need to allow the user to select one
X * window on the screen for special consideration.
X * This routine implements the following command line
X * arguments:
X *
X * -root Selects the root window.
X * -id <id> Selects window with id <id>. <id> may
X * be either in decimal or hex.
X * -name <name> Selects the window with name <name>.
X *
X * Call as Select_Window_Args(&argc, argv) in main before
X * parsing any of your program's command line arguments.
X * Select_Window_Args will remove its arguments so that
X * your program does not have to worry about them.
X * The window returned is the window selected or 0 if
X * none of the above arguments was present. If 0 is
X * returned, Select_Window should probably be called after
X * all command line arguments, and other setup is done.
X * For examples of usage, see xwininfo, xwd, or xprop.
X */
XWindow Select_Window_Args(rargc, argv)
X int *rargc;
X char **argv;
X#define ARGC (*rargc)
X{
X int nargc=1;
X int argc;
X char **nargv;
X Window w=0;
X
X nargv = argv+1; argc = ARGC;
X#define OPTION argv[0]
X#define NXTOPTP ++argv, --argc>0
X#define NXTOPT if (++argv, --argc==0) usage()
X#define COPYOPT nargv++[0]=OPTION; nargc++
X
X while (NXTOPTP) {
X if (!strcmp(OPTION, "-")) {
X COPYOPT;
X while (NXTOPTP)
X COPYOPT;
X break;
X }
X if (!strcmp(OPTION, "-root")) {
X w=RootWindow(dpy, screen);
X continue;
X }
X if (!strcmp(OPTION, "-name")) {
X NXTOPT;
X w = Window_With_Name(dpy, RootWindow(dpy, screen),
X OPTION);
X if (!w)
X Fatal_Error("No window with name %s exists!",OPTION);
X continue;
X }
X if (!strcmp(OPTION, "-id")) {
X NXTOPT;
X w=0;
X sscanf(OPTION, "0x%lx", &w);
X if (!w)
X sscanf(OPTION, "%ld", &w);
X if (!w)
X Fatal_Error("Invalid window id format: %s.", OPTION);
X continue;
X }
X COPYOPT;
X }
X ARGC = nargc;
X
X return(w);
X}
X
X/*
X * Other_stuff: A group of routines which do common X11 tasks.
X *
X * Written by Mark Lillibridge. Last updated 7/1/87
X *
X * Send bugs, etc. to chariot at athena.mit.edu.
X */
X
X
X#define NULL 0
X
Xextern Display *dpy;
Xextern int screen;
X
X/*
X * Resolve_Color: This routine takes a color name and returns the pixel #
X * that when used in the window w will be of color name.
X * (WARNING: The colormap of w MAY be modified! )
X * If colors are run out of, only the first n colors will be
X * as correct as the hardware can make them where n depends
X * on the display. This routine does not require wind to
X * be defined.
X */
Xunsigned long Resolve_Color(w, name)
X Window w;
X char *name;
X{
X XColor c;
X Colormap colormap;
X XWindowAttributes wind_info;
X
X /*
X * The following is a hack to insure machines without a rgb table
X * handle at least white & black right.
X */
X if (!strcmp(name, "white"))
X name="#ffffffffffff";
X if (!strcmp(name, "black"))
X name="#000000000000";
X
X XGetWindowAttributes(dpy, w, &wind_info);
X colormap = wind_info.colormap;
X
X if (!XParseColor(dpy, colormap, name, &c))
X Fatal_Error("Bad color format '%s'.", name);
X
X if (!XAllocColor(dpy, colormap, &c))
X Fatal_Error("XAllocColor failed!");
X
X return(c.pixel);
X}
X
X
X/*
X * Bitmap_To_Pixmap: Convert a bitmap to a 2 colored pixmap. The colors come
X * from the foreground and background colors of the gc.
X * Width and height are required solely for efficiency.
X * If needed, they can be obtained via. XGetGeometry.
X */
XPixmap Bitmap_To_Pixmap(dpy, d, gc, bitmap, width, height)
X Display *dpy;
X Drawable d;
X GC gc;
X Pixmap bitmap;
X int width, height;
X{
X Pixmap pix;
X int x, depth;
X Drawable root;
X
X if (!XGetGeometry(dpy, d, &root, &x, &x, &x, &x, &x, &depth))
X return(0);
X
X pix = XCreatePixmap(dpy, d, width, height, depth);
X
X XCopyPlane(dpy, bitmap, pix, gc, 0, 0, width, height, 0, 0, 1);
X
X return(pix);
X}
X
X
X/*
X * outl: a debugging routine. Flushes stdout then prints a message on stderr
X * and flushes stderr. Used to print messages when past certain points
X * in code so we can tell where we are. Outl may be invoked like
X * printf with up to 7 arguments.
X */
Xoutl(msg, arg0,arg1,arg2,arg3,arg4,arg5,arg6)
X char *msg;
X char *arg0, *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
X{
X fflush(stdout);
X fprintf(stderr, msg, arg0, arg1, arg2, arg3, arg4, arg5, arg6);
X fprintf(stderr, "\n");
X fflush(stderr);
X}
X
X
X/*
X * blip: a debugging routine. Prints Blip! on stderr with flushing.
X */
Xvoid blip()
X{
X outl("blip!");
X}
X
X
X/*
X * Routine to let user select a window using the mouse
X */
X
XWindow Select_Window(dpy)
X Display *dpy;
X{
X int status;
X Cursor cursor;
X XEvent event;
X Window target_win = None;
X int buttons = 0;
X
X /* Make the target cursor */
X cursor = XCreateFontCursor(dpy, XC_dot);
X
X /* Grab the pointer using target cursor, letting it room all over */
X status = XGrabPointer(dpy, RootWindow(dpy, screen), False,
X ButtonPressMask|ButtonReleaseMask, GrabModeSync,
X GrabModeAsync, None, cursor, CurrentTime);
X if (status != GrabSuccess) Fatal_Error("Can't grab the mouse.");
X
X /* Let the user select a window... */
X while ((target_win == None) || (buttons != 0)) {
X /* allow one more event */
X XAllowEvents(dpy, SyncPointer, CurrentTime);
X XWindowEvent(dpy, RootWindow(dpy, screen),
X ButtonPressMask|ButtonReleaseMask, &event);
X switch (event.type) {
X case ButtonPress:
X if (target_win == None) {
X target_win = event.xbutton.subwindow; /* window selected */
X if (target_win == None)
X target_win = RootWindow(dpy, screen);
X }
X buttons++;
X break;
X case ButtonRelease:
X if (buttons > 0) /* there may have been some down before we started */
X buttons--;
X break;
X }
X }
X XUngrabPointer(dpy, CurrentTime); /* Done with pointer */
X
X return(target_win);
X}
X
X
X/*
X * Window_With_Name: routine to locate a window with a given name on a display.
X * If no window with the given name is found, 0 is returned.
X * If more than one window has the given name, the first
X * one found will be returned. Only top and its subwindows
X * are looked at. Normally, top should be the RootWindow.
X */
XWindow Window_With_Name(dpy, top, name)
X Display *dpy;
X Window top;
X char *name;
X{
X Window *children, dummy;
X int nchildren, i;
X Window w=0;
X char *window_name;
X
X if (XFetchName(dpy, top, &window_name) && !strcmp(window_name, name))
X return(top);
X
X if (!XQueryTree(dpy, top, &dummy, &dummy, &children, &nchildren))
X return(0);
X
X for (i=0; i<nchildren; i++) {
X w = Window_With_Name(dpy, children[i], name);
X if (w)
X break;
X }
X XFree(children);
X return(w);
X}
EOF dsimple.c
case "`echo \`wc < 'dsimple.c'\``" in
"499 1633 12545")
;;
*)
echo "$prog: \"dsimple.c\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'psfile.c' -o -d 'psfile.c'; then
echo "$prog: \"psfile.c\" exists, skipping" >&2
error=1
else
echo 'x - psfile.c'
sed -e 's/^X//' << 'EOF psfile.c' > 'psfile.c'
X#include "extern.h"
X
Xvoid openImage(psFile,width,height)
X FILE *psFile;
X int width, height;
X{
X fprintf(psFile, "%%!\n");
X fprintf(psFile, "/inch {72 mul} def\n");
X fprintf(psFile, "/picstr %d string def\n", width);
X fprintf(psFile, "/plotimage\n");
X fprintf(psFile, " {%d %d %d [%d 0 0 %d 0 %d] \n", width, height,
X BITS_PER_SAMPLE, width, -height, height);
X fprintf(psFile," {currentfile picstr readhexstring pop} \n");
X fprintf(psFile," image\n } def\n");
X fprintf(psFile, "gsave\n");
X fprintf(psFile, "%.2f inch %.2f inch translate\n", translateX, translateY);
X fprintf(psFile, "%.2f inch %.2f inch scale\n", scaleX, scaleY);
X fprintf(psFile, "%d rotate\n", rotation);
X fflush(psFile);
X}
X
Xvoid closeImage(psFile)
X FILE *psFile;
X{
X fprintf(psFile, "grestore\n");
X fprintf(psFile, "showpage\n");
X fflush(psFile);
X}
X
Xvoid writeImage(psFile, ximage, width, height)
X FILE *psFile;
X XImage *ximage;
X int width, height;
X{
X int x, y;
X XColor *pix;
X
X pix = (XColor *)malloc(sizeof(XColor));
X /* Output is hexadecimal */
X fprintf(psFile, "plotimage\n");
X for(y=0;y<height;y++){
X for(x=0;x<width;x++){
X pix->pixel = XGetPixel(ximage,x,y);
X pix->red = (pix->pixel >> 16 & 0xFF);
X pix->green = (pix->pixel >> 8 & 0xFF);
X pix->blue = (pix->pixel & 0xFF);
X pix->pixel = luminance(*pix);
X fprintf(psFile, "%02x", pix->pixel);
X }
X fprintf(psFile, "\n");
X }
X fprintf(psFile, "\n");
X}
X
Xint luminance(colorSpec)
X XColor colorSpec;
X{
X int r, g, b, l;
X
X r = 255 - (colorSpec.red);
X g = 255 - (colorSpec.green);
X b = 255 - (colorSpec.blue);
X l = (0.33*r) + (0.33*g) + (0.34*b);
X if(inverse) return(l);
X else return(abs(l - 255));
X}
X
EOF psfile.c
case "`echo \`wc < 'psfile.c'\``" in
"67 193 1742")
;;
*)
echo "$prog: \"psfile.c\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'xwps.c' -o -d 'xwps.c'; then
echo "$prog: \"xwps.c\" exists, skipping" >&2
error=1
else
echo 'x - xwps.c'
sed -e 's/^X//' << 'EOF xwps.c' > 'xwps.c'
X#include <X11/copyright.h>
X
X/* Copyright 1987 Massachusetts Institute of Technology */
X
X/*
X * xwd.c MIT Project Athena, X Window system window raster image dumper.
X *
X * This program will dump a raster image of the contents of a window into a
X * file for output on graphics printers or for other uses.
X *
X * Author: Tony Della Fera, DEC
X * 17-Jun-85
X *
X * Modification history:
X *
X * 11/14/86 Bill Wyatt, Smithsonian Astrophysical Observatory
X * - Removed Z format option, changing it to an XY option. Monochrome
X * windows will always dump in XY format. Color windows will dump
X * in Z format by default, but can be dumped in XY format with the
X * -xy option.
X *
X * 11/18/86 Bill Wyatt
X * - VERSION 6 is same as version 5 for monchrome. For colors, the
X * appropriate number of Color structs are dumped after the header,
X * which has the number of colors (=0 for monochrome) in place of the
X * V5 padding at the end. Up to 16-bit displays are supported. I
X * don't yet know how 24- to 32-bit displays will be handled under
X * the Version 11 protocol.
X *
X * 6/15/87 David Krikorian, MIT Project Athena
X * - VERSION 7 runs under the X Version 11 servers, while the previous
X * versions of xwd were are for X Version 10. This version is based
X * on xwd version 6, and should eventually have the same color
X * abilities. (Xwd V7 has yet to be tested on a color machine, so
X * all color-related code is commented out until color support
X * becomes practical.)
X */
X
X#ifndef lint
Xstatic char *rcsid_xwd_c = "$Header: xwd.c,v 1.34 88/02/12 13:24:59 jim Exp $";
X#endif
X
X/*%
X *% This is the format for commenting out color-related code until
X *% color can be supported.
X */
X
X#define FEEP_VOLUME 0
X#define DECLARE
X#include "extern.h"
X
X/* Include routines to do parsing */
X#include "dsimple.h"
X
Xextern int (*_XErrorFunction)();
Xextern int _XDefaultError();
X
Xmain(argc, argv)
X int argc;
X char **argv;
X{
X register i;
X FILE *fopen();
X
X INIT_NAME;
X
X Setup_Display_And_Screen(&argc, argv);
X
X /* Get window select on command line, if any */
X target_win = Select_Window_Args(&argc, argv);
X
X for (i = 1; i < argc; i++) {
X if (!strcmp(argv[i], "-borders")) {
X bdrs = False;
X continue;
X }
X if (!strcmp(argv[i], "-debug")) {
X debug = True;
X continue;
X }
X if (!strcmp(argv[i], "-help"))
X usage();
X if (!strcmp(argv[i], "-out")) {
X if (++i >= argc) usage();
X if (!(out_file = fopen(argv[i], "w"))){
X Error("Can't open output file as specified.");
X out_file = stdout;
X }
X continue;
X }
X if (!strcmp(argv[i], "-xy")) {
X format = XYPixmap;
X continue;
X }
X if(!strcmp(argv[i], "-rot")) {
X sscanf(argv[++i],"%d",&rotation);
X continue;
X }
X if(!strcmp(argv[i], "-scale")){
X sscanf(argv[++i],"%d",&scaleX);
X sscanf(argv[++i],"%d",&scaleY);
X continue;
X }
X if(!strcmp(argv[i],"-off")){
X sscanf(argv[++i],"%d",&translateX);
X sscanf(argv[++i],"%d",&translateY);
X continue;
X }
X if(!strcmp(argv[i],"-inv")){
X inverse = 1;
X continue;
X }
X
X usage();
X }
X
X /*
X * Let the user select the target window.
X */
X if (!target_win)
X target_win = Select_Window(dpy);
X
X /*
X * Dump the window
X */
X Window_Dump(target_win,out_file);
X
X fclose(out_file);
X
X
X
X}
X
X
X/*
X * Window_Dump: dump a window to a file which must already be open for
X * writting.
X */
X
Xchar *calloc();
X
X#include "X11/XWDFile.h"
X
XWindow_Dump(window, out)
X Window window;
X FILE *out;
X{
X unsigned long swaptest = 1;
X XColor *colors;
X unsigned buffer_size;
X int win_name_size;
X int header_size;
X int ncolors, i;
X char *win_name;
X XWindowAttributes win_info;
X XImage *image;
X
X XWDFileHeader header;
X
X
X /*
X * Inform the user not to alter the screen.
X */
X Beep();
X
X /*
X * Get the parameters of the window being dumped.
X */
X if (debug) outl("xwd: Getting target window information.\n");
X if(!XGetWindowAttributes(dpy, window, &win_info))
X Fatal_Error("Can't get target window attributes.");
X
X XFetchName(dpy, window, &win_name);
X if (!win_name || !win_name[0])
X win_name = "xwdump";
X
X /* sizeof(char) is included for the null string terminator. */
X win_name_size = strlen(win_name) + sizeof(char);
X
X /*
X * Snarf the pixmap with XGetImage.
X */
X
X if (!bdrs) {
X if (debug) outl("xwd: Image without borders selected.\n");
X image = XGetImage ( dpy, window, 0, 0, win_info.width,
X win_info.height, ~0, format);
X }
X else {
X if (debug) outl("xwd: Image with borders selected.\n");
X image = XGetImage ( dpy, window,
X -win_info.border_width, -win_info.border_width,
X win_info.width + (win_info.border_width << 1),
X win_info.height + (win_info.border_width << 1),
X ~0, format);
X }
X if (debug) outl("xwd: Getting pixmap.\n");
X
X /*
X * Determine the pixmap size.
X */
X buffer_size = Image_Size(image);
X
X if (debug) outl("xwd: Getting Colors.\n");
X
X ncolors = Get_XColors(&win_info, &colors);
X
X /*
X * Inform the user that the image has been retrieved.
X */
X XBell(dpy, FEEP_VOLUME);
X XBell(dpy, FEEP_VOLUME);
X XFlush(dpy);
X
X /*
X * Calculate header size.
X */
X if (debug) outl("xwd: Calculating header size.\n");
X header_size = sizeof(header) + win_name_size;
X
X /*
X * Write out header information.
X */
X if (debug) outl("xwd: Constructing and dumping file header.\n");
X header.header_size = (xwdval) header_size;
X header.file_version = (xwdval) XWD_FILE_VERSION;
X header.pixmap_format = (xwdval) format;
X header.pixmap_depth = (xwdval) image->depth;
X header.pixmap_width = (xwdval) image->width;
X header.pixmap_height = (xwdval) image->height;
X header.xoffset = (xwdval) image->xoffset;
X header.byte_order = (xwdval) image->byte_order;
X header.bitmap_unit = (xwdval) image->bitmap_unit;
X header.bitmap_bit_order = (xwdval) image->bitmap_bit_order;
X header.bitmap_pad = (xwdval) image->bitmap_pad;
X header.bits_per_pixel = (xwdval) image->bits_per_pixel;
X header.bytes_per_line = (xwdval) image->bytes_per_line;
X header.visual_class = (xwdval) win_info.visual->class;
X header.red_mask = (xwdval) win_info.visual->red_mask;
X header.green_mask = (xwdval) win_info.visual->green_mask;
X header.blue_mask = (xwdval) win_info.visual->blue_mask;
X header.bits_per_rgb = (xwdval) win_info.visual->bits_per_rgb;
X header.colormap_entries = (xwdval) win_info.visual->map_entries;
X header.ncolors = ncolors;
X header.window_width = (xwdval) win_info.width;
X header.window_height = (xwdval) win_info.height;
X if (!bdrs) {
X header.window_x = (xwdval) (win_info.x + win_info.border_width);
X header.window_y = (xwdval) (win_info.y + win_info.border_width);
X } else {
X header.window_x = (xwdval) win_info.x;
X header.window_y = (xwdval) win_info.y;
X }
X header.window_bdrwidth = (xwdval) win_info.border_width;
X
X if (*(char *) &swaptest) {
X _swaplong((char *) &header, sizeof(header));
X for (i = 0; i < ncolors; i++) {
X _swaplong((char *) &colors[i].pixel, sizeof(long));
X _swapshort((char *) &colors[i].red, 3 * sizeof(short));
X }
X }
X
X /*
X * (void) fwrite((char *)&header, sizeof(header), 1, out);
X * (void) fwrite(win_name, win_name_size, 1, out);
X */
X
X openImage(out, header.pixmap_width, header.pixmap_height);
X writeImage(out,image,header.pixmap_width, header.pixmap_height);
X closeImage(out);
X
X /*
X * Write out the color maps, if any
X */
X
X /*
X * if (debug) outl("xwd: Dumping %d colors.\n", ncolors);
X * (void) fwrite((char *) colors, sizeof(XColor), ncolors, out);
X */
X
X /*
X * Write out the buffer.
X */
X if (debug) outl("xwd: Dumping pixmap. bufsize=%d\n",buffer_size);
X
X /*
X * This copying of the bit stream (data) to a file is to be replaced
X * by an Xlib call which hasn't been written yet. It is not clear
X * what other functions of xwd will be taken over by this (as yet)
X * non-existant X function.
X */
X
X /*
X * (void) fwrite(image->data, (int) buffer_size, 1, out);
X */
X
X /*
X * free the color buffer.
X */
X
X if(debug && ncolors > 0) outl("xwd: Freeing colors.\n");
X if(ncolors > 0) free(colors);
X
X /*
X * Free window name string.
X *
X if (debug) outl("xwd: Freeing window name string.\n");
X free((char *)win_name);
X */
X
X /*
X * Free image
X */
X XDestroyImage(image);
X}
X
X/*
X * Report the syntax for calling xwd.
X */
Xusage()
X{
X fprintf (stderr,
X"usage: %s [-display host:dpy] [-debug] [-help] [-borders] [-out <file>]",
X program_name);
X fprintf (stderr, " [-xy]\n\t[-rot <rotation>] [-scale <x y>] [-off <x y>] [-inv]\n");
X exit(1);
X}
X
X
X/*
X * Error - Fatal xwd error.
X */
Xextern int errno;
X
XError(string)
X char *string; /* Error description string. */
X{
X outl("\nxwd: Error => %s\n", string);
X if (errno != 0) {
X perror("xwd");
X outl("\n");
X }
X
X exit(1);
X}
X
X
X/*
X * Determine the pixmap size.
X */
X
Xint Image_Size(image)
X XImage *image;
X{
X if (format != ZPixmap)
X return(image->bytes_per_line * image->height * image->depth);
X
X return(image->bytes_per_line * image->height);
X}
X
X
X/*
X * Get the XColors of all pixels in image - returns # of colors
X */
Xint Get_XColors(win_info, colors)
X XWindowAttributes *win_info;
X XColor **colors;
X{
X int i, ncolors;
X
X if (!win_info->colormap)
X return(0);
X
X if (win_info->visual->class == TrueColor ||
X win_info->visual->class == DirectColor)
X return(0); /* XXX punt for now */
X
X ncolors = win_info->visual->map_entries;
X if (!(*colors = (XColor *) malloc (sizeof(XColor) * ncolors)))
X Fatal_Error("Out of memory!");
X
X for (i=0; i<ncolors; i++)
X (*colors)[i].pixel = i;
X
X XQueryColors(dpy, win_info->colormap, *colors, ncolors);
X
X return(ncolors);
X}
X
X_swapshort (bp, n)
X register char *bp;
X register unsigned n;
X{
X register char c;
X register char *ep = bp + n;
X
X while (bp < ep) {
X c = *bp;
X *bp = *(bp + 1);
X bp++;
X *bp++ = c;
X }
X}
X
X_swaplong (bp, n)
X register char *bp;
X register unsigned n;
X{
X register char c;
X register char *ep = bp + n;
X register char *sp;
X
X while (bp < ep) {
X sp = bp + 3;
X c = *sp;
X *sp = *bp;
X *bp++ = c;
X sp = bp + 1;
X c = *sp;
X *sp = *bp;
X *bp++ = c;
X bp += 2;
X }
X}
EOF xwps.c
case "`echo \`wc < 'xwps.c'\``" in
"425 1295 10482")
;;
*)
echo "$prog: \"xwps.c\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'dsimple.h' -o -d 'dsimple.h'; then
echo "$prog: \"dsimple.h\" exists, skipping" >&2
error=1
else
echo 'x - dsimple.h'
sed -e 's/^X//' << 'EOF dsimple.h' > 'dsimple.h'
X/* $Header: dsimple.h,v 1.1 87/09/11 08:17:50 toddb Exp $ */
X/*
X * Just_display.h: This file contains the definitions needed to use the
X * functions in just_display.c. It also declares the global
X * variables dpy, screen, and program_name which are needed to
X * use just_display.c.
X *
X * Written by Mark Lillibridge. Last updated 7/1/87
X *
X * Send bugs, etc. to chariot at athena.mit.edu.
X */
X
X /* Global variables used by routines in just_display.c */
X
Xchar *program_name = "unknown_program"; /* Name of this program */
XDisplay *dpy; /* The current display */
Xint screen; /* The current screen */
X
X#define INIT_NAME program_name=argv[0] /* use this in main to setup
X program_name */
X
X /* Declaritions for functions in just_display.c */
X
Xvoid Fatal_Error();
Xchar *Malloc();
Xchar *Realloc();
Xchar *Get_Display_Name();
XDisplay *Open_Display();
Xvoid Setup_Display_And_Screen();
XXFontStruct *Open_Font();
Xvoid Beep();
XPixmap ReadBitmapFile();
Xvoid WriteBitmapFile();
XWindow Select_Window_Args();
X
X#define X_USAGE "[host:display]" /* X arguments handled by
X Get_Display_Name */
X#define SELECT_USAGE "[{-root|-id <id>|-font <font>|-name <name>}]"
X
X/*
X * Other_stuff.h: Definitions of routines in other_stuff.
X *
X * Written by Mark Lillibridge. Last updated 7/1/87
X *
X * Send bugs, etc. to chariot at athena.mit.edu.
X */
X
Xunsigned long Resolve_Color();
XPixmap Bitmap_To_Pixmap();
XWindow Select_Window();
Xvoid out();
Xvoid blip();
XWindow Window_With_Name();
EOF dsimple.h
case "`echo \`wc < 'dsimple.h'\``" in
"53 189 1648")
;;
*)
echo "$prog: \"dsimple.h\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'extern.h' -o -d 'extern.h'; then
echo "$prog: \"extern.h\" exists, skipping" >&2
error=1
else
echo 'x - extern.h'
sed -e 's/^X//' << 'EOF extern.h' > 'extern.h'
X/* List of external variable and headers to be included in xwps */
X
X#include <X11/Xos.h>
X#include <X11/Xlib.h>
X#include <X11/Xutil.h>
X#include <stdio.h>
X#include <signal.h>
X
X#define SAVE 0
X#define PRINT 1
X#define FILENAME "xwpsfile"
X#define BITS_PER_SAMPLE 8
X
X#ifdef DECLARE
X Bool debug = False;
X Bool inverse = False; /* inverse Flag */
X Bool bdrs = True; /* borders Flag */
X Bool output = PRINT; /* Save to File or Print */
X int format = ZPixmap; /* XYBitmap, XYPixmap, ZPixmap */
X int rotation = 0; /* In degrees counterclockwise */
X float scaleX = 6.0; /* In inches */
X float scaleY = 6.0; /* In inches */
X float translateX = 1.0; /* In inches */
X float translateY = 1.0; /* In inches */
X
X Window target_win; /* User selected target window */
X FILE *out_file = stdout; /* File to save to */
X#else
X extern Bool debug, inverse, bdrs, output;
X extern int format, rotation;
X extern float scaleX, scaleY, translateX, translateY;
X extern Window target_win;
X extern FILE *out_file;
X#endif
X
X
EOF extern.h
case "`echo \`wc < 'extern.h'\``" in
"36 160 1051")
;;
*)
echo "$prog: \"extern.h\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'Makefile' -o -d 'Makefile'; then
echo "$prog: \"Makefile\" exists, skipping" >&2
error=1
else
echo 'x - Makefile'
sed -e 's/^X//' << 'EOF Makefile' > 'Makefile'
X#
X# Makefile for XWD -> XWPS: Xwindow Dump to a Postscript format
X#
X
XXLIBS = -lX
XCFLAGS = -g
Xsrc = xwps.c dsimple.c psfile.c
Xobj = xwps.o dsimple.o psfile.o
Xheaders = dsimple.h extern.h
XDEST = ./xwps
X
Xxwps: $(obj)
X $(CC) $(obj) $(XLIBS) -o $(DEST)
X
X$(obj): $(headers)
X
Xall: xwps clean
X
Xclean:
X rm -f $(obj)
EOF Makefile
case "`echo \`wc < 'Makefile'\``" in
"20 53 314")
;;
*)
echo "$prog: \"Makefile\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
if test -f 'README' -o -d 'README'; then
echo "$prog: \"README\" exists, skipping" >&2
error=1
else
echo 'x - README'
sed -e 's/^X//' << 'EOF README' > 'README'
XWell here it is. This works for my release of X11 which is R2 I think.
XYou will notice quite a few extra external variables hanging around, this is because
XI had to rip out the widget part. Also there is some X code in xwps.c that I
Xdidn't want to mess with because I didn't know if it was doing something.
EOF README
case "`echo \`wc < 'README'\``" in
"4 62 307")
;;
*)
echo "$prog: \"README\" corrupted" >&2
error=1
;;
esac
fi ; : # End of overwrite check
: # End of shell archive
exit $error
Benjamin Chen
Office: 550-A4 Cory Hall, 2-4332
UUCP: !ucbvax!esvax!bchen
HEPNET: LBL::"bchen at esvax.Berkeley.EDU"
More information about the Comp.sources.x
mailing list