rgbrgbv.c 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <draw.h>
  4. /*
  5. * This version of closest() is now (feb 20, 2001) installed as rgb2cmap in libdraw
  6. */
  7. int
  8. closest(int cr, int cg, int cb)
  9. {
  10. int i, r, g, b, sq;
  11. ulong rgb;
  12. int best, bestsq;
  13. best = 0;
  14. bestsq = 0x7FFFFFFF;
  15. for(i=0; i<256; i++){
  16. rgb = cmap2rgb(i);
  17. r = (rgb>>16) & 0xFF;
  18. g = (rgb>>8) & 0xFF;
  19. b = (rgb>>0) & 0xFF;
  20. sq = (r-cr)*(r-cr)+(g-cg)*(g-cg)+(b-cb)*(b-cb);
  21. if(sq < bestsq){
  22. bestsq = sq;
  23. best = i;
  24. }
  25. }
  26. return best;
  27. }
  28. void
  29. main(int argc, char *argv[])
  30. {
  31. int i, rgb;
  32. int r, g, b;
  33. uchar close[16*16*16];
  34. /* rgbmap */
  35. print("uint rgbmap[256] = {\n");
  36. for(i=0; i<256; i++){
  37. if(i%8 == 0)
  38. print("\t");
  39. rgb = cmap2rgb(i);
  40. r = (rgb>>16) & 0xFF;
  41. g = (rgb>>8) & 0xFF;
  42. b = (rgb>>0) & 0xFF;
  43. print("0x%.6ulX, ", (r<<16) | (g<<8) | b);
  44. if(i%8 == 7)
  45. print("\n");
  46. }
  47. print("};\n\n");
  48. /* closestrgb */
  49. print("uchar closestrgb[16*16*16] = {\n");
  50. for(r=0; r<256; r+=16)
  51. for(g=0; g<256; g+=16)
  52. for(b=0; b<256; b+=16)
  53. close[(b/16)+16*((g/16)+16*(r/16))] = closest(r+8, g+8, b+8);
  54. for(i=0; i<16*16*16; i++){
  55. if(i%16 == 0)
  56. print("\t");
  57. print("%d,", close[i]);
  58. if(i%16 == 15)
  59. print("\n");
  60. }
  61. print("};\n\n");
  62. exits(nil);
  63. }