xref: /plan9/sys/src/cmd/jpg/rgbrgbv.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
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
closest(int cr,int cg,int cb)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
main(int argc,char * argv[])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 }
70