xref: /plan9/sys/src/cmd/jpg/rgbycc.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
1*7dd7cddfSDavid du Colombier #include <u.h>
2*7dd7cddfSDavid du Colombier #include <libc.h>
3*7dd7cddfSDavid du Colombier #include <draw.h>
4*7dd7cddfSDavid du Colombier 
5*7dd7cddfSDavid du Colombier float c1 = 1.402;
6*7dd7cddfSDavid du Colombier float c2 = 0.34414;
7*7dd7cddfSDavid du Colombier float c3 = 0.71414;
8*7dd7cddfSDavid du Colombier float c4 = 1.772;
9*7dd7cddfSDavid du Colombier 
10*7dd7cddfSDavid du Colombier int
closest(int Y,int Cb,int Cr)11*7dd7cddfSDavid du Colombier closest(int Y, int Cb, int Cr)
12*7dd7cddfSDavid du Colombier {
13*7dd7cddfSDavid du Colombier 	double r, g, b;
14*7dd7cddfSDavid du Colombier 	double diff, min;
15*7dd7cddfSDavid du Colombier 	int rgb, R, G, B, v, i;
16*7dd7cddfSDavid du Colombier 	int y1, cb1, cr1;
17*7dd7cddfSDavid du Colombier 
18*7dd7cddfSDavid du Colombier 	Cb -= 128;
19*7dd7cddfSDavid du Colombier 	Cr -= 128;
20*7dd7cddfSDavid du Colombier 	r = Y+c1*Cr;
21*7dd7cddfSDavid du Colombier 	g = Y-c2*Cb-c3*Cr;
22*7dd7cddfSDavid du Colombier 	b = Y+c4*Cb;
23*7dd7cddfSDavid du Colombier 
24*7dd7cddfSDavid du Colombier //print("YCbCr: %d %d %d, RGB: %g %g %g\n", Y, Cb, Cr, r, g, b);
25*7dd7cddfSDavid du Colombier 
26*7dd7cddfSDavid du Colombier 	min = 1000000.;
27*7dd7cddfSDavid du Colombier 	v = 1000;
28*7dd7cddfSDavid du Colombier 	for(i=0; i<256; i++){
29*7dd7cddfSDavid du Colombier 		rgb =  cmap2rgb(i);
30*7dd7cddfSDavid du Colombier 		R = (rgb >> 16) & 0xFF;
31*7dd7cddfSDavid du Colombier 		G = (rgb >> 8) & 0xFF;
32*7dd7cddfSDavid du Colombier 		B = (rgb >> 0) & 0xFF;
33*7dd7cddfSDavid du Colombier 		diff = (R-r)*(R-r) + (G-g)*(G-g) + (B-b)*(B-b);
34*7dd7cddfSDavid du Colombier 		y1 = 0.5870*G + 0.114*B + 0.299*R;
35*7dd7cddfSDavid du Colombier 		cb1 = (B-y1)/1.772;
36*7dd7cddfSDavid du Colombier 		cr1 = (R-y1)/1.402;
37*7dd7cddfSDavid du Colombier 		if(diff < min){
38*7dd7cddfSDavid du Colombier //			if(Y==0 && y1!=0)
39*7dd7cddfSDavid du Colombier //				continue;
40*7dd7cddfSDavid du Colombier 			if(Y==256-16 && y1<256-16)
41*7dd7cddfSDavid du Colombier 				continue;
42*7dd7cddfSDavid du Colombier //			if(Cb==0 && cb1!=0)
43*7dd7cddfSDavid du Colombier //				continue;
44*7dd7cddfSDavid du Colombier 			if(Cb==256-16 && cb1<256-16)
45*7dd7cddfSDavid du Colombier 				continue;
46*7dd7cddfSDavid du Colombier //			if(Cr==0 && cr1!=0)
47*7dd7cddfSDavid du Colombier //				continue;
48*7dd7cddfSDavid du Colombier 			if(Cr==256-16 && cr1<256-16)
49*7dd7cddfSDavid du Colombier 				continue;
50*7dd7cddfSDavid du Colombier //print("%d %d %d\n", R, G, B);
51*7dd7cddfSDavid du Colombier 			min = diff;
52*7dd7cddfSDavid du Colombier 			v = i;
53*7dd7cddfSDavid du Colombier 		}
54*7dd7cddfSDavid du Colombier 	}
55*7dd7cddfSDavid du Colombier 	if(v > 255)
56*7dd7cddfSDavid du Colombier 		abort();
57*7dd7cddfSDavid du Colombier 	return v;
58*7dd7cddfSDavid du Colombier }
59*7dd7cddfSDavid du Colombier 
60*7dd7cddfSDavid du Colombier void
main(int argc,char * argv[])61*7dd7cddfSDavid du Colombier main(int argc, char *argv[])
62*7dd7cddfSDavid du Colombier {
63*7dd7cddfSDavid du Colombier 	int i, rgb;
64*7dd7cddfSDavid du Colombier 	int r, g, b;
65*7dd7cddfSDavid du Colombier 	double Y, Cr, Cb;
66*7dd7cddfSDavid du Colombier 	int y, cb, cr;
67*7dd7cddfSDavid du Colombier 	uchar close[16*16*16];
68*7dd7cddfSDavid du Colombier 
69*7dd7cddfSDavid du Colombier //print("%d\n", closest(atoi(argv[1]), atoi(argv[2]), atoi(argv[3])));
70*7dd7cddfSDavid du Colombier //exits("X");
71*7dd7cddfSDavid du Colombier 
72*7dd7cddfSDavid du Colombier 	/* ycbcrmap */
73*7dd7cddfSDavid du Colombier 	print("uint ycbcrmap[256] = {\n");
74*7dd7cddfSDavid du Colombier 	for(i=0; i<256; i++){
75*7dd7cddfSDavid du Colombier 		if(i%8 == 0)
76*7dd7cddfSDavid du Colombier 			print("\t");
77*7dd7cddfSDavid du Colombier 		rgb = cmap2rgb(i);
78*7dd7cddfSDavid du Colombier 		r = (rgb>>16) & 0xFF;
79*7dd7cddfSDavid du Colombier 		g = (rgb>>8) & 0xFF;
80*7dd7cddfSDavid du Colombier 		b = (rgb>>0) & 0xFF;
81*7dd7cddfSDavid du Colombier 		Y = 0.5870*g + 0.114*b + 0.299*r;
82*7dd7cddfSDavid du Colombier 		Cr = (r-Y)/1.402 + 128.;
83*7dd7cddfSDavid du Colombier 		Cb = (b-Y)/1.772 + 128.;
84*7dd7cddfSDavid du Colombier 		if(Y<0. || Y>=256. || Cr<0. || Cr>=256. || Cb<0. || Cb>=256.)
85*7dd7cddfSDavid du Colombier 			print("bad at %d: %d %d %d; %g %g %g\n", i, r, g, b, Y, Cb, Cr);
86*7dd7cddfSDavid du Colombier 		r = Y;
87*7dd7cddfSDavid du Colombier 		g = Cb;
88*7dd7cddfSDavid du Colombier 		b = Cr;
89*7dd7cddfSDavid du Colombier 		print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
90*7dd7cddfSDavid du Colombier 		if(i%8 == 7)
91*7dd7cddfSDavid du Colombier 			print("\n");
92*7dd7cddfSDavid du Colombier 	}
93*7dd7cddfSDavid du Colombier 	print("};\n\n");
94*7dd7cddfSDavid du Colombier 
95*7dd7cddfSDavid du Colombier 	/* closestycbcr */
96*7dd7cddfSDavid du Colombier 	print("uchar closestycbcr[16*16*16] = {\n");
97*7dd7cddfSDavid du Colombier 	for(y=0; y<256; y+=16)
98*7dd7cddfSDavid du Colombier 	for(cb=0; cb<256; cb+=16)
99*7dd7cddfSDavid du Colombier 	for(cr=0; cr<256; cr+=16)
100*7dd7cddfSDavid du Colombier 		close[(cr/16)+16*((cb/16)+16*(y/16))] = closest(y, cb, cr);
101*7dd7cddfSDavid du Colombier if(0){
102*7dd7cddfSDavid du Colombier 	/*weird: set white for nearly white */
103*7dd7cddfSDavid du Colombier 	for(cb=128-32; cb<=128+32; cb+=16)
104*7dd7cddfSDavid du Colombier 	for(cr=128-32; cr<=128+32; cr+=16)
105*7dd7cddfSDavid du Colombier 		close[(cr/16)+16*((cb/16)+16*(255/16))] = 0;
106*7dd7cddfSDavid du Colombier 	/*weird: set black for nearly black */
107*7dd7cddfSDavid du Colombier 	for(cb=128-32; cb<=128+32; cb+=16)
108*7dd7cddfSDavid du Colombier 	for(cr=128-32; cr<=128+32; cr+=16)
109*7dd7cddfSDavid du Colombier 		close[(cr/16)+16*((cb/16)+16*(0/16))] = 255;
110*7dd7cddfSDavid du Colombier }
111*7dd7cddfSDavid du Colombier 	for(i=0; i<16*16*16; i++){
112*7dd7cddfSDavid du Colombier 		if(i%16 == 0)
113*7dd7cddfSDavid du Colombier 			print("\t");
114*7dd7cddfSDavid du Colombier 		print("%d,", close[i]);
115*7dd7cddfSDavid du Colombier 		if(i%16 == 15)
116*7dd7cddfSDavid du Colombier 			print("\n");
117*7dd7cddfSDavid du Colombier 	}
118*7dd7cddfSDavid du Colombier 	print("};\n\n");
119*7dd7cddfSDavid du Colombier 	exits(nil);
120*7dd7cddfSDavid du Colombier }
121