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