|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T x
Length: 9006 (0x232e) Types: TextFile Names: »xcolors.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z« └─⟦2109abc41⟧ └─⟦this⟧ »./X.V10R4/xcolors/xcolors.c«
/* Copyright, 1986, Massachusetts Institute of Technology */ #include <X/mit-copyright.h> /* * Make a window that shows all the colors in rgb.txt - JT 5/21/86 */ #include <stdio.h> #include <sys/file.h> #include <X/Xlib.h> #ifndef lint static char *rcsid_xcolors_c = "$Header: xcolors.c,v 10.1 86/07/25 16:28:22 jg Rel $"; #endif lint short gray_bits[16] = { 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555, 0xaaaa, 0x5555}; #define curs_width 16 #define curs_height 16 #define curs_x_hot 7 #define curs_y_hot 7 static short curs_bits[] = { 0x0000, 0x03e0, 0x01c0, 0x0080, 0x0080, 0x2082, 0x3006, 0x3e3e, 0x3006, 0x2082, 0x0080, 0x0080, 0x01c0, 0x03e0, 0x0000, 0x0000}; static short curs_mask_bits[] = { 0x0aa8, 0x07f0, 0x03e0, 0x41c1, 0x21c2, 0x7087, 0x3c9e, 0x7f7f, 0x3c9e, 0x7087, 0x21c2, 0x41c1, 0x03e0, 0x07f0, 0x0aa8, 0x0000}; #define PICTDEFAULT "+100+5" #define MAXCOLORS 256 #define DEFAULT_FONT "6x10" #define MAXHEIGHT 864 #define CWIDTH 100 #define MIN(a,b) (((a) < (b)) ? (a) : (b)) #define MAX(a,b) (((a) > (b)) ? (a) : (b)) #define ABS(a) (((a) > 0) ? (a) : (-a)) main(argc, argv) int argc; char **argv; { Window wind ; WindowInfo winfo; char *geometry = NULL; char filegeometry[30]; char *display = NULL; char *option; char *border_color, *back_color, *fore_color; Font font; char *fontname=DEFAULT_FONT; FontInfo fontinfo; OpaqueFrame frame; int border_width, border=BlackPixel; int foreground=WhitePixel, background=BlackPixel; int ncolors; int cmadr[MAXCOLORS]; /* color cell from allocation */ int planes; /* plane mask */ Color cmap[256]; short readpix; Cursor curs; char line[80]; char cname[MAXCOLORS][40]; char chex[MAXCOLORS][8]; int rval[MAXCOLORS], gval[MAXCOLORS], bval[MAXCOLORS]; int order[MAXCOLORS]; FILE *fp, *fopen(); int height, width, cheight, maxwidth, x, y, ncols; XEvent event, peekevent; XButtonEvent *but = (XButtonEvent *)&event; register int i, j, k; if ((option = XGetDefault(argv[0],"BorderWidth")) != NULL) border_width = atoi(option); border_color = XGetDefault(argv[0],"BorderColor"); back_color = XGetDefault(argv[0],"Background"); fore_color = XGetDefault(argv[0],"Highlight"); fontname = XGetDefault(argv[0],"BodyFont"); for (i = 1; i < argc; i++) { if (argv[i][0] == '=') { geometry = argv[i]; continue; } if (index(argv[i], ':') != NULL) { /* host:display */ display = argv[i]; continue; } if (strcmp(argv[i], "-bw") == 0 || strcmp(argv[i], "-border") == 0) { /* border width */ if (++i >= argc) usage(argv[0]); border_width = atoi(argv[i]); continue; } if (strcmp(argv[i], "-bd") == 0 || strcmp(argv[i], "-color") == 0) { /* border color */ if (++i >= argc) usage(argv[0]); border_color = argv[i]; continue; } if (strcmp(argv[i], "-bg") == 0) { /* background color */ if (++i >= argc) usage(argv[0]); back_color = argv[i]; continue; } if (strcmp(argv[i], "-fg") == 0) { /* foreground color */ if (++i >= argc) usage(argv[0]); fore_color = argv[i]; continue; } if (strcmp(argv[i], "-fn") == 0 || strcmp(argv[i],"-font") == 0) { /* font name */ if (++i >= argc) usage(argv[0]); fontname = argv[i]; continue; } if (argv[i][0] == '-') usage(argv[0]); } if (!XOpenDisplay(display)) { fprintf(stderr,"Can't open display; set DISPLAY variable\n"); exit(1); } font = XGetFont(fontname); if(!font) { fprintf(stderr,"Can't open font %s",fontname); exit(1); } XQueryFont(font,&fontinfo); if((fp=fopen("/usr/lib/rgb.txt","r"))==NULL) { fprintf(stderr,"Can't open rgb.txt"); exit(1); } ncolors = 0; i = j = k = -1; maxwidth = 0; while(fgets(line,sizeof(line),fp)) { sscanf(line,"%d %d %d %[^\n]\n", rval+ncolors,gval+ncolors,bval+ncolors,cname+ncolors); maxwidth = MAX(maxwidth,strlen(cname[ncolors])); order[ncolors] = ncolors; sprintf(chex[ncolors],"#%02x%02x%02x", rval[ncolors],gval[ncolors],bval[ncolors]); if(i!=rval[ncolors] || j!=gval[ncolors] || k!=bval[ncolors]) { i = rval[ncolors]; j = gval[ncolors]; k = bval[ncolors]; ncolors++; } } fclose(fp); arrange(ncolors,rval,gval,bval,order); if (XGetColorCells(0, ncolors+3, 0, &planes, cmadr) == 0) { fprintf(stderr,"Insufficient colors available\n"); exit(1); } cheight = fontinfo.height+4 ; ncols = (cheight*ncolors+2*border_width) / MAXHEIGHT + 1; maxwidth = (maxwidth+8)*fontinfo.width; height = ((ncolors+ncols-1)/ncols)*cheight; width = ncols*(maxwidth + CWIDTH) + (ncols-1)*20; XParseColor(back_color, cmap+ncolors); background = cmap[ncolors].pixel = cmadr[ncolors]; XParseColor(fore_color, cmap+ncolors+1); foreground = cmap[ncolors+1].pixel = cmadr[ncolors+1]; XParseColor(border_color, cmap+ncolors+2); border = cmap[ncolors+2].pixel = cmadr[ncolors+2]; frame.bdrwidth = border_width; frame.border = XMakeTile(border); frame.background = XMakeTile(background); sprintf(filegeometry,"=%dx%d%s",width,height,PICTDEFAULT); wind = XCreate(argv[0], argv[0], geometry, filegeometry, &frame, 100, 100); if (!wind) { fprintf(stderr, "XCreateWindow failed\n"); exit(1); } curs = XCreateCursor(curs_width,curs_height,curs_bits,curs_mask_bits, curs_x_hot,curs_y_hot,WhitePixel,BlackPixel,GXcopy); XUndefineCursor(wind); XDefineCursor(wind,curs); XSelectInput(wind, ExposeRegion | ExposeWindow | ButtonPressed); XMapWindow(wind); for(i=0;i<ncolors;i++) { cmap[i].pixel = cmadr[i]; cmap[i].red = rval[i]<<8; cmap[i].green = gval[i]<<8; cmap[i].blue = bval[i]<<8; } XStoreColors(ncolors+3, cmap); while(1) { XNextEvent(&event); switch((int)event.type) { case ButtonPressed: XPixmapGetZ(wind,but->x,but->y,1,1,&readpix); for(i=0;cmadr[i] != readpix && i<ncolors+2;i++) ; switch((int)but->detail & ValueMask) { case LeftButton: cmap[ncolors+1].red = cmap[i].red; cmap[ncolors+1].green = cmap[i].green; cmap[ncolors+1].blue = cmap[i].blue; break; case MiddleButton: cmap[ncolors+2].red = cmap[i].red; cmap[ncolors+2].green = cmap[i].green; cmap[ncolors+2].blue = cmap[i].blue; XChangeBorder(wind,XMakeTile(cmap[i].pixel)); break; case RightButton: cmap[ncolors].red = cmap[i].red; cmap[ncolors].green = cmap[i].green; cmap[ncolors].blue = cmap[i].blue; } XStoreColors(3,cmap+ncolors); break; case ExposeWindow: if(QLength() > 0) { XPeekEvent(&peekevent); if(peekevent.type == ExposeWindow) break; } XQueryWindow(wind,&winfo); case ExposeRegion: XClear(wind); XPixSet(wind,x,y,width,height,background); for(i=0;i<ncolors;i++) { x = (i / ((ncolors+ncols-1) / ncols)) ; x = x * (maxwidth+CWIDTH) + x * 20; y = (i%((ncolors+ncols-1)/ncols)) * cheight; XPixSet(wind,x,y,CWIDTH-10,cheight,cmadr[order[i]]); XTextMask(wind,x+CWIDTH-5,y, cname[order[i]],strlen(cname[order[i]]), font,foreground); XTextMask(wind,x+CWIDTH-5+maxwidth-7*fontinfo.width,y, chex[order[i]],strlen(chex[order[i]]), font,foreground); } } } } usage (program) char *program; { fprintf(stderr,"usage: %s [ options ]\n",program); fprintf(stderr," where options are one or more of:\n"); fprintf(stderr," [host:display] [=geom] [-bw] [-bd] [-bg] [-fg] [-fn]\n"); exit(1); } arrange(n,r,g,b,o) int n, *r, *g, *b, *o; { int i, j, k, m; for(j=0;j<n-1;j++) { k = j; for(i=j+1;i<n;i++) { if(greater(o[i],o[k],r,g,b)) k=i; } if(k>j) { m = o[k]; for(i=k;i>j;i--) o[i] = o[i-1]; o[j] = m; } } } greater(i,j,r,g,b) int i, j, *r, *g, *b; { int ci, cj, si, sj; ci = color(r[i],g[i],b[i]); cj = color(r[j],g[j],b[j]); if(ci>cj) return(1); else if(ci<cj) return(0); si = bright(ci,r[i],g[i],b[i]); sj = bright(cj,r[j],g[j],b[j]); if(si>=sj) return(1); return(0); } strictcolor(r,g,b) int r, g, b; { if(r>g && r>b) return(6); if(r==g && r>b) return(5); if(g>r && g>b) return(4); if(g==b && g>r) return(3); if(b>g && b>r) return(2); if(r==b && r>g) return(1); return(0); } color(r,g,b) int r, g, b; { int r0, g0, b0, m, f=2; m = MIN(MIN(r,g),b); r0 = r - m; g0 = g - m; b0 = b - m; if(r0==0 && g0==0 && b0==0) return(0); if((b0==0 && r0> f*g0) || (g0==0 && r0> f*b0)) return(6); if((r0==0 && g0> f*b0) || (b0==0 && g0> f*r0)) return(4); if((g0==0 && b0> f*r0) || (r0==0 && b0> f*g0)) return(2); if(b0==0 && r0<=f*g0) return(5); if(r0==0 && g0<=f*b0) return(3); if(g0==0 && b0<=f*r0) return(1); } bright(c,r,g,b) int c, r, g, b; { if(c==6 || c==5) return((r<<16)+(g<<8)+b); if(c==4 || c==3) return((g<<16)+(b<<8)+r); if(c==2 || c==1) return((b<<16)+(r<<8)+g); return((r<<16)+(g<<8)+b); }