rgbrgbv.c (1236B)
1 #include <u.h> 2 #include <libc.h> 3 #include <draw.h> 4 5 /* 6 * This version of closest() is now (feb 20, 2001) installed as rgb2cmap in libdraw 7 */ 8 9 int 10 closest(int cr, int cg, int cb) 11 { 12 int i, r, g, b, sq; 13 ulong rgb; 14 int best, bestsq; 15 16 best = 0; 17 bestsq = 0x7FFFFFFF; 18 for(i=0; i<256; i++){ 19 rgb = cmap2rgb(i); 20 r = (rgb>>16) & 0xFF; 21 g = (rgb>>8) & 0xFF; 22 b = (rgb>>0) & 0xFF; 23 sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb); 24 if(sq < bestsq){ 25 bestsq = sq; 26 best = i; 27 } 28 } 29 return best; 30 } 31 32 void 33 main(int argc, char *argv[]) 34 { 35 int i, rgb; 36 int r, g, b; 37 uchar close[16*16*16]; 38 39 /* rgbmap */ 40 print("uint rgbmap[256] = {\n"); 41 for(i=0; i<256; i++){ 42 if(i%8 == 0) 43 print("\t"); 44 rgb = cmap2rgb(i); 45 r = (rgb>>16) & 0xFF; 46 g = (rgb>>8) & 0xFF; 47 b = (rgb>>0) & 0xFF; 48 print("0x%.6ulX, ", (r<<16) | (g<<8) | b); 49 if(i%8 == 7) 50 print("\n"); 51 } 52 print("};\n\n"); 53 54 /* closestrgb */ 55 print("uchar closestrgb[16*16*16] = {\n"); 56 for(r=0; r<256; r+=16) 57 for(g=0; g<256; g+=16) 58 for(b=0; b<256; b+=16) 59 close[(b/16)+16*((g/16)+16*(r/16))] = closest(r+8, g+8, b+8); 60 for(i=0; i<16*16*16; i++){ 61 if(i%16 == 0) 62 print("\t"); 63 print("%d,", close[i]); 64 if(i%16 == 15) 65 print("\n"); 66 } 67 print("};\n\n"); 68 exits(nil); 69 }