close.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. #define SHIFT 5
  55. #define INC (1<<SHIFT)
  56. typedef struct Color Color;
  57. struct Color
  58. {
  59. int col;
  60. Color *next;
  61. };
  62. Color *col[INC*INC*INC];
  63. void
  64. add(int c, int y, int cb, int cr)
  65. {
  66. Color *cp;
  67. y >>= 8-SHIFT;
  68. cb >>= 8-SHIFT;
  69. cr >>= 8-SHIFT;
  70. cp = col[cr+INC*(cb+INC*y)];
  71. while(cp != nil){
  72. if(cp->col == c)
  73. return;
  74. cp = cp->next;
  75. }
  76. cp = malloc(sizeof(Color));
  77. cp->col = c;
  78. cp->next = col[cr+INC*(cb+INC*y)];
  79. col[cr+INC*(cb+INC*y)] = cp;
  80. }
  81. void
  82. main(void)
  83. {
  84. int y, cb, cr, n;
  85. Color *cp;
  86. for(y=0; y<256; y++){
  87. for(cb=0; cb<256; cb++)
  88. for(cr=0;cr<256;cr++)
  89. add(closest(y, cb, cr), y, cb, cr);
  90. fprint(2, "%d done\n", y);
  91. }
  92. for(y=0; y<INC*INC*INC; y++){
  93. n = 0;
  94. cp = col[y];
  95. while(cp != nil){
  96. n++;
  97. cp = cp->next;
  98. }
  99. cp = col[y];
  100. while(cp != nil){
  101. n++;
  102. print("%d ", cp->col);
  103. cp = cp->next;
  104. }
  105. print("\n");
  106. }
  107. }