close.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 }