rgbycc.c (2516B)
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 }