gamma.c 646 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <stdio.h>
  4. double gamma = 1.6;
  5. int
  6. remap5(int i)
  7. {
  8. double v;
  9. v = (double)i/31.0;
  10. return 31.0*pow(v, gamma);
  11. }
  12. int
  13. remap6(int i)
  14. {
  15. double v;
  16. v = (double)i/63.0;
  17. return 63.0*pow(v, gamma);
  18. }
  19. int
  20. remap(int i)
  21. {
  22. int r, g, b;
  23. b = i & 0x1F;
  24. g = (i>>5) & 0x3F;
  25. r = (i>>11) & 0x1F;
  26. return (remap5(r)<<11) | (remap6(g)<<5) | (remap5(b)<<0);
  27. }
  28. void
  29. main(void)
  30. {
  31. int i;
  32. printf("/* gamma = %.2f */\n", gamma);
  33. printf("ushort gamma[65536] = {\n");
  34. for(i=0; i<65536; i++){
  35. if((i%8) == 0)
  36. printf("\t");
  37. printf("0x%.4x, ", remap(i));
  38. if((i%8) == 7)
  39. printf("\n");
  40. }
  41. printf("};\n");
  42. }