]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/jpg/close.c
disk/format: implement long name support
[plan9front.git] / sys / src / cmd / jpg / close.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
11 int
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
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 #define         SHIFT   5
61 #define INC             (1<<SHIFT)
62
63 typedef struct Color Color;
64
65 struct Color
66 {
67         int             col;
68         Color   *next;
69 };
70
71 Color   *col[INC*INC*INC];
72
73 void
74 add(int c, int y, int cb, int cr)
75 {
76         Color *cp;
77
78         y >>= 8-SHIFT;
79         cb >>= 8-SHIFT;
80         cr >>= 8-SHIFT;
81         cp = col[cr+INC*(cb+INC*y)];
82         while(cp != nil){
83                 if(cp->col == c)
84                         return;
85                 cp = cp->next;
86         }
87         cp = malloc(sizeof(Color));
88         cp->col = c;
89         cp->next = col[cr+INC*(cb+INC*y)];
90         col[cr+INC*(cb+INC*y)] = cp;
91 }
92
93 void
94 main(void)
95 {
96         int y, cb, cr, n;
97         Color *cp;
98
99         for(y=0; y<256; y++){
100                 for(cb=0; cb<256; cb++)
101                         for(cr=0;cr<256;cr++)
102                                 add(closest(y, cb, cr), y, cb, cr);
103                 fprint(2, "%d done\n", y);
104         }
105         for(y=0; y<INC*INC*INC; y++){
106                 n = 0;
107                 cp = col[y];
108                 while(cp != nil){
109                         n++;
110                         cp = cp->next;
111                 }
112                 cp = col[y];
113                 while(cp != nil){
114                         n++;
115                         print("%d ", cp->col);
116                         cp = cp->next;
117                 }
118                 print("\n");
119         }
120 }