15 int x, y, i, n, nx, ny;
18 if(new && getwindow(display, Refnone) < 0){
19 fprint(2, "colors: can't reattach to window: %r\n");
22 if(screen->depth > 8){
27 nx = 1<<(screen->depth/2);
31 draw(screen, screen->r, display->white, nil, ZP);
32 r = insetrect(screen->r, 5);
35 for(i=n-1, y=0; y!=ny; y++){
37 b.max.y=r.min.y+(r.max.y-r.min.y)*(y+1)/ny;
39 for(x=0; x!=nx; x++, --i){
41 b.max.x=r.min.x+(r.max.x-r.min.x)*(x+1)/nx;
42 crect[i]=insetrect(b, 1);
43 draw(screen, crect[i], color[i], nil, ZP);
46 flushimage(display, 1);
62 return (i<<16)+(i<<8)+i;
79 main(int argc, char *argv[])
83 int i, j, k, l, n, ramp, prev;
91 fmt = "index %3d r %3lud g %3lud b %3lud 0x%.8luX ";
96 fmt = "index %2luX r %3luX g %3luX b %3luX 0x%.8luX ";
105 fprint(2, "Usage: %s [-rx]\n", argv0);
109 if(initdraw(nil, nil, "colors") < 0)
110 sysfatal("initdraw failed: %r");
113 for(i=0; i<256; i++){
115 if(screen->chan == CMAP8){
116 /* dither the fine grey */
118 dark = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(j)<<8)+0xFF);
119 color[i] = allocimage(display, Rect(0,0,4,4), screen->chan, 1, (grey(j+17)<<8)+0xFF);
123 if(dither[j] > (i%17))
124 draw(color[i], Rect(k, l, k+1, l+1), dark, nil, ZP);
128 color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(i)<<8)+0xFF);
130 color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (cmap2rgb(i)<<8)+0xFF);
132 sysfatal("can't allocate image: %r");
141 if(screen->depth > 8)
144 n = 1<<screen->depth;
146 if(i!=prev && ptinrect(m.xy, crect[i])){
157 p = addpt(screen->r.min, Pt(2,2));
158 draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->white, nil, p);
159 string(screen, p, display->black, ZP, font, buf);
168 switch(emenuhit(3, &m, &menu)){