v09i026: xgrabsc, Patch1, Part01/01
Bruce Schuchardt
bruce at SLC.COM
Wed Sep 12 18:23:18 AEST 1990
Submitted-by: bruce at SLC.COM (Bruce Schuchardt)
Posting-number: Volume 9, Issue 26
Archive-name: xgrabsc/patch1
Patch-To: xgrabsc: Volume 8, Issue 75,76
This is the first patch set for xgrabsc. See the file README.patch1
for a description of the changes introduced by this set.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Bruce Schuchardt Ph: (503) 629-8383
Servio Corp. bruce at SLC.COM
Beaverton, OR
------------------CUT HERE--------------------------------------------
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 1 (of 1)."
# Contents: README.patch1 patch1
# Wrapped by owner at spruce on Mon Sep 10 08:25:19 1990
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'README.patch1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'README.patch1'\"
else
echo shar: Extracting \"'README.patch1'\" \(3623 characters\)
sed "s/^X//" >'README.patch1' <<'END_OF_FILE'
X*========================================================================
X*
X* Name - README.patch1
X*
X* Version: 1.2
X*
X* ccsid: @(#)README.patch1 1.2 - 9/10/90 08:21:46
X* from: ccs/s.README.patch1
X* date: 9/10/90 08:22:05
X*
X*
X*
X* Description: notes on patch kit #1
X*
X*========================================================================*
X
X
XOPTIONS:
X
XNew options added in patch 01 are
X
X alternate input selection mechanisms:
X
X -r selects the root window
X -i id selects window #id
X -w selects the window in the same manner as xwd
X
X -c forces run-length encoding off for Postscript output
X -E output Encapsulated Postscript
X
X both the "c" and "E" options also select Postscript output format
X
XThe rubber-band selection mechanism now uses upper-left and lower-right
Xangle cursors. You can still drag any way you want, but there were
Xenough requests to use these instead of the cross-hair cursor that I
Xmade the change.
X
XThe program now sounds the X bell once before pulling the image and twice
Xafter pulling it.
X
XThe Postscript encoding was completely revamped. The new RLE code is
Xsimilar to that used in MacPaint files and provides better compression for
Ximages in general. The new "-c" switch can be used to turn off encoding.
X
XSeveral people have asked for, and I've attempted to create, encapsulated
XPostscript output. Use the new "-E" option to generate this form of
XPostscript output. I have no gear to test it with; if it doesn't work and
Xyou know how to fix it, please let me know.
X
X
XBUILDING:
X
X
XThe imake and make files were changed to follow accepted conventions.
XA new target was added for man page installation (install.man).
X
XThe compilation flag -DNO_RLE_CHECKS will eliminate a pass that xgrabsc
Xmakes over the source image to determine whether compression of Postscript
Xoutput will actually result in size savings.
X
XFor machines with no memcpy() or memset() routines in their standard
Xlibraries, conditionally compiled routines were added to xgrabsc.c.
XCompile with -DMEMCPY to use these routines.
X
X
XKNOWN BUGS:
X
X
XI've tried to respond to all problem reports. If you did not receive a
Xresponse, your mail either did not reach me or I could not reach you with
Xa reply.
X
X1) While xgrabsc can create puzzle picture files from monochrome screens, the
X puzzle program will not display pictures with "-picture" on monochrome
X systems. This is not a "bug" in xgrabsc, but is a "confusing feature".
X
X2) If you run xgrabsc from a Twm menu, be sure to end your exec command with
X "&". The program may not be able to grab the pointer or server unless you
X do this. This will likely happen with any window manager, but has been
X reported onlyfor Twm.
X
X3) The xwdtoppm program appears to have problems reading xgrabsc XWD output. I've
X looked into this problem a bit but have no quick solution for all platforms and
X compilers. If "xwd | xwdtoppm | ppmtoxwd | xwud" works on your machine, you
X may try the simple fix of correcting the color-reading loop in xwdtoppm.c to
X terminate on reaching "ncolors" instead of "colormap-entries". You should
X be able to use xgrabsc output once this is done. The ppm bugs have been
X reported to the owner of that project.
X
X
XACKNOWLEDGMENTS:
X
X
XThanks to
X David Lawrence for the memcpy() and memset() functions
X
X Alan Kent for help with 4-plane problems, encapsulated postscript
X suggestions, and for testing the patch kit
X
X
X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
X Bruce Schuchardt Ph: (503) 629-8383
X Servio Corp. bruce at SLC.COM
X Beaverton, OR
X
END_OF_FILE
if test 3623 -ne `wc -c <'README.patch1'`; then
echo shar: \"'README.patch1'\" unpacked with wrong size!
fi
# end of 'README.patch1'
fi
if test -f 'patch1' -a "${1}" != "-c" ; then
echo shar: Will not clobber existing file \"'patch1'\"
else
echo shar: Extracting \"'patch1'\" \(46079 characters\)
sed "s/^X//" >'patch1' <<'END_OF_FILE'
XPrereq: 0
X*** rls1/xgrabsc.c Mon Sep 10 08:24:25 1990
X--- xgrabsc.c Mon Sep 10 08:22:05 1990
X***************
X*** 2,12 ****
X *
X * Name - xgrabsc.c
X *
X! * Version: 1.4
X *
X! * ccsid: @(#)xgrabsc.c 1.4 - 8/20/90 09:55:19
X * from: ccs/s.xgrabsc.c
X! * date: 8/20/90 09:56:02
X *
X * Copyright (c) 1990 Bruce Schuchardt.
X * Read the file cpyright.h for full copyright information.
X--- 2,12 ----
X *
X * Name - xgrabsc.c
X *
X! * Version: 1.7
X *
X! * ccsid: @(#)xgrabsc.c 1.7 - 9/10/90 08:21:51
X * from: ccs/s.xgrabsc.c
X! * date: 9/10/90 08:22:04
X *
X * Copyright (c) 1990 Bruce Schuchardt.
X * Read the file cpyright.h for full copyright information.
X***************
X*** 38,43 ****
X--- 38,44 ----
X #define TRUE 1
X #define FALSE 0
X
X+
X typedef unsigned char byte;
X typedef unsigned long dw;
X typedef unsigned int word;
X***************
X*** 52,57 ****
X--- 53,65 ----
X } imageInfo;
X
X
X+
X+ #ifdef MEMCPY
X+ char *memcpy();
X+ char *memset();
X+ #endif
X+
X+
X Display *hDisplay;
X int hScreen;
X Window hRoot;
X***************
X*** 59,64 ****
X--- 67,73 ----
X char *programName;
X char *imageName;
X
X+ char *version = XGRABSC_VERSION;
X int patchLevel = XGRABSC_PATCHLEVEL;
X int verbose;
X
X***************
X*** 68,74 ****
X
X
X
X-
X /*
X * Alter colors by setting or clearing bits in rgb values.
X * This effectively reduces the depth of the image, causing the
X--- 77,82 ----
X***************
X*** 303,311 ****
X * TRUE is returned if an image was successfully grabbed, and FALSE
X * otherwise.
X */
X! getImage(xrect, image)
X XRectangle *xrect;
X imageInfo *image;
X {
X XImage *ximage;
X int depth, ncolors, cmapSize, numCmaps;
X--- 311,320 ----
X * TRUE is returned if an image was successfully grabbed, and FALSE
X * otherwise.
X */
X! getImage(xrect, image, window)
X XRectangle *xrect;
X imageInfo *image;
X+ Window window;
X {
X XImage *ximage;
X int depth, ncolors, cmapSize, numCmaps;
X***************
X*** 318,324 ****
X return FALSE;
X
X depth = DefaultDepth(hDisplay, hScreen);
X! ximage = XGetImage(hDisplay, hRoot,
X xrect->x, xrect->y, xrect->width, xrect->height, AllPlanes,
X depth==1 ? XYPixmap : ZPixmap);
X image->ximage = ximage;
X--- 327,333 ----
X return FALSE;
X
X depth = DefaultDepth(hDisplay, hScreen);
X! ximage = XGetImage(hDisplay, window,
X xrect->x, xrect->y, xrect->width, xrect->height, AllPlanes,
X depth==1 ? XYPixmap : ZPixmap);
X image->ximage = ximage;
X***************
X*** 325,337 ****
X
X /* get the colormap info too */
X
X! cmaps = XListInstalledColormaps(hDisplay, hRoot, &numCmaps);
X if (numCmaps == 0)
X cmap = DefaultColormap(hDisplay, hScreen);
X else {
X cmap = *cmaps;
X if (numCmaps > 1)
X! printf(stderr,
X "%s: more than one colormap found - using first encountered",
X programName);
X }
X--- 334,346 ----
X
X /* get the colormap info too */
X
X! cmaps = XListInstalledColormaps(hDisplay, window, &numCmaps);
X if (numCmaps == 0)
X cmap = DefaultColormap(hDisplay, hScreen);
X else {
X cmap = *cmaps;
X if (numCmaps > 1)
X! fprintf(stderr,
X "%s: more than one colormap found - using first encountered",
X programName);
X }
X***************
X*** 382,388 ****
X XEvent event;
X unsigned int mask, x, y, rootx, rooty;
X GC gc;
X! Cursor pointer;
X int boxDrawn = False;
X int rx, ry, rw, rh;
X Window root, child;
X--- 391,397 ----
X XEvent event;
X unsigned int mask, x, y, rootx, rooty;
X GC gc;
X! Cursor pointer1, pointer2;
X int boxDrawn = False;
X int rx, ry, rw, rh;
X Window root, child;
X***************
X*** 389,399 ****
X int discarded;
X
X /* get some cursors for rectangle formation */
X! pointer = XCreateFontCursor(hDisplay, XC_crosshair);
X
X /* grab the pointer */
X if (GrabSuccess != XGrabPointer(hDisplay, hRoot, False, ButtonPressMask,
X! GrabModeAsync, GrabModeAsync, hRoot, pointer, CurrentTime)) {
X fprintf(stderr,"%s - could not grab pointer!\n", programName);
X exit(3);
X }
X--- 398,409 ----
X int discarded;
X
X /* get some cursors for rectangle formation */
X! pointer1 = XCreateFontCursor(hDisplay, XC_ul_angle);
X! pointer2 = XCreateFontCursor(hDisplay, XC_lr_angle);
X
X /* grab the pointer */
X if (GrabSuccess != XGrabPointer(hDisplay, hRoot, False, ButtonPressMask,
X! GrabModeAsync, GrabModeAsync, hRoot, pointer1, CurrentTime)) {
X fprintf(stderr,"%s - could not grab pointer!\n", programName);
X exit(3);
X }
X***************
X*** 415,421 ****
X
X /* get pointer motion events */
X XChangeActivePointerGrab(hDisplay, ButtonMotionMask | ButtonReleaseMask,
X! pointer, CurrentTime);
X
X
X /* MAKE_RECT converts the original root coordinates and the event root
X--- 425,431 ----
X
X /* get pointer motion events */
X XChangeActivePointerGrab(hDisplay, ButtonMotionMask | ButtonReleaseMask,
X! pointer2, CurrentTime);
X
X
X /* MAKE_RECT converts the original root coordinates and the event root
X***************
X*** 444,450 ****
X MAKE_RECT(xbutton);
X /* release resources */
X XFreeGC(hDisplay, gc);
X! XFreeCursor(hDisplay, pointer);
X xrect->x = rx;
X xrect->y = ry;
X xrect->width = rw;
X--- 454,461 ----
X MAKE_RECT(xbutton);
X /* release resources */
X XFreeGC(hDisplay, gc);
X! XFreeCursor(hDisplay, pointer1);
X! XFreeCursor(hDisplay, pointer2);
X xrect->x = rx;
X xrect->y = ry;
X xrect->width = rw;
X***************
X*** 474,480 ****
X--- 485,610 ----
X
X
X
X+
X+
X /*
X+ * choose a window as in xwd
X+ */
X+
X+ Window getWindow() {
X+ int status;
X+ Cursor cursor;
X+ XEvent event;
X+ Window result;
X+
X+ result = None;
X+
X+ cursor = XCreateFontCursor(hDisplay, XC_target);
X+
X+ status = XGrabPointer(hDisplay, hRoot, FALSE,
X+ ButtonPressMask|ButtonReleaseMask, GrabModeSync,
X+ GrabModeAsync, None, cursor, CurrentTime);
X+ if (status != GrabSuccess) {
X+ fprintf(stderr, "%s: can't grab mouse\n", programName);
X+ exit(3);
X+ }
X+
X+ while (TRUE) {
X+ XAllowEvents(hDisplay, SyncPointer, CurrentTime);
X+ XWindowEvent(hDisplay, hRoot, ButtonPressMask|ButtonReleaseMask, &event);
X+
X+ switch (event.type) {
X+ case ButtonRelease:
X+ result = event.xbutton.subwindow;
X+ if (result == None)
X+ result = hRoot;
X+ XUngrabPointer(hDisplay, CurrentTime); /* Done with pointer */
X+ return result;
X+ break;
X+ }
X+ }
X+ }
X+
X+
X+
X+
X+
X+
X+
X+ #ifdef MEMCPY
X+
X+ /* memcpy and memset routines from C News */
X+
X+
X+ /*
X+ * memcpy - copy bytes
X+ */
X+
X+ char *
X+ memcpy(dst, src, size)
X+ char * dst;
X+ char * src;
X+ int size;
X+ {
X+ register char *d;
X+ register char *s;
X+ register int n;
X+
X+ if (size <= 0)
X+ return(dst);
X+
X+ s = src;
X+ d = dst;
X+ if (s <= d && s + (size-1) >= d) {
X+ /* Overlap, must copy right-to-left. */
X+ s += size-1;
X+ d += size-1;
X+ for (n = size; n > 0; n--)
X+ *d-- = *s--;
X+ } else
X+ for (n = size; n > 0; n--)
X+ *d++ = *s++;
X+
X+ return(dst);
X+ }
X+
X+ /*
X+ * memset - set bytes
X+ *
X+ * CHARBITS should be defined only if the compiler lacks "unsigned char".
X+ * It should be a mask, e.g. 0377 for an 8-bit machine.
X+ */
X+
X+ #ifndef CHARBITS
X+ # define UNSCHAR(c) ((unsigned char)(c))
X+ #else
X+ # define UNSCHAR(c) ((c)&CHARBITS)
X+ #endif
X+
X+ char *
X+ memset(s, ucharfill, size)
X+ char * s;
X+ register int ucharfill;
X+ int size;
X+ {
X+ register char *scan;
X+ register int n;
X+ register int uc;
X+
X+ scan = s;
X+ uc = UNSCHAR(ucharfill);
X+ for (n = size; n > 0; n--)
X+ *scan++ = uc;
X+
X+ return(s);
X+ }
X+ #endif /* MEMCPY */
X+
X+
X+
X+
X+
X+ /*
X * convert a pixmap image into a bitmap image
X */
X pixmap2bitmap(image)
X***************
X*** 583,608 ****
X 0x0, 0x0, 0x0, 0x0
X };
X
X- static byte DitherRevBits[GRAYS][4] = { /* DitherBits with LSBFirst */
X- 0xf, 0xf, 0xf, 0xf,
X- 0x7, 0xf, 0xf, 0xf,
X- 0x7, 0xf, 0xd, 0xf,
X- 0x5, 0xf, 0xd, 0xf,
X- 0x5, 0xf, 0x5, 0xf,
X- 0x5, 0xb, 0x5, 0xf,
X- 0x5, 0xb, 0x5, 0xe,
X- 0x5, 0xa, 0x5, 0xe,
X- 0x5, 0xa, 0x5, 0xa,
X- 0x1, 0xa, 0x5, 0xa,
X- 0x1, 0xa, 0x4, 0xa,
X- 0x0, 0xa, 0x4, 0xa,
X- 0x0, 0xa, 0x0, 0xa,
X- 0x0, 0x2, 0x0, 0xa,
X- 0x0, 0x2, 0x0, 0x8,
X- 0x0, 0x0, 0x0, 0x8,
X- 0x0, 0x0, 0x0, 0x0
X- };
X-
X /* halftone or dither a color image, changing it into a monochrome
X * image
X */
X--- 713,718 ----
X***************
X*** 647,652 ****
X--- 757,764 ----
X exit(3);
X }
X
X+ /* DitherBits is set up for MSBFirst use, so force this in the image */
X+ newImage->bitmap_bit_order = MSBFirst;
X
X /* if the number of possible pixels isn't very large, build an array
X * which we index by the pixel value to find the dither array index
X***************
X*** 698,711 ****
X * whether x is odd or not. an 8x8 array wouldn't even need that,
X * but blowing an image up by 64x is probably not a feature.
X */
X! ditherBits = reversed? &(DitherRevBits[dindex][0])
X! : &(DitherBits[dindex][0]);
X x4 = x * 4;
X y4 = y * 4;
X for (h= 0; h < 4; h++) {
X bits = ditherBits[h];
X for (w=0; w < 4; w++)
X! XPutPixel(newImage, x4+w, y4+h, (bits >> 0) & 1);
X }
X }
X }
X--- 810,822 ----
X * whether x is odd or not. an 8x8 array wouldn't even need that,
X * but blowing an image up by 64x is probably not a feature.
X */
X! ditherBits = &(DitherBits[dindex][0]);
X x4 = x * 4;
X y4 = y * 4;
X for (h= 0; h < 4; h++) {
X bits = ditherBits[h];
X for (w=0; w < 4; w++)
X! XPutPixel(newImage, x4+w, y4+h, (bits >> w) & 1);
X }
X }
X }
X***************
X*** 773,779 ****
X
X
X
X! /* swap some long ints */
X swapdws (bp, n)
X register char *bp;
X register unsigned n;
X--- 884,890 ----
X
X
X
X! /* swap some long ints. (n is number of BYTES, not number of longs) */
X swapdws (bp, n)
X register char *bp;
X register unsigned n;
X***************
X*** 817,840 ****
X
X
X
X /*
X * Write an image in Postscript format
X */
X! writePostscript(image, outfile)
X imageInfo *image;
X {
X XImage *ximage = image->ximage;
X XImage *psimage;
X! double xdpi, ydpi, xscale, yscale;
X! byte b, *ptr, lmax;
X! int lm3;
X! int x, y, i;
X int depth, bpl, spb;
X int reverse;
X- int rle, firstrle;
X- byte rlecount, rlebyte;
X- dw rletotal;
X long p;
X
X if (verbose)
X fprintf(stderr, "%s: formatting Postscript output\n", programName);
X--- 928,1022 ----
X
X
X
X+
X+
X+ /* macros for run-length encoding of Postscript output */
X+
X+ #define FLUSH(stream) { \
X+ if (rlecount) { \
X+ rletotal += 1 + (repeating? 1 : rlecount); \
X+ rlecount = 0; \
X+ } \
X+ }
X+
X+
X+ #define START_ENCODING { \
X+ firstrle = TRUE; \
X+ rletotal = 0; \
X+ widthcount = 0; \
X+ }
X+
X+
X+ #define ENCODE(b, stream) { \
X+ if (firstrle) { \
X+ rlebytes[0] = b; \
X+ rlecount = 1; \
X+ repeating = TRUE; \
X+ firstrle = FALSE; \
X+ } \
X+ else if (repeating) { \
X+ if (b != rlebytes[0] || rlecount == 0x80) { \
X+ FLUSH(stream); \
X+ repeating = FALSE; \
X+ rlebytes[0] = b; \
X+ rlecount = 1; \
X+ } \
X+ else \
X+ rlecount++; \
X+ } \
X+ else { \
X+ if (rlecount && b == rlebytes[rlecount-1]) { \
X+ rlecount--; /* get back the matching byte */ \
X+ FLUSH(stream); \
X+ rlebytes[0] = b; \
X+ rlecount = 2; \
X+ repeating = TRUE; \
X+ } \
X+ else { \
X+ if (rlecount == 0x80) \
X+ FLUSH(stream); \
X+ rlebytes[rlecount++] = b; \
X+ } \
X+ } \
X+ }
X+
X+ #define FINISH_ENCODING(stream) { \
X+ if (!firstrle) \
X+ FLUSH(stream); \
X+ if (widthcount) \
X+ fputc('\n', stream); \
X+ }
X+
X+
X+
X+
X+
X /*
X * Write an image in Postscript format
X */
X! writePostscript(image, outfile, encode, encapsulate)
X imageInfo *image;
X+ FILE *outfile;
X+ int encode; /* TRUE if we're to encode the Postscript output */
X+ int encapsulate; /* TRUE if encapsulated Postscript output is wanted */
X {
X+ register byte b, *ptr;
X+ register int i;
X XImage *ximage = image->ximage;
X XImage *psimage;
X! double xdpi, ydpi, xscale, yscale, f;
X! int lshift, lmask;
X! int x, y;
X int depth, bpl, spb;
X int reverse;
X long p;
X+ /* rle variables */
X+ int repeating;
X+ int firstrle;
X+ int rlecount;
X+ dw rletotal;
X+ byte rlebytes[128];
X+ int widthcount;
X
X if (verbose)
X fprintf(stderr, "%s: formatting Postscript output\n", programName);
X***************
X*** 846,851 ****
X--- 1028,1034 ----
X if (depth < 8 && depth > 4) depth = 8;
X if (depth == 3) depth = 4;
X
X+
X bpl = ((ximage->width * depth) + 7) / 8;
X
X if (depth == 1)
X***************
X*** 854,860 ****
X /* colors have to be changed to luminescence */
X ptr = (byte *)malloc(ximage->height * bpl);
X psimage = XCreateImage(hDisplay, DefaultVisual(hDisplay, hScreen),
X! depth, depth>1? ZPixmap : XYPixmap,
X 0, ptr,
X ximage->width, ximage->height,
X 0, bpl);
X--- 1037,1043 ----
X /* colors have to be changed to luminescence */
X ptr = (byte *)malloc(ximage->height * bpl);
X psimage = XCreateImage(hDisplay, DefaultVisual(hDisplay, hScreen),
X! depth, ZPixmap,
X 0, ptr,
X ximage->width, ximage->height,
X 0, bpl);
X***************
X*** 863,927 ****
X programName);
X exit(3);
X }
X }
X
X spb = 8 / psimage->bits_per_pixel; /* samples per byte */
X
X if (depth > 1) {
X! /* translate colors into luminescence */
X! lmax = (1 << psimage->bits_per_pixel) - 1;
X! lm3 = 3 * lmax;
X for (y = 0; y < ximage->height; y++) {
X for (x = 0; x < ximage->width; x++) {
X p = XGetPixel(ximage, x, y);
X i = (dw)image->red[p]+(dw)image->green[p]+(dw)image->blue[p];
X! i = (i * lmax) / lm3;
X XPutPixel(psimage, x, y, i);
X }
X }
X }
X!
X! /* see if the image will benefit from run-length encoding */
X! rlecount = 0xff;
X! rletotal = 0;
X! for (y=0; y<psimage->height; y++) {
X! for (x=0, ptr=(byte *)(psimage->data+(y * psimage->bytes_per_line));
X! x<psimage->width;
X! x+=spb, ptr++) {
X! b = *ptr;
X! if (b != rlebyte || rlecount == 0xff) {
X! rletotal += 2;
X! rlecount = 0;
X! rlebyte = b;
X }
X! else
X! rlecount++;
X! }
X }
X! rle = rletotal < psimage->height * bpl;
X
X- fprintf(outfile, "%%!\n");
X- fprintf(outfile, "%%\n");
X- fprintf(outfile, "%% Xgrabsc Postscript dump of image '%s'\n", imageName);
X- fprintf(outfile, "%%\n");
X- fprintf(outfile, "%%\n");
X
X! if (rle) {
X! fprintf(outfile, "%% run-length encoded. Savings = %d bytes\n",
X! (psimage->height * bpl - rletotal) * 2);
X! fprintf(outfile, "%%\n");
X! fprintf(outfile, "%%\n");
X }
X
X /* standard inch procedure */
X fputs("/inch {72 mul} def\n", outfile);
X
X- /* define a string to hold image lines */
X- fprintf(outfile, "/picstr %d string def\n", bpl);
X
X! /* define a string to hold run-length-encoded pairs */
X! if (rle)
X! fputs("/rlebuffer 2 string def\n", outfile);
X
X /* define the image plotting procedure */
X fputs("/plotimage\n", outfile);
X--- 1046,1121 ----
X programName);
X exit(3);
X }
X+ /* force the bits_per_pixel to be what is needed */
X+ psimage->bits_per_pixel = depth;
X }
X
X spb = 8 / psimage->bits_per_pixel; /* samples per byte */
X
X if (depth > 1) {
X! /* translate colors into grays */
X! lshift = 16 - psimage->bits_per_pixel;
X! lmask = (1 << psimage->bits_per_pixel) - 1;
X for (y = 0; y < ximage->height; y++) {
X for (x = 0; x < ximage->width; x++) {
X p = XGetPixel(ximage, x, y);
X i = (dw)image->red[p]+(dw)image->green[p]+(dw)image->blue[p];
X! i = ((i / 3) >> lshift) & lmask;
X XPutPixel(psimage, x, y, i);
X }
X }
X }
X!
X!
X! #ifndef NO_RLE_CHECKS
X! if (encode) {
X! START_ENCODING
X! for (y=0; y<psimage->height; y++)
X! for (x=0, ptr=(byte *)(psimage->data + (y * psimage->bytes_per_line));
X! x<psimage->width; x+=spb, ptr++) {
X! b = *ptr;
X! ENCODE(b, outfile)
X }
X! FINISH_ENCODING(outfile)
X! f = (float)(rletotal) / (float)(psimage->height*bpl);
X! if (verbose)
X! fprintf(stderr, "%s: encoding would change to %5.1f%% of orig size\n",
X! programName, f * 100.0);
X! encode = f <= 0.95;
X }
X! #endif
X
X
X!
X! if (verbose)
X! fprintf(stderr, "%s: image will %sbe encoded\n", programName,
X! encode? "" : "not ");
X!
X! if (encapsulate) {
X! fprintf(outfile, "%%!PS-Adobe-2.0 EPSF-1.2\n");
X! fprintf(outfile, "%%%%BoundingBox: %d %d %d %d\n",
X! 0, 0, psimage->width, psimage->height);
X }
X+ else
X+ fprintf(outfile, "%%!\n");
X
X+ fprintf(outfile, "%%%%Creator: xgrabsc\n");
X+ fprintf(outfile, "%%%%Title: %s\n", imageName);
X+ time(&p);
X+ fprintf(outfile, "%%%%CreationDate: %s", ctime(&p));
X+ fprintf(outfile, "%%%%EndComments\n");
X+ fprintf(outfile, "%%\n");
X+ fprintf(outfile, "%%\n");
X+
X /* standard inch procedure */
X fputs("/inch {72 mul} def\n", outfile);
X
X
X! /* define a string to hold image bytes */
X! if (encode)
X! fputs("/rlebuffer 1 string def\n", outfile);
X! else
X! fprintf(outfile, "/picstr %d string def\n", bpl);
X
X /* define the image plotting procedure */
X fputs("/plotimage\n", outfile);
X***************
X*** 932,949 ****
X psimage->width, psimage->height, psimage->height);
X
X /* line reading function */
X! if (rle) {
X! fputs(" { currentfile rlebuffer readhexstring pop pop\n", outfile);
X! fputs(" /nsamples rlebuffer 0 get 1 add store\n", outfile);
X! fputs(" /lum rlebuffer 1 get store\n", outfile);
X! fputs(" /samples nsamples string store\n", outfile);
X! fputs(" 0 1 nsamples -1 add { samples exch lum put } for\n",
X! outfile);
X! fputs(" samples\n", outfile);
X! fputs(" }\n", outfile);
X! }
X! else
X! fputs(" {currentfile picstr readhexstring pop}\n", outfile);
X
X fputs(" image\n} def\n", outfile);
X
X--- 1126,1155 ----
X psimage->width, psimage->height, psimage->height);
X
X /* line reading function */
X!
X! if (encode) {
X! fputs("% run-length decoding block\n", outfile);
X! fputs(" { currentfile rlebuffer readhexstring pop pop\n", outfile);
X! fputs("% top bit of first byte states whether the following byte\n", outfile);
X! fputs("% is repeated, or if there is a run of non-repeated bytes\n", outfile);
X! fputs(" rlebuffer 0 get dup /nsamples exch store\n", outfile);
X! fputs(" -7 bitshift 1 eq {\n", outfile);
X! fputs("% run of unrepeated bytes\n", outfile);
X! fputs(" /samples nsamples 127 and 1 add string store\n", outfile);
X! fputs(" currentfile samples readhexstring pop \n", outfile);
X! fputs(" } {\n", outfile);
X! fputs("% repeated byte\n", outfile);
X! fputs(" /nsamples nsamples 1 add store\n", outfile);
X! fputs(" currentfile rlebuffer readhexstring pop pop\n", outfile);
X! fputs(" /lum rlebuffer 0 get store\n", outfile);
X! fputs(" /samples nsamples string store\n", outfile);
X! fputs(" 0 1 nsamples -1 add { samples exch lum put } for\n", outfile);
X! fputs(" samples\n", outfile);
X! fputs(" } ifelse\n", outfile);
X! fputs(" }\n", outfile);
X! }
X! else
X! fputs(" {currentfile picstr readhexstring pop}\n", outfile);
X
X fputs(" image\n} def\n", outfile);
X
X***************
X*** 951,982 ****
X /* save context and move to a nice origin */
X fputs("gsave\n", outfile);
X
X!
X! /* scale the image */
X! xdpi = (((double)DisplayWidth(hDisplay,hScreen)) * 25.4) /
X! ((double)DisplayWidthMM(hDisplay,hScreen));
X! ydpi = (((double)DisplayHeight(hDisplay,hScreen)) * 25.4) /
X! ((double)DisplayHeightMM(hDisplay,hScreen));
X! xscale = ((double)psimage->width) / xdpi;
X! yscale = ((double)psimage->height) / ydpi;
X! if (xscale > 7.5) {
X! yscale *= 7.5 / xscale;
X! xscale = 7.5;
X }
X! else if (yscale > 10.0) {
X! xscale *= 10.0 / yscale;
X! yscale = 10.0;
X }
X! fprintf(outfile, "%1.2g inch %1.2g inch translate\n",
X! (8.5 - xscale) / 2.0, (11.0 - yscale) / 2.0);
X! fprintf(outfile, "%1.2g inch %1.2g inch scale\n", xscale, yscale);
X!
X fputs("plotimage\n", outfile);
X
X
X reverse = depth == 1? BlackPixel(hDisplay,hScreen)==1 : FALSE;
X! rletotal = 0;
X! rlecount = 0xff;
X for (y=0; y<psimage->height; y++) {
X for (x=0, ptr=(byte *)(psimage->data+(y * psimage->bytes_per_line));
X x<psimage->width;
X--- 1157,1226 ----
X /* save context and move to a nice origin */
X fputs("gsave\n", outfile);
X
X! if (encapsulate) {
X! /* for encapsulated postscript, we need a scale factor that is equal
X! * to the image width/height in samples */
X! fprintf(outfile, "%d %d scale\n", psimage->width, psimage->height);
X }
X! else {
X! /* For physical output we need a scale factor that will create
X! * the same size image, and we need to center it on the page.
X! * -Figure out the physical dimensions on the screen
X! * and make it come out the same on the printer.
X! * -Use inch units and assume the paper is 8.5x11.0.
X! * (future change: allow selection of paper size and margins) */
X! xdpi = (((double)DisplayWidth(hDisplay,hScreen)) * 25.4) /
X! ((double)DisplayWidthMM(hDisplay,hScreen));
X! ydpi = (((double)DisplayHeight(hDisplay,hScreen)) * 25.4) /
X! ((double)DisplayHeightMM(hDisplay,hScreen));
X! xscale = ((double)psimage->width) / xdpi;
X! yscale = ((double)psimage->height) / ydpi;
X! if (xscale > 7.5) {
X! yscale *= 7.5 / xscale;
X! xscale = 7.5;
X! }
X! else if (yscale > 10.0) {
X! xscale *= 10.0 / yscale;
X! yscale = 10.0;
X! }
X! fprintf(outfile, "%1.2g inch %1.2g inch translate\n",
X! (8.5 - xscale) / 2.0, (11.0 - yscale) / 2.0);
X! fprintf(outfile, "%1.2g inch %1.2g inch scale\n", xscale, yscale);
X }
X!
X fputs("plotimage\n", outfile);
X
X
X+
X+ /* redefine the flush macro to do some actual writing now */
X+ #undef FLUSH
X+ #define FLUSH(stream) { \
X+ if (rlecount && widthcount > 40) { \
X+ fputc('\n', stream); \
X+ widthcount = 0; \
X+ } \
X+ if (rlecount) { \
X+ fprintf(stream, "%02x", (rlecount-1) | (repeating? 0 : 0x80)); \
X+ if (repeating) { \
X+ fprintf(stream, "%02x", rlebytes[0]); \
X+ widthcount += 2; \
X+ } \
X+ else { \
X+ for (i=0; i<rlecount; i++) \
X+ fprintf(stream, "%02x", rlebytes[i]); \
X+ widthcount += 1 + rlecount; \
X+ } \
X+ } \
X+ if (rlecount) { \
X+ rletotal += 1 + (repeating? 1 : rlecount); \
X+ rlecount = 0; \
X+ } \
X+ }
X+
X+
X reverse = depth == 1? BlackPixel(hDisplay,hScreen)==1 : FALSE;
X! if (encode)
X! START_ENCODING
X for (y=0; y<psimage->height; y++) {
X for (x=0, ptr=(byte *)(psimage->data+(y * psimage->bytes_per_line));
X x<psimage->width;
X***************
X*** 985,1012 ****
X if (reverse) b = ~b;
X if (depth == 1 && psimage->bitmap_bit_order == LSBFirst)
X b = swapbits(b);
X! if (rle) {
X! if (b != rlebyte || rlecount == 0xff) {
X! if (rletotal) /* == 0 first time through main loop */
X! fprintf(outfile, "%02x%02x", rlecount, rlebyte);
X! rletotal += 2;
X! if (rletotal % 200 == 0)
X! fputs("\n", outfile);
X! rlecount = 0;
X! rlebyte = b;
X! }
X! else
X! rlecount++;
X! }
X else
X fprintf(outfile, "%02x", b);
X }
X! if (!rle)
X fputs("\n", outfile);
X }
X- if (rle && rletotal)
X- fprintf(outfile, "%02x%02x\n", rlecount, rlebyte);
X
X fputs("\n\n\ngrestore\nshowpage\n", outfile);
X
X
X--- 1229,1251 ----
X if (reverse) b = ~b;
X if (depth == 1 && psimage->bitmap_bit_order == LSBFirst)
X b = swapbits(b);
X! if (encode)
X! ENCODE(b,outfile)
X else
X fprintf(outfile, "%02x", b);
X }
X! if (!encode)
X fputs("\n", outfile);
X }
X
X+ if (encode) {
X+ FINISH_ENCODING(outfile)
X+ fputs("%\n", outfile);
X+ fprintf(outfile, "%% Run-length encoding savings = %5.1f%%\n",
X+ 100.0 - ((float)(rletotal) * 100.0 / (float)(psimage->height * bpl)));
X+ fputs("%\n", outfile);
X+ }
X+
X fputs("\n\n\ngrestore\nshowpage\n", outfile);
X
X
X***************
X*** 1131,1138 ****
X color.blue = image->blue[i];
X color.flags = visMask;
X color.pad = 0;
X! if (*(char *) &swaptest)
X! swapwords(&color, sizeof(XColor));
X fwrite(&color, sizeof(XColor), 1, outfile);
X }
X
X--- 1370,1379 ----
X color.blue = image->blue[i];
X color.flags = visMask;
X color.pad = 0;
X! if (*(char *) &swaptest) {
X! swapdws(&color.pixel, sizeof(color.pixel));
X! swapwords(&color.red, 3 * sizeof(color.red)); /* assume g and b follow r */
X! }
X fwrite(&color, sizeof(XColor), 1, outfile);
X }
X
X***************
X*** 1261,1282 ****
X int argc;
X char *argv[];
X {
X FILE *outfile;
X char *outfileName;
X XRectangle xrect;
X imageInfo image;
X! int doAnd, doOr, depth;
X int puzzle, xWD, brighten, postscript;
X int forceBitmap, grabServer;
X int dither, halftone;
X int sleepSeconds;
X int andBits, orBits;
X! char c;
X char *ptr;
X char *display;
X! int i, nr, nc;
X! extern char *optarg;
X int brightenFactor;
X
X outfile = stdout;
X outfileName = NULL;
X--- 1502,1529 ----
X int argc;
X char *argv[];
X {
X+ extern char *optarg;
X FILE *outfile;
X char *outfileName;
X XRectangle xrect;
X imageInfo image;
X! int doAnd, doOr;
X! int depth;
X int puzzle, xWD, brighten, postscript;
X int forceBitmap, grabServer;
X int dither, halftone;
X+ int compress;
X int sleepSeconds;
X int andBits, orBits;
X! int encapsulate;
X! int sourceRoot, sourceId, sourceWd;
X! Window sourceWindow;
X! long ignored;
X char *ptr;
X char *display;
X! int x, y, width, height, border, i, nr, nc;
X int brightenFactor;
X+ int c;
X
X outfile = stdout;
X outfileName = NULL;
X***************
X*** 1289,1301 ****
X dither = FALSE;
X grabServer = TRUE;
X postscript = FALSE;
X doAnd = FALSE;
X doOr = FALSE;
X sleepSeconds= 0;
X display = NULL;
X verbose = FALSE;
X
X! while ((c = getopt(argc, argv, "d:no:s:v b:A:BDHO: PWZ")) != EOF)
X switch (c) {
X case 'd':
X display = optarg;
X--- 1536,1554 ----
X dither = FALSE;
X grabServer = TRUE;
X postscript = FALSE;
X+ encapsulate = FALSE;
X+ compress = TRUE;
X doAnd = FALSE;
X doOr = FALSE;
X sleepSeconds= 0;
X display = NULL;
X verbose = FALSE;
X+ sourceId = FALSE;
X+ sourceWd = FALSE;
X+ sourceRoot = FALSE;
X
X!
X! while ((c = getopt(argc, argv, "d:no:s:v cri:w b:A:BDHO: EPWZ")) != EOF)
X switch (c) {
X case 'd':
X display = optarg;
X***************
X*** 1315,1322 ****
X--- 1568,1613 ----
X break;
X
X
X+ case 'c':
X+ compress = FALSE;
X+ goto pslabel;
X+ break;
X+ case 'r':
X+ sourceRoot = TRUE;
X+ if (sourceWd || sourceId) {
X+ fprintf(stderr,
X+ "%s: multiple window sources not allowed - using root window\n",
X+ programName);
X+ sourceWd = sourceId = FALSE;
X+ }
X+ break;
X+ case 'i':
X+ sourceId = TRUE;
X+ if (sourceRoot || sourceWd) {
X+ fprintf(stderr,
X+ "%s: multiple window sources not allowed - using window id\n",
X+ programName);
X+ sourceRoot = sourceWd = FALSE;
X+ }
X+ sourceWindow = 0;
X+ if (!sscanf(optarg, "0x%lx", &sourceWindow))
X+ if (!sscanf(optarg, "%ld", &sourceWindow)) {
X+ sprintf(stderr, "%s: invalid window id\n", programName);
X+ exit(3);
X+ }
X+ break;
X+ case 'w':
X+ sourceWd = TRUE;
X+ if (sourceRoot || sourceId) {
X+ fprintf(stderr,
X+ "%s: multiple window sources not allowed - using xwd-style\n",
X+ programName);
X+ sourceRoot = sourceId = FALSE;
X+ }
X+ break;
X
X
X+
X case 'A':
X andBits = atoi(optarg);
X doAnd = TRUE;
X***************
X*** 1359,1365 ****
X--- 1650,1659 ----
X
X
X
X+ case 'E':
X+ encapsulate = TRUE;
X case 'P':
X+ pslabel:
X postscript = TRUE;
X if (xWD | puzzle) {
X fprintf(stderr,
X***************
X*** 1372,1378 ****
X xWD = TRUE;
X if (puzzle | postscript) {
X fprintf(stderr,
X! "%s: can't do both puzzle and XWD output. Using XWD.\n",
X programName);
X puzzle = postscript = FALSE;
X }
X--- 1666,1672 ----
X xWD = TRUE;
X if (puzzle | postscript) {
X fprintf(stderr,
X! "%s: only one output format allowed. Using XWD.\n",
X programName);
X puzzle = postscript = FALSE;
X }
X***************
X*** 1413,1434 ****
X if (grabServer)
X XGrabServer(hDisplay);
X
X! /* let the user drag out a rectangle on the screen */
X! if (!getRectangle(&xrect)) {
X XCloseDisplay(hDisplay);
X exit(3);
X }
X
X /* get the image bounded by the rectangle */
X! if (!getImage(&xrect, &image)) {
X XCloseDisplay(hDisplay);
X exit(3);
X }
X
X! if (grabServer) {
X XUngrabServer(hDisplay);
X! XFlush(hDisplay);
X! }
X
X /* do color image processing/conversions */
X if (depth >= 2) {
X--- 1707,1760 ----
X if (grabServer)
X XGrabServer(hDisplay);
X
X!
X!
X! /* get the source rectangle */
X! sourceWindow = hRoot;
X! if (sourceRoot) {
X! xrect.x = xrect.y = 0;
X! xrect.width = DisplayWidth(hDisplay, hScreen);
X! xrect.height = DisplayHeight(hDisplay, hScreen);
X! }
X! else if (sourceId || sourceWd) {
X! if (sourceWd && !(sourceWindow=getWindow())) {
X! fprintf(stderr, "%s: unable to find source window\n", programName);
X! XCloseDisplay(hDisplay);
X! exit(3);
X! }
X! /* get window widthXheight */
X! if (!XGetGeometry(hDisplay, sourceWindow, &ignored,
X! &ignored, &ignored, &width, &height, &ignored, &border)) {
X! fprintf(stderr, "%s: unable to get window coordinates\n", programName);
X! XCloseDisplay(hDisplay);
X! exit(3);
X! }
X! xrect.width = width;
X! xrect.height = height;
X! xrect.x = 0;
X! xrect.y = 0;
X! }
X! else if (!getRectangle(&xrect)) {
X XCloseDisplay(hDisplay);
X exit(3);
X }
X+
X+
X+
X
X /* get the image bounded by the rectangle */
X! XBell(hDisplay, 50);
X! if (!getImage(&xrect, &image, sourceWindow)) {
X XCloseDisplay(hDisplay);
X exit(3);
X }
X
X! if (grabServer)
X XUngrabServer(hDisplay);
X!
X! XBell(hDisplay, 50);
X! XBell(hDisplay, 50);
X! XFlush(hDisplay);
X
X /* do color image processing/conversions */
X if (depth >= 2) {
X***************
X*** 1470,1476 ****
X
X /* garbage in --> garbage out */
X if (postscript)
X! writePostscript(&image, outfile);
X else if (xWD)
X writeXWD(&image, outfile);
X else if (puzzle)
X--- 1796,1802 ----
X
X /* garbage in --> garbage out */
X if (postscript)
X! writePostscript(&image, outfile, compress, encapsulate);
X else if (xWD)
X writeXWD(&image, outfile);
X else if (puzzle)
X*** rls1/xgrabsc.man Mon Sep 10 08:24:26 1990
X--- xgrabsc.man Tue Sep 4 16:40:50 1990
X***************
X*** 2,12 ****
X .\"
X .\" Name - xgrabsc.man
X .\"
X! .\" Version: 1.2
X .\"
X! .\" ccsid: @(#)xgrabsc.man 1.2 - 8/17/90 09:07:01
X .\" from: ccs/s.xgrabsc.man
X! .\" date: 8/20/90 09:56:03
X .\"
X .\" Copyright (C) 1990, Bruce Schuchardt
X .\" See the end of this document for full copyright information.
X--- 2,12 ----
X .\"
X .\" Name - xgrabsc.man
X .\"
X! .\" Version: 1.3
X .\"
X! .\" ccsid: @(#)xgrabsc.man 1.3 - 9/4/90 16:36:48
X .\" from: ccs/s.xgrabsc.man
X! .\" date: 9/4/90 16:40:09
X .\"
X .\" Copyright (C) 1990, Bruce Schuchardt
X .\" See the end of this document for full copyright information.
X***************
X*** 38,43 ****
X--- 38,46 ----
X -d \fIdisplayName\fP
X Use an alternate display.
X .TP
X+ -i \fIwindow ID\fP
X+ Dump the window with the given ID.
X+ .TP
X -n
X Inhibit server grabs. Normally xgrabsc will "grab" the server so
X that the screen is frozen while a rectangle is selected and the image
X***************
X*** 47,52 ****
X--- 50,58 ----
X -o \fIoutput-file\fP
X Write output to \fIoutput-file\fP instead of standard output.
X .TP
X+ -r
X+ Dump the entire screen (root window).
X+ .TP
X -s \fIseconds\fP
X Sleep for \fIseconds\fP seconds before commencing operation. This
X should be used if you need some time to get the target image ready.
X***************
X*** 53,58 ****
X--- 59,67 ----
X .TP
X -v
X Display processing information on standard error output (stderr).
X+ .TP
X+ -w
X+ Use \fIxwd\fP style window selection and dump selected window.
X .sp 3
X .TP
X -b \fIpercent\fR
X***************
X*** 88,98 ****
X--- 97,116 ----
X a factor of four on both axes.
X .sp 3
X .TP
X+ -E
X+ Create Encapsulated Postscript output, rather than normal vanilla
X+ Postscript. This adds EPSF header comments and removes all scaling and
X+ translation of the image, but otherwise acts like the \fIP\fP option.
X+ .TP
X -P
X Write output in \fIPostscript\fP format. Output will be run-length-encoded
X if encoding will result in any savings. The number of bits per
X Postscript sample is determined by the depth of the image.
X .TP
X+ -c
X+ Suppress Postscript image run-length encoding. This option is ignored
X+ unless the \fI-P\fP Postscript-output option is also specified.
X+ .TP
X -W
X Write output in \fIxwd\fP format.
X .TP
X***************
X*** 144,154 ****
X xgrabsc -Pb 130 | lpr
X .sp
X .PP
X! To write output in \fIpuzzle\fP format and read into the puzzle
X! program, use the commands
X .sp
X .ti +5
X! xgrabsc -Z >outfile.pzl
X .br
X .ti +5
X puzzle -picture outfile.pzl
X--- 162,172 ----
X xgrabsc -Pb 130 | lpr
X .sp
X .PP
X! To select an entire window, write output in \fIpuzzle\fP format
X! and read into the puzzle program, use the commands
X .sp
X .ti +5
X! xgrabsc -wZ >outfile.pzl
X .br
X .ti +5
X puzzle -picture outfile.pzl
X***************
X*** 191,201 ****
X .sp
X .SH AUTHOR
X .nf
X! +----------------------------+
X! | Bruce Schuchardt |
X! | Servio Corporation |
X! | bruce at slc.com |
X! +----------------------------+
X .fi
X .sp 2
X .SH ACKNOWLEGEMENTS
X--- 209,217 ----
X .sp
X .SH AUTHOR
X .nf
X! Bruce Schuchardt
X! Servio Corporation
X! bruce at slc.com
X .fi
X .sp 2
X .SH ACKNOWLEGEMENTS
X*** rls1/patchlevel.h Mon Sep 10 08:24:31 1990
X--- patchlevel.h Tue Sep 4 16:42:21 1990
X***************
X*** 4,14 ****
X *
X * Name - patchlevel.h
X *
X! * Version: 1.1
X *
X! * ccsid: @(#)patchlevel.h 1.1 - 8/16/90 09:12:36
X * from: ccs/s.patchlevel.h
X! * date: 8/20/90 09:56:01
X *
X * Copyright (C), 1990 Bruce Schuchardt
X * See cpyright.h for full copyright information.
X--- 4,14 ----
X *
X * Name - patchlevel.h
X *
X! * Version: 1.3
X *
X! * ccsid: @(#)patchlevel.h 1.3 - 9/4/90 16:41:35
X * from: ccs/s.patchlevel.h
X! * date: 9/4/90 16:41:40
X *
X * Copyright (C), 1990 Bruce Schuchardt
X * See cpyright.h for full copyright information.
X***************
X*** 17,23 ****
X *
X *========================================================================*/
X
X! #define XGRABSC_PATCHLEVEL 0
X
X!
X #endif
X--- 17,23 ----
X *
X *========================================================================*/
X
X! #define XGRABSC_PATCHLEVEL 1
X
X! #define XGRABSC_VERSION "1.0 9/4/90 16:41:40"
X #endif
X*** rls1/Imakefile Mon Sep 10 08:24:22 1990
X--- Imakefile Tue Sep 4 16:40:47 1990
X***************
X*** 2,12 ****
X *
X * Name - Imakefile
X *
X! * Version: 1.3
X *
X! * ccsid: @(#)Imakefile 1.3 - 8/20/90 09:54:45
X * from: ccs/s.Imakefile
X! * date: 8/20/90 09:55:58
X *
X * Description: imake file to build xgrabsc. Use simple.mak if you
X * don't have imake.
X--- 2,12 ----
X *
X * Name - Imakefile
X *
X! * Version: 1.4
X *
X! * ccsid: @(#)Imakefile 1.4 - 9/4/90 16:35:19
X * from: ccs/s.Imakefile
X! * date: 9/4/90 16:40:06
X *
X * Description: imake file to build xgrabsc. Use simple.mak if you
X * don't have imake.
X***************
X*** 14,34 ****
X *========================================================================
X */
X
X- /* change INSTALL_PATH to the directory in which you want xgrabsc installed */
X- INSTALL_PATH = /usr/bin/X11
X-
X- /* change MAN_PATH to point to your man page top directory */
X- MAN_PATH = /usr/man
X- /* change MAN_EXT to the section for xgrabsc */
X- MAN_EXT = 1
X-
X- /* if you trust your optimizer, change 'g' to 'O' */
X- CDEBUGFLAGS = -g
X LOCAL_LIBRARIES = $(XLIB)
X
X SimpleProgramTarget(xgrabsc)
X
X- install::
X- $(INSTALL) -c -s xgrabsc $(INSTALL_PATH)
X- $(INSTALL) -c -m 644 xgrabsc.man \
X- $(MAN_PATH)/man$(MAN_EXT)/xgrabsc.$(MAN_EXT)X
X--- 14,20 ----
X*** rls1/README Mon Sep 10 08:24:21 1990
X--- README Tue Sep 4 16:40:48 1990
X***************
X*** 2,12 ****
X *
X * Name - README
X *
X! * Version: 1.3
X *
X! * ccsid: @(#)README 1.3 - 8/20/90 09:55:04
X * from: ccs/s.README
X! * date: 8/20/90 09:55:59
X *
X * Copyright (C) 1990, Bruce Schuchardt
X * See either the man page or the file cpyright.h for full copyright
X--- 2,12 ----
X *
X * Name - README
X *
X! * Version: 1.4
X *
X! * ccsid: @(#)README 1.4 - 9/4/90 16:39:38
X * from: ccs/s.README
X! * date: 9/4/90 16:40:07
X *
X * Copyright (C) 1990, Bruce Schuchardt
X * See either the man page or the file cpyright.h for full copyright
X***************
X*** 30,63 ****
X The Postscript dumps will use run-length encoding if it results in
X any savings in size. A typical xterm window dump on a mono system
X runs around 40K bytes. An xwd dump on the same screen will be around
X! 650K bytes.
X
X The program should build easily enough. If you don't have imake,
X! use simple.mak (i.e., make -f simple.mak). For building, you
X! should only have to alter the makefiles if your include files or
X! libraries are in a non-standard location (/usr/include/X11, /usr/
X! lib).
X
X! The makefiles will install xgrabsc in /usr/bin/X11 and the man page in
X! /usr/man/man1. Change the makefile before installing if you don't like
X! these locations.
X
X
X Please send comments, bugs and enhancements to bruce at slc.com.
X
X
X! Manifest
X! --------
X! README this file
X
X! Imakefile Input for "imake" program
X! simple.mak Simpler input for standard "make"
X
X! cpyright.h Copyright notice for this software (READ IT)
X! patchlevel.h Current patch level
X! xgrabsc.c Program source
X
X! xgrabsc.man Man page for xgrabsc
X
X
X
X--- 30,65 ----
X The Postscript dumps will use run-length encoding if it results in
X any savings in size. A typical xterm window dump on a mono system
X runs around 40K bytes. An xwd dump on the same screen will be around
X! 650K bytes. While the xpr program has a "compress" option, it only
X! compresses white samples.
X
X+ The puzzle program only supports the "picture" option for 8-plane
X+ systems, so please don't tell me that it doesn't work on your
X+ monochrome system. I already know it doesn't.
X+
X The program should build easily enough. If you don't have imake,
X! use simple.mak (i.e., make -f simple.mak).
X
X! The simple.mak file will install xgrabsc in /usr/bin/X11 and the
X! man page in /usr/man/man1. Change simple.mak before installing
X! with it if you don't like these locations.
X
X
X Please send comments, bugs and enhancements to bruce at slc.com.
X
X
X! Manifest
X! ---------------------------------
X! README this file
X
X! Imakefile Input for "imake" program
X! simple.mak Simpler input for standard "make"
X
X! cpyright.h Copyright notice for this software (READ IT)
X! patchlevel.h Current patch level
X! xgrabsc.c Program source
X
X! xgrabsc.man Man page for xgrabsc
X
X
X
X*** rls1/simple.mak Mon Sep 10 08:24:32 1990
X--- simple.mak Tue Sep 4 16:40:49 1990
X***************
X*** 2,17 ****
X #
X # Name - simple.mak
X #
X! # Version: 1.3
X #
X! # ccsid: @(#)simple.mak 1.3 - 8/20/90 09:55:13
X # from: ccs/s.simple.mak
X! # date: 8/20/90 09:56:01
X #
X # Description: make file for xgrabsc. Use "make -f simple.mak"
X #
X #=============================================================================
X
X
X # change INSTALL_PATH to the directory in which you want xgrabsc installed
X INSTALL_PATH = /usr/bin/X11
X--- 2,18 ----
X #
X # Name - simple.mak
X #
X! # Version: 1.4
X #
X! # ccsid: @(#)simple.mak 1.4 - 9/4/90 16:35:29
X # from: ccs/s.simple.mak
X! # date: 9/4/90 16:40:08
X #
X # Description: make file for xgrabsc. Use "make -f simple.mak"
X #
X #=============================================================================
X
X+ # CFLAGS = -g -DNO_RLE_CHECKS -DMEMCPY
X
X # change INSTALL_PATH to the directory in which you want xgrabsc installed
X INSTALL_PATH = /usr/bin/X11
X***************
X*** 21,29 ****
X # change MAN_EXT to the section for xgrabsc
X MAN_EXT = 1
X
X- # if you trust your optimizer, change 'g' to 'O'
X- CFLAGS = -g
X-
X xgrabsc:: xgrabsc.o
X rm -f xgrabsc
X $(CC) $(CFLAGS) -o xgrabsc xgrabsc.o -lX11
X--- 22,27 ----
X***************
X*** 30,37 ****
X
X install::
X install -c -s xgrabsc $(INSTALL_PATH)
X install -c -m 644 xgrabsc.man \
X! $(MAN_PATH)/man$(MAN_EXT)/xgrabsc.$(MAN_EXT)X
X
X clean::
X rm -f core *.o xgrabsc *.log
X--- 28,37 ----
X
X install::
X install -c -s xgrabsc $(INSTALL_PATH)
X+
X+ install.man::
X install -c -m 644 xgrabsc.man \
X! $(MAN_PATH)/man$(MAN_EXT)/xgrabsc.$(MAN_EXT)
X
X clean::
X rm -f core *.o xgrabsc *.log
END_OF_FILE
if test 46079 -ne `wc -c <'patch1'`; then
echo shar: \"'patch1'\" unpacked with wrong size!
fi
# end of 'patch1'
fi
echo shar: End of archive 1 \(of 1\).
cp /dev/null ark1isdone
MISSING=""
for I in 1 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have the archive.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0
dan
----------------------------------------------------
O'Reilly && Associates argv at sun.com / argv at ora.com
Opinions expressed reflect those of the author only.
More information about the Comp.sources.x
mailing list