steve@lia (Stephen Williams) (05/11/91)
Because this is a contrib application, I'm submitting this fix to netnew rather then xbugs. This patch allows xloadimage to work on 4 or 2-bit deep displays. X Window System Bug Report xbugs@expo.lcs.mit.edu VERSION: R4 CLIENT MACHINE and OPERATING SYSTEM: any DISPLAY TYPE: XP23 (or any display with depth other then1 or 8) WINDOW MANAGER: any AREA: contrib/xloadimage SYNOPSIS: xloadimage makes an 8 bit image, without reguard to the depth of the actual display. DESCRIPTION: Internally, xloadimage builds an 8-bit deep image that it does its manipulations on. When the result is to be displayed of a 4 (or 2) bit deep display, it creates a PixMap with the correct depth, but tries to XPutImage an 8 bit image into the PixMap. The result is a BadMatch error. REPEAT BY: display a color or grey image on a 4-bit deep display. SAMPLE FIX: *** send.c Fri May 10 13:07:02 1991 --- send.c.NEW Fri May 10 11:40:20 1991 *************** *** 11,16 **** --- 11,18 ---- #include "copyright.h" #include "xloadimage.h" + static XImage* makeImage(); + unsigned int sendImageToX(disp, scrn, visual, image, pixmap, cmap, verbose) Display *disp; int scrn; *************** *** 127,137 **** printf(" Modifying image to conform to X colormap..."); fflush(stdout); } pixptr= image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { ! valToMem(*(index + memToVal(pixptr, image->pixlen)), ! pixptr, image->pixlen); pixptr += image->pixlen; } if (verbose) --- 129,141 ---- printf(" Modifying image to conform to X colormap..."); fflush(stdout); } + ximage = makeImage(disp, scrn, visual, image->width, image->height); + /*ximage->byte_order= MSBFirst; /* trust me, i know what i'm talking about */ + pixptr= image->data; for (y= 0; y < image->height; y++) for (x= 0; x < image->width; x++) { ! XPutPixel( ximage, x, y, (*(index + memToVal(pixptr, image->pixlen))) ); pixptr += image->pixlen; } if (verbose) *************** *** 139,151 **** gcv.function= GXcopy; gc= XCreateGC(disp, *pixmap, GCFunction, &gcv); - ximage= XCreateImage(disp, visual, image->depth, ZPixmap, 0, image->data, - image->width, image->height, 8, 0); - ximage->byte_order= MSBFirst; /* trust me, i know what i'm talking about */ XPutImage(disp, *pixmap, gc, ximage, 0, 0, 0, 0, image->width, image->height); - ximage->data= NULL; XDestroyImage(ximage); /* waste not want not */ XFreeGC(disp, gc); break; --- 143,156 ---- gcv.function= GXcopy; gc= XCreateGC(disp, *pixmap, GCFunction, &gcv); + + printf(" Image depth=%d: Screen depth=%d\n", + image->depth, + DefaultScreenOfDisplay(disp)->root_depth ); + XPutImage(disp, *pixmap, gc, ximage, 0, 0, 0, 0, image->width, image->height); XDestroyImage(ximage); /* waste not want not */ XFreeGC(disp, gc); break; *************** *** 156,159 **** --- 161,190 ---- } lfree(index); return(1); + } + + + static XImage* makeImage(disp, scrn, visual, width, height) + Display* disp; + int scrn; + Visual* visual; + unsigned width; + unsigned height; + { + extern char*malloc(); + XImage* result; + char* data; + + data = malloc( (width * DefaultDepth(disp, scrn) + 7) / 8 * height ); + + result = XCreateImage( disp, visual, DefaultDepth(disp, scrn), + ZPixmap, + 0, + data, + width, + height, + 8, + 0); + + return result; }