turner@daisy.UUCP (Jim Turner) (02/27/88)
has anyone else encountered this problem or am I doing something wrong ?? VERSION: X11 release 1 SYNOPSIS: xor mode in XPutImage does not work DESCRIPTION: /* see comments in code */ REPEAT-BY: /* I try to use XPutImage to put a image onto a window and later erase it by setting the gc's function to xor, it doesn't work. As a matter of fact, all functions give same result: they simply copy the image onto the drawable just as if you've specified GXcopy. */ #include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #define TRUE 1 #define FALSE 0 extern int XBeep(); #define clock_width 32 #define clock_height 32 static char clock_bits[] = { 0x00, 0xf0, 0x07, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x80, 0x8f, 0xf8, 0x00, 0xc0, 0x81, 0xc0, 0x01, 0x60, 0x80, 0x00, 0x03, 0x70, 0x00, 0x00, 0x06, 0x98, 0x00, 0x00, 0x0e, 0x0c, 0xc0, 0x00, 0x19, 0x0c, 0xc0, 0x00, 0x18, 0x06, 0xc0, 0x00, 0x30, 0x06, 0xc0, 0x00, 0x30, 0x06, 0xc0, 0x00, 0x30, 0x03, 0xc0, 0x00, 0x60, 0x03, 0xc0, 0x00, 0x60, 0x03, 0xc0, 0x7f, 0x60, 0xdf, 0xff, 0x7f, 0x7c, 0x03, 0xc0, 0x7f, 0x60, 0x03, 0x00, 0x00, 0x60, 0x03, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x30, 0x8c, 0x00, 0x00, 0x18, 0x4c, 0x00, 0x00, 0x18, 0x38, 0x00, 0x00, 0x0c, 0x30, 0x00, 0x00, 0x06, 0x60, 0x80, 0x00, 0x03, 0xc0, 0x81, 0xc0, 0x01, 0x80, 0x8f, 0xf8, 0x00, 0x00, 0xfe, 0x3f, 0x00, 0x00, 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00}; static Window w1; static Display *display_ptr; static int screen_width=400, screen_height=400; static int screen_x = 0, screen_y = 0; main() { int volume = 70, screen =0; unsigned long event_mask; XSetWindowAttributes w_att; unsigned long w_mask; GC gc; /* open display and create a window */ display_ptr = XOpenDisplay("unix:0.0"); if (display_ptr == 0) { printf("Can not open display\n"); return; } event_mask = 0; w_mask = CWEventMask | CWOverrideRedirect | CWBackPixel; w_att.background_pixel = WhitePixel(display_ptr, screen); w_att.event_mask = event_mask; w_att.override_redirect = TRUE; XSync(display_ptr, 1); w1 = XCreateWindow(display_ptr, RootWindow(display_ptr, screen), screen_x, screen_y, screen_width, screen_height, 2, CopyFromParent , InputOutput, CopyFromParent, w_mask, &w_att); XMapWindow(display_ptr, w1); XFlush (display_ptr); XBell(display_ptr, volume); /*********************************************************************\ * Testing XPutImage * \*********************************************************************/ XGCValues gcvalue; static XImage image; gcvalue.foreground = 1; gcvalue.background = WhitePixel(display_ptr, DefaultScreen(display_ptr)); gc = XCreateGC(display_ptr, w1, GCForeground+GCBackground, &gcvalue); XSetFunction(display_ptr, gc, GXxor); image.height = clock_height; image.width = clock_width; image.xoffset = 0; image.format = XYBitmap; image.data = (char *)clock_bits; image.byte_order = LSBFirst; image.bitmap_unit = 8; image.bitmap_bit_order = LSBFirst; image.bitmap_pad = 16; image.bytes_per_line = 4; image.depth = 1; /* Put image with xor mode */ XPutImage(display_ptr, w1, gc, &image, 0, 0, 300, 300, 32, 32); XFlush (display_ptr); printf("Enter anything to invert the image > "); getchar(); printf("\n"); /* Put image again with xor mode */ XPutImage(display_ptr, w1, gc, &image, 0, 0, 300, 300, 32, 32); XFreeGC(display_ptr, gc); XFlush (display_ptr); printf("PutImage #2 to w1 done.\n"); printf("Enter anything to continue > "); getchar(); printf("\n"); } FIX: -- Laissez les bons temps rouler - Queen Ida ...{decwrl|ucbvax}!imagen!atari!daisy!turner (James M. Turner) Daisy Systems, 700 E. Middlefield Rd, P.O. Box 7006, Mountain View CA 94039-7006. (415)960-0123