123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- #include <u.h>
- #include <libc.h>
- #include <draw.h>
- /*
- * This version of closest() is now (feb 20, 2001) installed as rgb2cmap in libdraw
- */
- int
- closest(int cr, int cg, int cb)
- {
- int i, r, g, b, sq;
- ulong rgb;
- int best, bestsq;
- best = 0;
- bestsq = 0x7FFFFFFF;
- for(i=0; i<256; i++){
- rgb = cmap2rgb(i);
- r = (rgb>>16) & 0xFF;
- g = (rgb>>8) & 0xFF;
- b = (rgb>>0) & 0xFF;
- sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb);
- if(sq < bestsq){
- bestsq = sq;
- best = i;
- }
- }
- return best;
- }
- void
- main(int argc, char *argv[])
- {
- int i, rgb;
- int r, g, b;
- uchar close[16*16*16];
- /* rgbmap */
- print("uint rgbmap[256] = {\n");
- for(i=0; i<256; i++){
- if(i%8 == 0)
- print("\t");
- rgb = cmap2rgb(i);
- r = (rgb>>16) & 0xFF;
- g = (rgb>>8) & 0xFF;
- b = (rgb>>0) & 0xFF;
- print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
- if(i%8 == 7)
- print("\n");
- }
- print("};\n\n");
- /* closestrgb */
- print("uchar closestrgb[16*16*16] = {\n");
- for(r=0; r<256; r+=16)
- for(g=0; g<256; g+=16)
- for(b=0; b<256; b+=16)
- close[(b/16)+16*((g/16)+16*(r/16))] = closest(r+8, g+8, b+8);
- for(i=0; i<16*16*16; i++){
- if(i%16 == 0)
- print("\t");
- print("%d,", close[i]);
- if(i%16 == 15)
- print("\n");
- }
- print("};\n\n");
- exits(nil);
- }
|