lv_color.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. /**
  2. * @file lv_color.c
  3. *
  4. */
  5. /*********************
  6. * INCLUDES
  7. *********************/
  8. #include "lv_color.h"
  9. /*********************
  10. * DEFINES
  11. *********************/
  12. /**********************
  13. * TYPEDEFS
  14. **********************/
  15. /**********************
  16. * STATIC PROTOTYPES
  17. **********************/
  18. /**********************
  19. * STATIC VARIABLES
  20. **********************/
  21. /**********************
  22. * MACROS
  23. **********************/
  24. /**********************
  25. * GLOBAL FUNCTIONS
  26. **********************/
  27. /**********************
  28. * STATIC FUNCTIONS
  29. **********************/
  30. /**
  31. * Convert a HSV color to RGB
  32. * @param h hue [0..359]
  33. * @param s saturation [0..100]
  34. * @param v value [0..100]
  35. * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth)
  36. */
  37. lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v)
  38. {
  39. h = (uint32_t)((uint32_t)h * 255) / 360;
  40. s = (uint16_t)((uint16_t)s * 255) / 100;
  41. v = (uint16_t)((uint16_t)v * 255) / 100;
  42. uint8_t r, g, b;
  43. uint8_t region, remainder, p, q, t;
  44. if (s == 0)
  45. {
  46. r = v;
  47. g = v;
  48. b = v;
  49. return LV_COLOR_MAKE(v, v, v);
  50. }
  51. region = h / 43;
  52. remainder = (h - (region * 43)) * 6;
  53. p = (v * (255 - s)) >> 8;
  54. q = (v * (255 - ((s * remainder) >> 8))) >> 8;
  55. t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
  56. switch (region)
  57. {
  58. case 0:
  59. r = v; g = t; b = p;
  60. break;
  61. case 1:
  62. r = q; g = v; b = p;
  63. break;
  64. case 2:
  65. r = p; g = v; b = t;
  66. break;
  67. case 3:
  68. r = p; g = q; b = v;
  69. break;
  70. case 4:
  71. r = t; g = p; b = v;
  72. break;
  73. default:
  74. r = v; g = p; b = q;
  75. break;
  76. }
  77. lv_color_t result = LV_COLOR_MAKE(r, g, b);
  78. return result;
  79. }
  80. /**
  81. * Convert an RGB color to HSV
  82. * @param r red
  83. * @param g green
  84. * @param b blue
  85. * @return the given RGB color n HSV
  86. */
  87. lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r, uint8_t g, uint8_t b)
  88. {
  89. lv_color_hsv_t hsv;
  90. uint8_t rgbMin, rgbMax;
  91. rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b);
  92. rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b);
  93. hsv.v = rgbMax;
  94. if (hsv.v == 0)
  95. {
  96. hsv.h = 0;
  97. hsv.s = 0;
  98. return hsv;
  99. }
  100. hsv.s = 255 * (long)(rgbMax - rgbMin) / hsv.v;
  101. if (hsv.s == 0)
  102. {
  103. hsv.h = 0;
  104. return hsv;
  105. }
  106. if (rgbMax == r)
  107. hsv.h = 0 + 43 * (g - b) / (rgbMax - rgbMin);
  108. else if (rgbMax == g)
  109. hsv.h = 85 + 43 * (b - r) / (rgbMax - rgbMin);
  110. else
  111. hsv.h = 171 + 43 * (r - g) / (rgbMax - rgbMin);
  112. return hsv;
  113. }