etaylor@wilkins.iaims.bcm.tmc.edu (Eric Taylor) (12/15/90)
#include <stdio.h> #include <X11/Xlib.h> #include <X11/Xutil.h> #define NHUE 3 #define RANGE (256 / NHUE) #define NCOLORS (NHUE * RANGE) static get_hsv(i,col) XColor *col ; { int hue = i / RANGE ; int resid = i % RANGE ; int r = (hue == 0) ? resid : (hue == 1) ? RANGE - 1 - resid : 0 ; int b = (hue == 0) ? RANGE - 1 - resid : (hue == 2) ? resid : 0 ; int g = (hue == 1) ? resid : (hue == 2) ? RANGE - 1 - resid : 0 ; col->red = r * 65536 / RANGE ; col->green = g * 65536 / RANGE ; col->blue = b * 65536 / RANGE ; col->flags = DoRed | DoBlue | DoGreen ; col->pixel = i ; } main(argc,argv) char *argv[] ; { Display *dpy = XOpenDisplay(NULL) ; int screen ; Window root ; Visual *visual ; Window w ; Colormap cmap ; XColor colors[NCOLORS] ; GC gc ; if (dpy == NULL) { fprintf(stderr,"Could not open display\n") ; exit(-1) ; } screen = DefaultScreen(dpy) ; root = DefaultRootWindow(dpy) ; visual = DefaultVisual(dpy,screen) ; if (visual->class != PseudoColor && visual->class != DirectColor || visual->map_entries < NCOLORS) { fprintf(stderr,"Can only work with 256-PseudoColor\n") ; exit(-1) ; } { int j ; for(j = 0; j < NCOLORS; j++) { get_hsv(j,&(colors[j])) ; } } cmap = XCreateColormap(dpy,root,visual,AllocAll) ; XStoreColors(dpy,cmap,colors,NCOLORS) ; { XSetWindowAttributes attr ; attr.colormap = cmap ; w = XCreateWindow(dpy,root,0,0,600,600, 1,DefaultDepth(dpy,screen), InputOutput,visual, CWColormap,&attr) ; XSelectInput(dpy,w,ExposureMask | ButtonPressMask) ; XMapWindow(dpy,w) ; } gc = XCreateGC(dpy,w,0L,NULL) ; { int i = 0 ; for(;;) { int j ; int first = colors[0].pixel ; for(j = 0; j < NCOLORS - 1; j++) { colors[j].pixel = colors[j + 1].pixel ; } colors[j].pixel = first ; XStoreColors(dpy,cmap,colors,NCOLORS) ; XFlush(dpy) ; if (XPending(dpy)) { XEvent event ; XNextEvent(dpy,&event) ; if (event.type == ButtonPress) { exit(0) ; } else if (event.type == Expose && event.xexpose.count == 0) { int i ; for(i = 0; i < NCOLORS; i++) { int width = (i + 1) * 2 ; int radius = ((NCOLORS - i - 1) + 1) * 2 ; XSetForeground(dpy,gc,i) ; XDrawRectangle(dpy,w,gc,300 - i,300 - i,width,width) ; } } } i = (i + 1) % NCOLORS ; } } } -- Eric Taylor Baylor College of Medicine etaylor@wilkins.bcm.tmc.edu (713) 798-3776