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