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