diff options
Diffstat (limited to 'src/cmd/jpg/rgbrgbv.c')
-rw-r--r-- | src/cmd/jpg/rgbrgbv.c | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/cmd/jpg/rgbrgbv.c b/src/cmd/jpg/rgbrgbv.c new file mode 100644 index 00000000..bc55947a --- /dev/null +++ b/src/cmd/jpg/rgbrgbv.c @@ -0,0 +1,69 @@ +#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); +} |