|
|
1.1 ! root 1: #ifndef lint ! 2: static char rcsid[] = "$Header: GrayPixmap.c,v 1.5 87/09/12 16:37:19 swick Exp $"; ! 3: #endif lint ! 4: ! 5: /* ! 6: * Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. ! 7: * ! 8: * All Rights Reserved ! 9: * ! 10: * Permission to use, copy, modify, and distribute this software and its ! 11: * documentation for any purpose and without fee is hereby granted, ! 12: * provided that the above copyright notice appear in all copies and that ! 13: * both that copyright notice and this permission notice appear in ! 14: * supporting documentation, and that the name of Digital Equipment ! 15: * Corporation not be used in advertising or publicity pertaining to ! 16: * distribution of the software without specific, written prior permission. ! 17: * ! 18: * ! 19: * DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ! 20: * ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL ! 21: * DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ! 22: * ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, ! 23: * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ! 24: * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS ! 25: * SOFTWARE. ! 26: */ ! 27: ! 28: #include "Intrinsic.h" ! 29: #include <stdio.h> ! 30: ! 31: #define XtMalloc(s) malloc(s) ! 32: ! 33: typedef struct _PixmapCache { ! 34: Screen *screen; ! 35: Pixmap pixmap; ! 36: struct _PixmapCache *next; ! 37: } CacheEntry; ! 38: ! 39: static CacheEntry *pixmapCache = NULL; ! 40: ! 41: Pixmap XtGrayPixmap( screen ) ! 42: Screen *screen; ! 43: /* ! 44: * Creates a gray pixmap of depth DefaultDepth(screen) ! 45: * caches these so that multiple requests share the pixmap ! 46: */ ! 47: { ! 48: register Display *display = DisplayOfScreen(screen); ! 49: XImage image; ! 50: CacheEntry *cachePtr; ! 51: Pixmap gray_pixmap; ! 52: GC gc; ! 53: XGCValues gcValues; ! 54: static unsigned short pixmap_bits[] = { ! 55: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 56: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 57: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 58: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 59: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 60: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 61: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 62: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 63: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 64: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 65: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 66: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 67: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 68: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 69: 0xaaaa, 0xaaaa, 0x5555, 0x5555, ! 70: 0xaaaa, 0xaaaa, 0x5555, 0x5555 ! 71: }; ! 72: ! 73: #define pixmap_width 32 ! 74: #define pixmap_height 32 ! 75: ! 76: /* see if we already have a pixmap suitable for this screen */ ! 77: for (cachePtr = pixmapCache; cachePtr; cachePtr = cachePtr->next) { ! 78: if (cachePtr->screen == screen) ! 79: return( cachePtr->pixmap ); ! 80: } ! 81: ! 82: /* nope, we'll have to construct one now */ ! 83: image.height = pixmap_height; ! 84: image.width = pixmap_width; ! 85: image.xoffset = 0; ! 86: image.format = XYBitmap; ! 87: image.data = (char*) pixmap_bits; ! 88: image.byte_order = ImageByteOrder(display); ! 89: image.bitmap_pad = BitmapPad(display); ! 90: image.bitmap_bit_order = BitmapBitOrder(display); ! 91: image.bitmap_unit = BitmapUnit(display); ! 92: image.depth = 1; ! 93: image.bytes_per_line = pixmap_width/8; ! 94: image.obdata = NULL; ! 95: ! 96: gray_pixmap = XCreatePixmap( display, RootWindowOfScreen(screen), ! 97: image.width, image.height, ! 98: (unsigned) DefaultDepthOfScreen(screen) ); ! 99: ! 100: /* and insert it at the head of the cache */ ! 101: cachePtr = (CacheEntry *)XtMalloc( sizeof(CacheEntry) ); ! 102: cachePtr->screen = screen; ! 103: cachePtr->pixmap = gray_pixmap; ! 104: cachePtr->next = pixmapCache; ! 105: pixmapCache = cachePtr; ! 106: ! 107: /* now store the image into it */ ! 108: gcValues.foreground = BlackPixelOfScreen(screen); ! 109: gcValues.background = WhitePixelOfScreen(screen); ! 110: gc = XCreateGC( display, RootWindowOfScreen(screen), ! 111: GCForeground | GCBackground, &gcValues ); ! 112: ! 113: XPutImage( display, gray_pixmap, gc, &image, 0, 0, 0, 0, ! 114: image.width, image.height); ! 115: ! 116: XFreeGC( display, gc ); ! 117: ! 118: return( gray_pixmap ); ! 119: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.