lehors@ploum.inria.fr (Arnaud Le Hors) (08/31/90)
Follows a patch to apply to XPM version 2.1. Modifications: monochrom visuals are now correctly handled, comments can be of a null length. -- Arnaud LE HORS BULL Research FRANCE -- Koala Project | Email : lehors@mirsa.inria.fr Inria - Sophia Antipolis | Phone : (33) 93 65 77 71 2004, Route des Lucioles | Telex : 97 00 50 F 06565 Valbonne CEDEX France | Fax : (33) 93 65 77 66 -- cut here ------- Go into the XPM v2.1 source directory, and pipe this file into "patch -p" You may want to clean the directory afterwards by a: find . \( -name \*.orig -o -size 0 \) -exec rm {} \; diff -c1 -r -N ./Makefile /tmp/xpm-new/Makefile *** ./Makefile Thu Aug 30 16:47:39 1990 --- /tmp/xpm-new/Makefile Thu Aug 30 16:47:37 1990 *************** *** 3,5 **** # XPM Makefile - Arnaud LE HORS ! # $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ # --- 3,5 ---- # XPM Makefile - Arnaud LE HORS ! # $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ # diff -c1 -r -N ./README /tmp/xpm-new/README *** ./README Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/README Thu Aug 30 16:47:37 1990 *************** *** 1,2 **** ! $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ --- 1,2 ---- ! $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ diff -c1 -r -N ./XCrPFData.c /tmp/xpm-new/XCrPFData.c *** ./XCrPFData.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/XCrPFData.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./XRdPixF.c /tmp/xpm-new/XRdPixF.c *** ./XRdPixF.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/XRdPixF.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./XWrPixF.c /tmp/xpm-new/XWrPixF.c *** ./XWrPixF.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/XWrPixF.c Thu Aug 30 16:47:37 1990 *************** *** 5,7 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 5,7 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ *************** *** 38,40 **** unsigned int pixgap; /* length of pixels gap */ ! byte *dptr; Pixel *index = NULL; /* index of different pixels */ --- 38,40 ---- unsigned int pixgap; /* length of pixels gap */ ! byte *dptr, *bptr, *destline, *destptr, *bitplane, destmask; Pixel *index = NULL; /* index of different pixels */ *************** *** 45,46 **** --- 45,48 ---- unsigned int cpp; /* chars per pixel */ + unsigned int depth, linelen; + unsigned long plane; char *name; *************** *** 77,79 **** pixlen = (ximage->bits_per_pixel / 8) + (ximage->bits_per_pixel % 8 ? 1 : 0); ! pixgap = ximage->bytes_per_line - width; --- 79,81 ---- pixlen = (ximage->bits_per_pixel / 8) + (ximage->bits_per_pixel % 8 ? 1 : 0); ! depth = ximage->depth; *************** *** 83,105 **** return(XpmErrorStatus = PixmapNoMemory); ! dptr = (byte *)ximage->data; ! for (y = 0; y < height; y++) { ! for (x = 0; x < width; x++) { ! pixel = memToVal(dptr, pixlen); ! for (a = 0; a < ncolors; a++) ! if (*(index + a) == pixel) break; ! if (a == ncolors) { ! if (ncolors > indexsize) { ! indexsize *= 2; ! if (! (index = (Pixel *)malloc(sizeof(Pixel) * indexsize))) ! RETURN(PixmapNoMemory); } ! *(index + ncolors) = pixel; ! ncolors++; } - valToMem((unsigned long)a, dptr, pixlen); - dptr += pixlen; } ! for (b = 0; b < pixgap; b++) dptr += pixlen; /* skip extra pixels */ ! } /* get rgb values and a string of char for each color --- 85,160 ---- return(XpmErrorStatus = PixmapNoMemory); ! if (depth % 8) { ! linelen = (width / 8) + (width % 8 ? 1 : 0); ! if (! (bitplane = (byte *)malloc(height * linelen))) ! RETURN(PixmapNoMemory); ! if (! (bptr = (byte *)malloc(width * height * pixlen))) { ! free(bitplane); ! RETURN(PixmapNoMemory); ! } ! dptr = bptr; ! for (plane = 1 << (depth - 1); plane; plane >>= 1) { ! ximage = XGetImage(display, pixmap, 0, 0, width, height, ! plane, XYPixmap); ! destline = bitplane = (byte *)ximage->data; ! for (y = 0; y < height; y++) { ! destmask = 0x80; ! destptr = destline; ! for (x = 0; x < width; x++) { ! if (*destptr & destmask) ! *dptr |= plane; ! else ! *dptr &= ~plane; ! if (!(destmask >>= 1)) { ! destmask = 0x80; ! destptr++; ! } ! pixel = memToVal(dptr, pixlen); ! for (a = 0; a < ncolors; a++) ! if (*(index + a) == pixel) break; ! if (a == ncolors) { ! if (ncolors > indexsize) { ! indexsize *= 2; ! if (! (index = (Pixel *) ! malloc(sizeof(Pixel) * indexsize))) { ! free(bitplane); ! free(bptr); ! RETURN(PixmapNoMemory); ! } ! } ! *(index + ncolors) = pixel; ! ncolors++; ! } ! valToMem((unsigned long)a, dptr, pixlen); ! dptr += pixlen; } ! destline += linelen; } } ! free(bitplane); ! bitplane = NULL; ! } else { ! pixgap = ximage->bytes_per_line - width; + dptr = bptr = (byte *)ximage->data; + for (y = 0; y < height; y++) { + for (x = 0; x < width; x++) { + pixel = memToVal(dptr, pixlen); + for (a = 0; a < ncolors; a++) + if (*(index + a) == pixel) break; + if (a == ncolors) { + if (ncolors > indexsize) { + indexsize *= 2; + if (! (index = (Pixel *) + malloc(sizeof(Pixel) * indexsize))) + RETURN(PixmapNoMemory); + } + *(index + ncolors) = pixel; + ncolors++; + } + valToMem((unsigned long)a, dptr, pixlen); + dptr += pixlen; + } + for (b = 0; b < pixgap; b++) dptr += pixlen; /* skip extra pixels */ + } + } /* get rgb values and a string of char for each color *************** *** 186,188 **** ! dptr = (byte *)ximage->data; for (y = 0; y < height; y++) { --- 241,243 ---- ! dptr = bptr; for (y = 0; y < height; y++) { *************** *** 205,206 **** --- 260,263 ---- free(index); + if (depth % 8) + free(bptr); for (a = 0; a < ncolors; a++) diff -c1 -r -N ./create.c /tmp/xpm-new/create.c *** ./create.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/create.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ *************** *** 39,43 **** Pixel *pixels; /* pixels colors */ ! unsigned int width, height; char *chars, buf[BUFSIZ], *colorname; ! byte *dptr, *bptr; XColor xcolor; --- 39,44 ---- Pixel *pixels; /* pixels colors */ ! unsigned int width, height, linelen; char *chars, buf[BUFSIZ], *colorname; ! byte *dptr, *bptr, *destline, *destptr, *bitplane, destmask; ! unsigned long plane; XColor xcolor; *************** *** 214,226 **** ! pixmap = XCreatePixmap(display, d, width, ! height, depth); ! gcv.function= GXcopy; ! gc = XCreateGC(display, pixmap, GCFunction, &gcv); ! ximage = XCreateImage(display, visual, depth, ZPixmap, 0, (char *)bptr, ! width, height, 8, 0); ! ximage->byte_order= MSBFirst; /* trust him, Jim Frost knows what he's */ ! /* talking about */ ! XPutImage(display, pixmap, gc, ximage, 0, 0, 0, 0, ! width, height); ximage->data = NULL; --- 215,274 ---- ! pixmap = XCreatePixmap(display, d, width, height, depth); + /* Jim Frost algorithm */ + /* if the destination depth is not a multiple of 8, then we send each + * plane as a bitmap because otherwise we would have to pack the pixel + * data and the XImage format is pretty vague about how that should + * be done. this is not as fast as it would be if it were packed but + * it should be a lot more portable and only slightly slower. + */ + + if (depth % 8) { + gcv.function = GXcopy; + gcv.background= 0; + gc = XCreateGC(display, pixmap, GCFunction | GCBackground, &gcv); + linelen = (width / 8) + (width % 8 ? 1 : 0); + if (! (bitplane = (byte *)malloc(height * linelen))) + RETURN(PixmapNoMemory); + ximage = XCreateImage(display, visual, 1, XYBitmap, 0, bitplane, + width, height, 8, 0); + ximage->bitmap_bit_order = MSBFirst; + ximage->byte_order = MSBFirst; + + for (plane = 1 << (depth - 1); plane; plane >>= 1) { + dptr = bptr; + destline = bitplane; + for (y = 0; y < height; y++) { + destmask = 0x80; + destptr = destline; + for (x = 0; x < width; x++) { + if (*dptr & plane) + *destptr |= destmask; + else + *destptr &= ~destmask; + if (!(destmask >>= 1)) { + destmask = 0x80; + destptr++; + } + dptr += pixlen; + } + destline += linelen; + } + XSetForeground(display, gc, plane); + XSetPlaneMask(display, gc, plane); + XPutImage(display, pixmap, gc, ximage, 0, 0, 0, 0, width, height); + } + free(bitplane); + } else { + + /* send image across in one whack + */ + gcv.function = GXcopy; + gc = XCreateGC(display, pixmap, GCFunction, &gcv); + ximage = XCreateImage(display, visual, depth, ZPixmap, 0, (char *)bptr, + width, height, 8, 0); + ximage->byte_order = MSBFirst; /* trust him, Jim Frost knows what he's */ + /* talking about */ + XPutImage(display, pixmap, gc, ximage, 0, 0, 0, 0, width, height); + } ximage->data = NULL; *************** *** 228,230 **** XFreeGC(display, gc); ! free(dptr); free(chars); --- 276,278 ---- XFreeGC(display, gc); ! free(bptr); free(chars); diff -c1 -r -N ./demo.c /tmp/xpm-new/demo.c *** ./demo.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/demo.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./free.c /tmp/xpm-new/free.c *** ./free.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/free.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./mio.c /tmp/xpm-new/mio.c *** ./mio.c Thu Aug 30 16:47:40 1990 --- /tmp/xpm-new/mio.c Thu Aug 30 16:47:37 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ *************** *** 74,79 **** Comment[0] = Comment[n]; ! n = notend = 1; while (notend) { ! while ((Comment[n] = getc((FILE *)mdata->stream)) != ECMT[0] ! && Comment[n] != EOF) n++; CommentLength = n++; --- 74,80 ---- Comment[0] = Comment[n]; ! notend = 1; ! n = 0; while (notend) { ! while (Comment[n] != ECMT[0] && Comment[n] != EOF) ! Comment[++n] = getc((FILE *)mdata->stream); CommentLength = n++; *************** *** 85,88 **** mungetc(Comment[n], mdata); - } else { - n++; } --- 86,87 ---- *************** *** 155,160 **** case MFILE: ! *cmt = (char *) malloc(CommentLength + 1); ! strncpy(*cmt, Comment, CommentLength); ! (*cmt)[CommentLength] = '\0'; ! CommentLength = 0; break; --- 154,162 ---- case MFILE: ! if (CommentLength) { ! *cmt = (char *) malloc(CommentLength + 1); ! strncpy(*cmt, Comment, CommentLength); ! (*cmt)[CommentLength] = '\0'; ! CommentLength = 0; ! } else ! *cmt = NULL; break; diff -c1 -r -N ./value.c /tmp/xpm-new/value.c *** ./value.c Thu Aug 30 16:47:41 1990 --- /tmp/xpm-new/value.c Thu Aug 30 16:47:38 1990 *************** *** 26,28 **** * ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 26,28 ---- * ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./visual.c /tmp/xpm-new/visual.c *** ./visual.c Thu Aug 30 16:47:41 1990 --- /tmp/xpm-new/visual.c Thu Aug 30 16:47:38 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ *************** *** 14,16 **** { ! if (visual->class == GrayScale) switch(visual->map_entries) { --- 14,18 ---- { ! switch (visual->class) { ! case StaticGray: ! case GrayScale: switch(visual->map_entries) { *************** *** 18,20 **** return(MONO); - break; case 4: --- 20,21 ---- *************** *** 21,23 **** return(GRAY4); - break; default: --- 22,23 ---- *************** *** 25,28 **** } ! else return(COLOR); } --- 25,29 ---- } ! default: return(COLOR); + } } diff -c1 -r -N ./xpm.h /tmp/xpm-new/xpm.h *** ./xpm.h Thu Aug 30 16:47:41 1990 --- /tmp/xpm-new/xpm.h Thu Aug 30 16:47:38 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */ diff -c1 -r -N ./xpm.tex /tmp/xpm-new/xpm.tex *** ./xpm.tex Thu Aug 30 16:47:41 1990 --- /tmp/xpm-new/xpm.tex Thu Aug 30 16:47:38 1990 *************** *** 4,6 **** ! % $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ % --- 4,6 ---- ! % $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ % diff -c1 -r -N ./xpmP.h /tmp/xpm-new/xpmP.h *** ./xpmP.h Thu Aug 30 16:47:41 1990 --- /tmp/xpm-new/xpmP.h Thu Aug 30 16:47:38 1990 *************** *** 6,8 **** * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.1 90/08/24 19:07:31 lehors Exp $ */ --- 6,8 ---- * Developped by Arnaud Le Hors ! * $Id: xpm.shar,v 2.3 90/08/30 16:31:37 lehors Exp $ */