/* * gencmap.c * --------- * Generate a colour map using some technique, and * display it in a window. */ #include window w = NULL; /* the main window */ drawing d = NULL; /* where to draw the colours */ label val = NULL; /* to display the colour value */ menuitem last_checked; int width = 256; /* size of the drawing */ int height = 256; int cmap_size = 0; /* size of the colour map */ rgb cmap[256]; /* the colour map */ /* initialise the colour map with values */ void init_cmap_white(void) { int i; for (i=0; i<256; i++) cmap[i] = White; cmap_size = 256; } void init_grey_cmap(int value) { int i, level; for (i=0; i 256) value = 256; init_grey_cmap(value); redraw(d); } void init_cmap_flesh(void) { int i; long r, g, b; r = 115; g = 100; b = 100; for (i=0; i<16; i++) { cmap[i] = rgb(r,g,b); r = r + 13; if (r > 255) r = 255; g = g + 9; if (g > 255) g = 255; b = b + 5; if (b > 255) b = 255; } cmap_size = 16; } void init_cmap_2x2x2(void) { long r, g, b; for (r=0; r < 2; r++) for (g=0; g < 2; g++) for(b=0; b < 2; b++) cmap[r*4+g*2+b] = rgb(255*r,255*g,255*b); cmap_size = 2*2*2; } void init_cmap_3x3x3(void) { long r, g, b; for (r=0; r < 3; r++) for (g=0; g < 3; g++) for(b=0; b < 3; b++) cmap[r*9+g*3+b] = rgb(255*r/2,255*g/2,255*b/2); cmap_size = 3*3*3; } void init_cmap_4x4x4(void) { long r, g, b; for (r=0; r < 4; r++) for (g=0; g < 4; g++) for(b=0; b < 4; b++) cmap[r*16+g*4+b] = rgb(255*r/3,255*g/3,255*b/3); cmap_size = 4*4*4; } void init_cmap_5x5x5(void) { long r, g, b; for (r=0; r < 5; r++) for (g=0; g < 5; g++) for(b=0; b < 5; b++) cmap[r*25+g*5+b] = rgb(255*r/4,255*g/4,255*b/4); cmap_size = 5*5*5; } void init_cmap_6x6x6(void) { long r, g, b; for (r=0; r < 6; r++) for (g=0; g < 6; g++) for(b=0; b < 6; b++) cmap[r*36+g*6+b] = rgb(255*r/5,255*g/5,255*b/5); cmap_size = 6*6*6; } void init_cmap_6x6x7(void) { long r, g, b; for (r=0; r < 6; r++) for (g=0; g < 6; g++) for(b=0; b < 7; b++) cmap[r*42+g*7+b] = rgb(255*r/5,255*g/5,255*b/6); cmap_size = 6*6*7; } void init_cmap_6x7x6(void) { long r, g, b; for (r=0; r < 6; r++) for (g=0; g < 7; g++) for(b=0; b < 6; b++) cmap[r*42+g*6+b] = rgb(255*r/5,255*g/6,255*b/5); cmap_size = 6*7*6; } void init_cmap_7x6x6(void) { long r, g, b; for (r=0; r < 7; r++) for (g=0; g < 6; g++) for(b=0; b < 6; b++) cmap[r*36+g*6+b] = rgb(255*r/6,255*g/5,255*b/5); cmap_size = 7*6*6; } void init_cmap_7x7x5(void) { long r, g, b; for (r=0; r < 7; r++) for (g=0; g < 7; g++) for(b=0; b < 5; b++) cmap[r*35+g*5+b] = rgb(255*r/6,255*g/6,255*b/4); cmap_size = 7*7*5; } void init_cmap_7x5x7(void) { long r, g, b; for (r=0; r < 7; r++) for (g=0; g < 5; g++) for(b=0; b < 7; b++) cmap[r*35+g*7+b] = rgb(255*r/6,255*g/4,255*b/6); cmap_size = 7*5*7; } void init_cmap_5x7x7(void) { long r, g, b; for (r=0; r < 5; r++) for (g=0; g < 7; g++) for(b=0; b < 7; b++) cmap[r*49+g*7+b] = rgb(255*r/4,255*g/6,255*b/6); cmap_size = 5*7*7; } void init_cmap_8x8x4(void) { long r, g, b; for (r=0; r < 8; r++) for (g=0; g < 8; g++) for(b=0; b < 4; b++) cmap[r*32+g*4+b] = rgb(255*r/7,255*g/7,255*b/3); cmap_size = 8*8*4; } void init_cmap_8x4x8(void) { long r, g, b; for (r=0; r < 8; r++) for (g=0; g < 4; g++) for(b=0; b < 8; b++) cmap[r*32+g*8+b] = rgb(255*r/7,255*g/3,255*b/7); cmap_size = 8*4*8; } void init_cmap_4x8x8(void) { long r, g, b; for (r=0; r < 4; r++) for (g=0; g < 8; g++) for(b=0; b < 8; b++) cmap[r*64+g*8+b] = rgb(255*r/3,255*g/7,255*b/7); cmap_size = 4*8*8; } void change_cmap(menuitem m) { uncheck(last_checked); check(m); last_checked = m; init_cmap_white(); switch(getvalue(m)) { case 0: init_cmap_white(); break; case 216: init_cmap_flesh(); break; case 2: init_cmap_2x2x2(); break; case 3: init_cmap_3x3x3(); break; case 4: init_cmap_4x4x4(); break; case 5: init_cmap_5x5x5(); break; case 6: init_cmap_6x6x6(); break; case 667: init_cmap_6x6x7(); break; case 676: init_cmap_6x7x6(); break; case 766: init_cmap_7x6x6(); break; case 775: init_cmap_7x7x5(); break; case 757: init_cmap_7x5x7(); break; case 577: init_cmap_5x7x7(); break; case 884: init_cmap_8x8x4(); break; case 848: init_cmap_8x4x8(); break; case 488: init_cmap_4x8x8(); break; default: init_cmap_white(); break; } redraw(d); } /* draw the colour map on the drawing area */ void draw_cmap(drawing d, rect r) { int i, x, y; int linestep = (width/16); rect bounds; for (i=0; i < cmap_size; i++) { x = i % linestep; y = i / linestep; bounds = rect(x*16, y*16, 16, 16); setcolour(LightGrey); drawrect(bounds); setcolour(cmap[i]); fillrect(insetr(bounds,1)); } } /* handle a mouse movement over the window */ void clear_colour_display(drawing d, int buttons, point p) { /* clear the display of colour component values */ settext(val, ""); } /* handle a mouse movement over the drawing area */ void set_colour_display(drawing d, int buttons, point p) { int colour; char str[40]; int linestep = (width/16); colour = (p.x / 16) + linestep * (p.y / 16); if (colour > 255) colour = 255; if (colour < 0 ) colour = 0; sprintf(str, "0x%-08.8lX", cmap[colour]); settext(val, str); } /* the window's redraw function merely draws a box around the edge */ void draw_window(window w, rect r) { setcolour(Black); drawrect(insetr(r,5)); } /* handle a window resize */ void resize_window(window w, rect r) { width = r.width-20; height = r.height-65; resize(d, rect(r.x+10,r.y+10,width,height)); resize(val, rect(10,height+20,120,35)); } /* quit the program */ void quit(menuitem m) { exitapp(); } /* starting point of the program */ void main(void) { menuitem m; /* create the window */ w = newwindow("Explore a Colour Map", rect(50,50,width+20,height+65), StandardWindow + Menubar + UsePalette); setredraw(w, draw_window); setresize(w, resize_window); //setmousemove(w, clear_colour_display); /* create the menubar */ newmenubar(NULL); newmenu("File"); newmenuitem("Quit", 'Q', quit); newmenu("Cubes"); setvalue(newmenuitem("2x2x2", 0, change_cmap), 2); setvalue(newmenuitem("3x3x3", 0, change_cmap), 3); setvalue(newmenuitem("4x4x4", 0, change_cmap), 4); setvalue(newmenuitem("5x5x5", 0, change_cmap), 5); setvalue(newmenuitem("6x6x6", 0, change_cmap), 6); newmenu("Prisms"); setvalue(newmenuitem("6x6x7", 0, change_cmap), 667); setvalue(newmenuitem("6x7x6", 0, change_cmap), 676); setvalue(newmenuitem("7x6x6", 0, change_cmap), 766); setvalue(newmenuitem("7x7x5", 0, change_cmap), 775); setvalue(newmenuitem("7x5x7", 0, change_cmap), 757); setvalue(newmenuitem("5x7x7", 0, change_cmap), 577); setvalue(newmenuitem("8x8x4", 0, change_cmap), 884); setvalue(newmenuitem("8x4x8", 0, change_cmap), 848); setvalue(m = newmenuitem("4x8x8", 0, change_cmap), 488); check(m); last_checked = m; newmenu("Ramps"); newmenuitem("Greys...", 0, choose_greys); setvalue(newmenuitem("Flesh tones", 0, change_cmap), 216); /* create the drawing area and set a mouse movement callback */ d = newdrawing(rect(10,10,width,height), draw_cmap); setmousemove(d, set_colour_display); /* create the colour display label */ val = newlabel("", rect(10,height+20,120,30), AlignLeft); /* initialise the colour map */ init_cmap_4x8x8(); /* show the window */ show(w); }