rgbycc.c 2.4 KB

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