URI:
       tclose.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tclose.c (1981B)
       ---
            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         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
           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
           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 }