bruce@SLC.COM (Bruce Schuchardt) (09/19/90)
Submitted-by: bruce@SLC.COM (Bruce Schuchardt) Posting-number: Volume 9, Issue 45 Archive-name: xgrabsc/patch2 Patch-To: xgrabsc: Volume 8, Issue 75,76 Patch-To: xgrabsc: Volume 9, Issue 26 Here is the second patch set for xgrabsc. See the file README.patch2 for information concerning bugs fixed and new features added in this patch set. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bruce Schuchardt Ph: (503) 629-8383 Servio Corp. bruce@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: Acks Bugs README.patch2 patch2 # Wrapped by owner@spruce on Tue Sep 18 16:20:46 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'Acks' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Acks'\" else echo shar: Extracting \"'Acks'\" \(622 characters\) sed "s/^X//" >'Acks' <<'END_OF_FILE' X/*======================================================================== X* X* Name - Acks X* X* Version: 1.1 X* X* ccsid: @(#)Acks 1.1 - 9/18/90 16:16:45 X* from: ccs/s.Acks X* date: 9/18/90 16:16:58 X* X* Description: Thanks to the people listed below for their help in this X* project X* X*======================================================================== X X 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 Brian C. Smith for YIQ greyscale and Floyd-Steinberg algorithms END_OF_FILE if test 622 -ne `wc -c <'Acks'`; then echo shar: \"'Acks'\" unpacked with wrong size! fi # end of 'Acks' fi if test -f 'Bugs' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'Bugs'\" else echo shar: Extracting \"'Bugs'\" \(1479 characters\) sed "s/^X//" >'Bugs' <<'END_OF_FILE' X/*======================================================================== X* X* Name - Bugs X* X* Version: 1.1 X* X* ccsid: @(#)Bugs 1.1 - 9/18/90 16:16:36 X* from: ccs/s.Bugs X* date: 9/18/90 16:16:57 X* X* Description: Known bugs and problems. This list does not include X* bugs that have been fixed. See the patch set README X* files for descriptions of the bugs they fix. X* X*========================================================================*/ 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 END_OF_FILE if test 1479 -ne `wc -c <'Bugs'`; then echo shar: \"'Bugs'\" unpacked with wrong size! fi # end of 'Bugs' fi if test -f 'README.patch2' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'README.patch2'\" else echo shar: Extracting \"'README.patch2'\" \(2308 characters\) sed "s/^X//" >'README.patch2' <<'END_OF_FILE' X*======================================================================== X* X* Name - README.patch2 X* X* Version: 1.1 X* X* ccsid: @(#)README.patch2 1.1 - 9/18/90 16:16:50 X* from: ccs/s.README.patch2 X* date: 9/18/90 16:16:59 X* X* Description: notes on patch kit #2 for version 1.0 X* X*======================================================================== X XOPTIONS: X XOne new option is added in patch 02: X X -F dithers the input image with Floyd-Steinberg algorithm X rather than the matrix algorithm used by the -D option X XThe dithering code was pretty much rewritten to merge in the FS dithering Xstuff. X XA bug in the matrix dithering code was causing it to fail on LSBFirst Xmachines. X XA bug in window selection by ID was causing it to always select the root Xwindow (I forgot to put on my Q/A hat after writing that one). X XThe greyscale calculations now use the YIQ formula that is apparently Xcommonly used to do this sort of stuff. X X X XBUILDING: X XNo new build options have been added in patch set 2. Here are the notes Xfrom patch set 1: X X The imake and make files were changed to follow accepted conventions. X A new target was added for man page installation (install.man). X X The compilation flag -DNO_RLE_CHECKS will eliminate a pass that xgrabsc X makes over the source image to determine whether compression of Postscript X output will actually result in size savings. X X For machines with no memcpy() or memset() routines in their standard X libraries, conditionally compiled routines were added to xgrabsc.c. X Compile with -DMEMCPY to use these routines. X X X XBUGS: X XDescriptions of known bugs and problems are in the new file "Bugs". X XI try to respond to all problem reports. If you do not receive a Xresponse to e-mail, your mail either did not reach me or I could not Xreach you with a reply after two or three attempts. X XNo bugs were reported in version 1.0 patch level 1. See README.patch1 Xfor a list of persistent bugs that are not caused by xgrabsc. X X X XACKNOWLEDGMENTS: X XAcknowledgments have been moved to the file Acks. Please read it. People Xwho contribute to free software efforts deserve to be recognized. X X X X X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ X Bruce Schuchardt Ph: (503) 629-8383 X Servio Corp. bruce@SLC.COM X Beaverton, OR X END_OF_FILE if test 2308 -ne `wc -c <'README.patch2'`; then echo shar: \"'README.patch2'\" unpacked with wrong size! fi # end of 'README.patch2' fi if test -f 'patch2' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'patch2'\" else echo shar: Extracting \"'patch2'\" \(19310 characters\) sed "s/^X//" >'patch2' <<'END_OF_FILE' XPrereq: 1 X*** checkpoint/xgrabsc.c Wed Sep 12 15:28:19 1990 X--- xgrabsc.c Tue Sep 18 15:54:38 1990 X*************** X*** 1,12 **** X /*======================================================================== X * X! * Name - %M% X * X! * Version: %I% X * X! * ccsid: %W% - %G% %U% X! * from: %F% X! * date: %H% %T% X * X * Copyright (c) 1990 Bruce Schuchardt. X * Read the file cpyright.h for full copyright information. X--- 1,12 ---- X /*======================================================================== X * X! * Name - xgrabsc.c X * X! * Version: 1.9 X * X! * ccsid: @(#)xgrabsc.c 1.9 - 9/18/90 15:53:34 X! * from: ccs/s.xgrabsc.c X! * date: 9/18/90 15:54:11 X * X * Copyright (c) 1990 Bruce Schuchardt. X * Read the file cpyright.h for full copyright information. X*************** X*** 39,44 **** X--- 39,52 ---- X #define FALSE 0 X X X+ typedef enum { X+ NO_DITHER=0, X+ FS_DITHER, X+ MATRIX_DITHER, X+ MATRIX_HALFTONE X+ } ditherType; X+ X+ X typedef unsigned char byte; X typedef unsigned long dw; X typedef unsigned int word; X*************** X*** 691,697 **** X X X #define GRAYS 17 /* ((4 * 4) + 1) patterns for a good dither */ X! #define GRAYSTEP ((dw)(65536 * 3) / GRAYS) X X static byte DitherBits[GRAYS][4] = { X 0xf, 0xf, 0xf, 0xf, X--- 699,705 ---- X X X #define GRAYS 17 /* ((4 * 4) + 1) patterns for a good dither */ X! #define GRAYSTEP ((dw)(65536 / GRAYS)) X X static byte DitherBits[GRAYS][4] = { X 0xf, 0xf, 0xf, 0xf, X*************** X*** 718,754 **** X */ X pixmap2halftone(image, dither) X imageInfo *image; X! int dither; /* if TRUE, dither instead of halftone */ X { X XImage *ximage = image->ximage; X XImage *newImage; X! byte *newBytes, *dp, *ditherBits; X word dindex; /* index into dither array */ X dw color; /* pixel color */ X word *index; /* index into dither array for a given pixel */ X word x, y; /* random counters */ X word x4, y4; X! word w, h; X! int reversed; X! register byte *dp2; X register byte bits; X X if (verbose) { X! fprintf(stderr, "%s: %sing image...", programName, X! dither? "dither" : "halfton"); X fflush(stderr); X } X X /* create a bitmap image */ X! w = (ximage->width + 7) / 8; X! if (!dither) w *= 4; X! h = dither? ximage->height : ximage->height * 4; X newBytes = (byte *)malloc(w * h); X memset(newBytes, 0, w * h); X newImage = XCreateImage(hDisplay, DefaultVisual(hDisplay, hScreen), X 1, XYBitmap, 0, newBytes, X! ximage->width * (dither? 1 : 4), X! ximage->height * (dither? 1 : 4), X 0, w); X if (!newImage) { X fprintf(stderr, "%s: unable to create bitmap for conversion\n", X--- 726,783 ---- X */ X pixmap2halftone(image, dither) X imageInfo *image; X! ditherType dither; /* type of dithering to perform */ X { X XImage *ximage = image->ximage; X XImage *newImage; X! byte *newBytes, *ditherBits; X word dindex; /* index into dither array */ X dw color; /* pixel color */ X word *index; /* index into dither array for a given pixel */ X word x, y; /* random counters */ X word x4, y4; X! register word w, h; X register byte bits; X+ char *str; X+ dw intensity; X+ int maxIntensity, threshold; X+ word *fsIndex; X+ int err, i; X+ int *row1, *row2; X X+ if (ximage->depth <= 1 || dither == NO_DITHER) X+ return; X+ X if (verbose) { X! switch (dither) { X! case MATRIX_HALFTONE: X! str = "Matrix halfton"; X! break; X! case MATRIX_DITHER: X! str = "Matrix dither"; X! break; X! case FS_DITHER: X! str = "Floyd-Steinberg dither"; X! break; X! default: X! fprintf(stderr, "%s: unknown type of dithering requested. Exiting...\n", X! programName); X! exit(3); X! } X! fprintf(stderr, "%s: %sing image...", programName, str); X fflush(stderr); X } X X /* create a bitmap image */ X! x = (dither == MATRIX_HALFTONE)? 4 : 1; X! w = ((ximage->width + 7) / 8) * x; X! h = ximage->height * x; X newBytes = (byte *)malloc(w * h); X memset(newBytes, 0, w * h); X newImage = XCreateImage(hDisplay, DefaultVisual(hDisplay, hScreen), X 1, XYBitmap, 0, newBytes, X! ximage->width * x, X! h, X 0, w); X if (!newImage) { X fprintf(stderr, "%s: unable to create bitmap for conversion\n", X*************** X*** 757,765 **** 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 * by color brightness. we do this in advance so we don't have to do X--- 786,791 ---- X*************** X*** 770,830 **** X X if (ximage->depth <= 16) { X index= (word *)malloc(sizeof(word) * MAX_CELLS); X if (index) X for (x= 0; x < image->numcells; x++) { X! index[x] = X! ((dw)(image->red[x]) X! + (dw)(image->green[x]) X! + (dw)(image->blue[x]) ) / GRAYSTEP; X if (index[x] >= GRAYS) X index[x] = GRAYS - 1; X } X } X else X! index= NULL; X X! /* dither each pixel X! */ X! reversed = newImage->bitmap_bit_order == LSBFirst; X! for (y= 0; y < ximage->height; y++) { X for (x= 0; x < ximage->width; x++) { X! color = XGetPixel(ximage, x, y); X! if (index) X! dindex= index[color]; X! else { X! dindex= ((dw)image->red[color] X! +(dw)image->green[color] X! +(dw)image->blue[color] ) / GRAYSTEP; X! if (dindex >= GRAYS) /* catch rounding errors */ X! dindex= GRAYS - 1; X } X! if (dither) { X! if (DitherBits[dindex][y & 3] & (1 << (x & 3))) X! XPutPixel(newImage, x, y, 1); X! } X! else { /* halftone */ X! /* loop for the four Y bits in the dither pattern, putting all X! * four X bits in at once. if you think this would be hard to X! * change to be an NxN dithering array, you're right, since we're X! * banking on the fact that we need only shift the mask based on 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- if (dither) X- dp += newImage->bytes_per_line; X- else X- dp += 4 * newImage->bytes_per_line; X } X if (verbose) X fputc('\n', stderr); X X--- 796,904 ---- X X if (ximage->depth <= 16) { X index= (word *)malloc(sizeof(word) * MAX_CELLS); X+ fsIndex= (word *)malloc(sizeof(word) * MAX_CELLS); X if (index) X for (x= 0; x < image->numcells; x++) { X! fsIndex[x] = (word)(0.30 * image->red[x] + X! 0.59 * image->green[x] + X! 0.11 * image->blue[x]); X! index[x] = fsIndex[x]/GRAYSTEP; X if (index[x] >= GRAYS) X index[x] = GRAYS - 1; X } X } X else X! index = fsIndex = NULL; X X! if (dither == FS_DITHER) { X! maxIntensity = 65535; X! threshold = maxIntensity/2; X! row1 = (int *)malloc(ximage->width*sizeof(int)); X! row2 = (int *)malloc(ximage->width*sizeof(int)); X! /* initialize row2 */ X for (x= 0; x < ximage->width; x++) { X! color = XGetPixel(ximage, x, 0); X! row2[x] = fsIndex? fsIndex[color] : X! (dw)(0.30*image->red[color] + X! 0.59*image->green[color] + X! 0.11*image->blue[color]); X! } X! for (y= 0; y < ximage->height; y++) { X! /* row1 := row2 */ X! memcpy(row1, row2, ximage->width*sizeof(int)); X! /* Fill in next row */ X! if (y != ximage->height-1) X! for (x= 0; x < ximage->width; x++) { X! color = XGetPixel(ximage, x, y+1); X! row2[x] = fsIndex? fsIndex[color] : X! (dw)(0.30*image->red[color] + X! 0.59*image->green[color] + X! 0.11*image->blue[color]); X! } X! for (x= 0; x < ximage->width; x++) { X! color = XGetPixel(ximage, x, y); X! intensity = fsIndex? fsIndex[color] : X! (dw)(0.30*image->red[color] + X! 0.59*image->green[color] + X! 0.11*image->blue[color]); X! if ((i = row1[x]) > threshold) X! err = i - maxIntensity; X! else { X! XPutPixel(newImage, x, y, 1); X! err = i; X! } X! /* Diagonal gets 1/4 of error. */ X! row2[x+1] += err/4; X! X! /* Right and below get 3/8 of error */ X! err = err*3/8; X! row2[x] += err; X! row1[x+1] += err; X } X! } X! if (row1) free(row1); X! if (row2) free(row2); X! } X! X! X! else { /* matrix dither or halftone */ X! X! for (y= 0; y < ximage->height; y++) { X! for (x= 0; x < ximage->width; x++) { X! color = XGetPixel(ximage, x, y); X! dindex = index? index[color] : X! (dw)(0.30*image->red[color] + X! 0.59*image->green[color] + X! 0.11*image->blue[color])/GRAYSTEP; X! if (dindex >= GRAYS) /* catch rounding errors */ X! dindex= GRAYS - 1; X! if (dither == MATRIX_DITHER) { X! if (DitherBits[dindex][y & 3] & (1 << (x & 3))) X! XPutPixel(newImage, x, y, 1); X } X+ else { /* halftone */ X+ /* loop for the four Y bits in the dither pattern, putting all X+ * four X bits in at once. if you think this would be hard to X+ * change to be an NxN dithering array, you're right, since we're X+ * banking on the fact that we need only shift the mask based on 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 & 1); X+ bits /= 2; X+ } X+ } X+ } X } X } X } X+ X if (verbose) X fputc('\n', stderr); X X*************** X*** 831,838 **** X free(ximage->data); X memcpy(ximage, newImage, sizeof(XImage)); X free(newImage); X! if (index) X! free(index); X X image->numcells = 0; X } X--- 905,912 ---- X free(ximage->data); X memcpy(ximage, newImage, sizeof(XImage)); X free(newImage); X! if (index) free(index); X! if (fsIndex) free(fsIndex); X X image->numcells = 0; X } X*************** X*** 1513,1519 **** 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--- 1587,1594 ---- X int depth; X int puzzle, xWD, brighten, postscript; X int forceBitmap, grabServer; X! ditherType ditherKind; X! int halftone; X int compress; X int sleepSeconds; X int andBits, orBits; X*************** X*** 1535,1541 **** X brighten = FALSE; X forceBitmap = FALSE; X halftone = FALSE; X! dither = FALSE; X grabServer = TRUE; X postscript = FALSE; X encapsulate = FALSE; X--- 1610,1616 ---- X brighten = FALSE; X forceBitmap = FALSE; X halftone = FALSE; X! ditherKind = NO_DITHER; X grabServer = TRUE; X postscript = FALSE; X encapsulate = FALSE; X*************** X*** 1550,1556 **** 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--- 1625,1631 ---- X sourceRoot = FALSE; X X X! while ((c = getopt(argc, argv, "d:no:s:v cri:w b:A:BDFHO: EPWZ")) != EOF) X switch (c) { X case 'd': X display = optarg; X*************** X*** 1624,1648 **** X brighten = TRUE; X break; X case 'B': X forceBitmap = TRUE; X break; X case 'D': X! dither = TRUE; X! if (halftone) { X fprintf(stderr, X! "%s: both dither and halftone requested. Ignoring halftone.", X programName); X! halftone = FALSE; X } X break; X! case 'H': X halftone = TRUE; X! if (dither) { X fprintf(stderr, X! "%s: both dither and halftone requested. Ignoring halftone.", X programName); X! halftone = FALSE; X } X break; X case 'O': X orBits = atoi(optarg); X--- 1699,1753 ---- X brighten = TRUE; X break; X case 'B': X+ if (halftone) { X+ fprintf(stderr, X+ "%s: both bitmap and halftone conversion requested. Using bitmap.\n", X+ programName); X+ halftone = FALSE; X+ } X forceBitmap = TRUE; X break; X case 'D': X! if (forceBitmap) { X fprintf(stderr, X! "%s: both bitmap and halftone conversion requested. Using halftone.\n", X programName); X! forceBitmap = FALSE; X } X+ if (halftone) X+ fprintf(stderr, X+ "%s: multiple halftone formats requested. Using Matrix dithering.\n", X+ programName); X+ ditherKind = MATRIX_DITHER; X+ halftone = TRUE; X break; X! case 'F': X! if (forceBitmap) { X! fprintf(stderr, X! "%s: both bitmap and halftone conversion requested. Using halftone.\n", X! programName); X! forceBitmap = FALSE; X! } X! if (halftone) X! fprintf(stderr, X! "%s: multiple halftone formats requested. Using Floyd-Steinberg dithering.\n", X! programName); X! ditherKind = FS_DITHER; X halftone = TRUE; X! break; X! case 'H': X! if (forceBitmap) { X fprintf(stderr, X! "%s: both bitmap and halftone conversion requested. Using halftone.\n", X programName); X! forceBitmap = FALSE; X } X+ if (halftone) X+ fprintf(stderr, X+ "%s: multiple halftone formats requested. Using Matrix halftoning.\n", X+ programName); X+ ditherKind = MATRIX_HALFTONE; X+ halftone = TRUE; X break; X case 'O': X orBits = atoi(optarg); X*************** X*** 1684,1689 **** X--- 1789,1800 ---- X break; X } X X+ if (verbose) { X+ fprintf(stderr, "%s: xgrabsc version %s\n", programName, version); X+ fprintf(stderr, "%s: patchlevel %d\n", programName, patchLevel); X+ fprintf(stderr, "%s: %s\n\n", programName, Copyright); X+ } X+ X if (!display) display = (char *)getenv("DISPLAY"); X hDisplay = XOpenDisplay(display); X if (!hDisplay) { X*************** X*** 1712,1718 **** 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--- 1823,1830 ---- X X X /* get the source rectangle */ X! if (!sourceId) X! sourceWindow = hRoot; X if (sourceRoot) { X xrect.x = xrect.y = 0; X xrect.width = DisplayWidth(hDisplay, hScreen); X*************** X*** 1771,1778 **** X pixmap2bitmap(&image); X depth = 1; X } X! else if (halftone | dither) X! pixmap2halftone(&image, dither); X else X compressColormap(&image); X } X--- 1883,1890 ---- X pixmap2bitmap(&image); X depth = 1; X } X! else if (halftone) X! pixmap2halftone(&image, ditherKind); X else X compressColormap(&image); X } X*** checkpoint/xgrabsc.man Wed Sep 12 15:28:20 1990 X--- xgrabsc.man Tue Sep 18 15:54:44 1990 X*************** 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--- 2,12 ---- X .\" X .\" Name - xgrabsc.man X .\" X! .\" Version: 1.4 X .\" X! .\" ccsid: @(#)xgrabsc.man 1.4 - 9/18/90 15:43:15 X .\" from: ccs/s.xgrabsc.man X! .\" date: 9/18/90 15:54:18 X .\" X .\" Copyright (C) 1990, Bruce Schuchardt X .\" See the end of this document for full copyright information. X*************** X*** 86,100 **** X falling below the average color intensity are mapped to black. Others X are mapped to white. X .TP X- -D X- Convert the source color image to a dithered monochrome bitmap. X- This is like halftoning, but resolution is sacrificed to keep the X- resulting image the same size as the original. X- .TP X -H X Convert the source color image to a halftoned monchrome bitmap. X Resolution is maintained by increasing the size of the image by X a factor of four on both axes. X .sp 3 X .TP X -E X--- 86,106 ---- X falling below the average color intensity are mapped to black. Others X are mapped to white. X .TP X -H X Convert the source color image to a halftoned monchrome bitmap. X Resolution is maintained by increasing the size of the image by X a factor of four on both axes. X+ .TP X+ -D X+ Convert the source color image to a dithered monochrome bitmap. X+ This is like halftoning, but resolution is sacrificed to keep the X+ resulting image the same size as the original. The matrix dithering X+ algorithm used with this option is most suitable for line-drawings X+ and text. For more complex graphics the \fI-F\fR option is recommended. X+ .TP X+ -F X+ Convert the source color image to a dithered monochrome bitmap with X+ the Floyd-Steinberg algorithm. X .sp 3 X .TP X -E X*** checkpoint/patchlevel.h Wed Sep 12 15:28:17 1990 X--- patchlevel.h Tue Sep 18 15:54:33 1990 X*************** 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--- 4,14 ---- X * X * Name - patchlevel.h X * X! * Version: 1.4 X * X! * ccsid: @(#)patchlevel.h 1.4 - 9/18/90 15:54:03 X * from: ccs/s.patchlevel.h X! * date: 9/18/90 15:54:06 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 1 X X! #define XGRABSC_VERSION "1.0 9/4/90 16:41:40" X #endif X--- 17,23 ---- X * X *========================================================================*/ X X! #define XGRABSC_PATCHLEVEL 2 X X! #define XGRABSC_VERSION "1.0 9/18/90 15:54:06" X #endif END_OF_FILE if test 19310 -ne `wc -c <'patch2'`; then echo shar: \"'patch2'\" unpacked with wrong size! fi # end of 'patch2' 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@sun.com / argv@ora.com Opinions expressed reflect those of the author only.