xref: /plan9/sys/src/cmd/jpg/rgbrgbv.c (revision 80ee5cbfe36716af62da8896207e9763b8e3d760)
17dd7cddfSDavid du Colombier #include <u.h>
27dd7cddfSDavid du Colombier #include <libc.h>
37dd7cddfSDavid du Colombier #include <draw.h>
47dd7cddfSDavid du Colombier 
5*80ee5cbfSDavid du Colombier /*
6*80ee5cbfSDavid du Colombier  * This version of closest() is now (feb 20, 2001) installed as rgb2cmap in libdraw
7*80ee5cbfSDavid du Colombier  */
8*80ee5cbfSDavid du Colombier 
97dd7cddfSDavid du Colombier int
closest(int cr,int cg,int cb)10*80ee5cbfSDavid du Colombier closest(int cr, int cg, int cb)
117dd7cddfSDavid du Colombier {
12*80ee5cbfSDavid du Colombier 	int i, r, g, b, sq;
13*80ee5cbfSDavid du Colombier 	ulong rgb;
14*80ee5cbfSDavid du Colombier 	int best, bestsq;
15*80ee5cbfSDavid du Colombier 
16*80ee5cbfSDavid du Colombier 	best = 0;
17*80ee5cbfSDavid du Colombier 	bestsq = 0x7FFFFFFF;
18*80ee5cbfSDavid du Colombier 	for(i=0; i<256; i++){
19*80ee5cbfSDavid du Colombier 		rgb = cmap2rgb(i);
20*80ee5cbfSDavid du Colombier 		r = (rgb>>16) & 0xFF;
21*80ee5cbfSDavid du Colombier 		g = (rgb>>8) & 0xFF;
22*80ee5cbfSDavid du Colombier 		b = (rgb>>0) & 0xFF;
23*80ee5cbfSDavid du Colombier 		sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb);
24*80ee5cbfSDavid du Colombier 		if(sq < bestsq){
25*80ee5cbfSDavid du Colombier 			bestsq = sq;
26*80ee5cbfSDavid du Colombier 			best = i;
27*80ee5cbfSDavid du Colombier 		}
28*80ee5cbfSDavid du Colombier 	}
29*80ee5cbfSDavid du Colombier 	return best;
307dd7cddfSDavid du Colombier }
317dd7cddfSDavid du Colombier 
327dd7cddfSDavid du Colombier void
main(int argc,char * argv[])337dd7cddfSDavid du Colombier main(int argc, char *argv[])
347dd7cddfSDavid du Colombier {
357dd7cddfSDavid du Colombier 	int i, rgb;
367dd7cddfSDavid du Colombier 	int r, g, b;
377dd7cddfSDavid du Colombier 	uchar close[16*16*16];
387dd7cddfSDavid du Colombier 
397dd7cddfSDavid du Colombier 	/* rgbmap */
407dd7cddfSDavid du Colombier 	print("uint rgbmap[256] = {\n");
417dd7cddfSDavid du Colombier 	for(i=0; i<256; i++){
427dd7cddfSDavid du Colombier 		if(i%8 == 0)
437dd7cddfSDavid du Colombier 			print("\t");
447dd7cddfSDavid du Colombier 		rgb = cmap2rgb(i);
457dd7cddfSDavid du Colombier 		r = (rgb>>16) & 0xFF;
467dd7cddfSDavid du Colombier 		g = (rgb>>8) & 0xFF;
477dd7cddfSDavid du Colombier 		b = (rgb>>0) & 0xFF;
487dd7cddfSDavid du Colombier 		print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
497dd7cddfSDavid du Colombier 		if(i%8 == 7)
507dd7cddfSDavid du Colombier 			print("\n");
517dd7cddfSDavid du Colombier 	}
527dd7cddfSDavid du Colombier 	print("};\n\n");
537dd7cddfSDavid du Colombier 
547dd7cddfSDavid du Colombier 	/* closestrgb */
557dd7cddfSDavid du Colombier 	print("uchar closestrgb[16*16*16] = {\n");
567dd7cddfSDavid du Colombier 	for(r=0; r<256; r+=16)
577dd7cddfSDavid du Colombier 	for(g=0; g<256; g+=16)
587dd7cddfSDavid du Colombier 	for(b=0; b<256; b+=16)
597dd7cddfSDavid du Colombier 		close[(b/16)+16*((g/16)+16*(r/16))] = closest(r+8, g+8, b+8);
607dd7cddfSDavid du Colombier 	for(i=0; i<16*16*16; i++){
617dd7cddfSDavid du Colombier 		if(i%16 == 0)
627dd7cddfSDavid du Colombier 			print("\t");
637dd7cddfSDavid du Colombier 		print("%d,", close[i]);
647dd7cddfSDavid du Colombier 		if(i%16 == 15)
657dd7cddfSDavid du Colombier 			print("\n");
667dd7cddfSDavid du Colombier 	}
677dd7cddfSDavid du Colombier 	print("};\n\n");
687dd7cddfSDavid du Colombier 	exits(nil);
697dd7cddfSDavid du Colombier }
70