Blame


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