plan9fox/sys/src/cmd/colors.c
Ori Bernstein 5bc9b0c3ca improve usage messages (thanks henesy)
Fix inconsistencies between programs and their usage
messages,  correct instances where information seems
to be missing or lost. This  includes missing arguments,
making usage consistent with manuals, and so on.
2020-03-10 10:09:34 -07:00

175 lines
3.1 KiB
C

#include <u.h>
#include <libc.h>
#include <draw.h>
#include <event.h>
int nbit, npix;
Image *pixel;
Rectangle crect[256];
Image *color[256];
void
eresized(int new)
{
int x, y, i, n, nx, ny;
Rectangle r, b;
if(new && getwindow(display, Refnone) < 0){
fprint(2, "colors: can't reattach to window: %r\n");
exits("resized");
}
if(screen->depth > 8){
n = 256;
nx = 16;
}else{
n = 1<<screen->depth;
nx = 1<<(screen->depth/2);
}
ny = n/nx;
draw(screen, screen->r, display->white, nil, ZP);
r = insetrect(screen->r, 5);
r.min.y+=20;
b.max.y=r.min.y;
for(i=n-1, y=0; y!=ny; y++){
b.min.y=b.max.y;
b.max.y=r.min.y+(r.max.y-r.min.y)*(y+1)/ny;
b.max.x=r.min.x;
for(x=0; x!=nx; x++, --i){
b.min.x=b.max.x;
b.max.x=r.min.x+(r.max.x-r.min.x)*(x+1)/nx;
crect[i]=insetrect(b, 1);
draw(screen, crect[i], color[i], nil, ZP);
}
}
flushimage(display, 1);
}
char *buttons[] =
{
"exit",
0
};
ulong
grey(int i)
{
if(i < 0)
return grey(0);
if(i > 255)
return grey(255);
return (i<<16)+(i<<8)+i;
}
Menu menu =
{
buttons
};
int
dither[16] = {
0, 8, 2, 10,
12, 4, 14, 6,
3, 11, 1, 9,
15, 7, 13, 5
};
void
main(int argc, char *argv[])
{
Point p;
Mouse m;
int i, j, k, l, n, ramp, prev;
char buf[100];
char *fmt;
Image *dark;
ulong rgb;
ramp = 0;
fmt = "index %3d r %3lud g %3lud b %3lud 0x%.8luX ";
ARGBEGIN{
default:
goto Usage;
case 'x':
fmt = "index %2luX r %3luX g %3luX b %3luX 0x%.8luX ";
break;
case 'r':
ramp = 1;
break;
}ARGEND
if(argc){
Usage:
fprint(2, "usage: %s [-rx]\n", argv0);
exits("usage");
}
if(initdraw(nil, nil, "colors") < 0)
sysfatal("initdraw failed: %r");
einit(Emouse);
for(i=0; i<256; i++){
if(ramp){
if(screen->chan == CMAP8){
/* dither the fine grey */
j = i-(i%17);
dark = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(j)<<8)+0xFF);
color[i] = allocimage(display, Rect(0,0,4,4), screen->chan, 1, (grey(j+17)<<8)+0xFF);
for(j=0; j<16; j++){
k = j%4;
l = j/4;
if(dither[j] > (i%17))
draw(color[i], Rect(k, l, k+1, l+1), dark, nil, ZP);
}
freeimage(dark);
}else
color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (grey(i)<<8)+0xFF);
}else
color[i] = allocimage(display, Rect(0,0,1,1), screen->chan, 1, (cmap2rgb(i)<<8)+0xFF);
if(color[i] == nil)
sysfatal("can't allocate image: %r");
}
eresized(0);
prev = -1;
for(;;){
m = emouse();
switch(m.buttons){
case 1:
while(m.buttons){
if(screen->depth > 8)
n = 256;
else
n = 1<<screen->depth;
for(i=0; i!=n; i++)
if(i!=prev && ptinrect(m.xy, crect[i])){
if(ramp)
rgb = grey(i);
else
rgb = cmap2rgb(i);
sprint(buf, fmt,
i,
(rgb>>16)&0xFF,
(rgb>>8)&0xFF,
rgb&0xFF,
(rgb<<8) | 0xFF);
p = addpt(screen->r.min, Pt(2,2));
draw(screen, Rpt(p, addpt(p, stringsize(font, buf))), display->white, nil, p);
string(screen, p, display->black, ZP, font, buf);
prev=i;
break;
}
m = emouse();
}
break;
case 4:
switch(emenuhit(3, &m, &menu)){
case 0:
exits(0);
}
}
}
}