mirror of
https://github.com/lvgl/lvgl.git
synced 2025-01-14 06:42:58 +08:00
144 lines
2.8 KiB
C
144 lines
2.8 KiB
C
/**
|
|
* @file lv_color.c
|
|
*
|
|
*/
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "lv_color.h"
|
|
|
|
/*********************
|
|
* DEFINES
|
|
*********************/
|
|
|
|
/**********************
|
|
* TYPEDEFS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC PROTOTYPES
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC VARIABLES
|
|
**********************/
|
|
|
|
/**********************
|
|
* MACROS
|
|
**********************/
|
|
|
|
/**********************
|
|
* GLOBAL FUNCTIONS
|
|
**********************/
|
|
|
|
/**********************
|
|
* STATIC FUNCTIONS
|
|
**********************/
|
|
|
|
/**
|
|
* Convert a HSV color to RGB
|
|
* @param h hue [0..359]
|
|
* @param s saturation [0..100]
|
|
* @param v value [0..100]
|
|
* @return the given RGB color in RGB (with LV_COLOR_DEPTH depth)
|
|
*/
|
|
lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v)
|
|
{
|
|
h = (uint32_t)((uint32_t)h * 255) / 360;
|
|
s = (uint16_t)((uint16_t)s * 255) / 100;
|
|
v = (uint16_t)((uint16_t)v * 255) / 100;
|
|
|
|
uint8_t r, g, b;
|
|
|
|
uint8_t region, remainder, p, q, t;
|
|
|
|
if(s == 0) {
|
|
r = v;
|
|
g = v;
|
|
b = v;
|
|
return LV_COLOR_MAKE(v, v, v);
|
|
}
|
|
|
|
region = h / 43;
|
|
remainder = (h - (region * 43)) * 6;
|
|
|
|
p = (v * (255 - s)) >> 8;
|
|
q = (v * (255 - ((s * remainder) >> 8))) >> 8;
|
|
t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
|
|
|
|
switch(region) {
|
|
case 0:
|
|
r = v;
|
|
g = t;
|
|
b = p;
|
|
break;
|
|
case 1:
|
|
r = q;
|
|
g = v;
|
|
b = p;
|
|
break;
|
|
case 2:
|
|
r = p;
|
|
g = v;
|
|
b = t;
|
|
break;
|
|
case 3:
|
|
r = p;
|
|
g = q;
|
|
b = v;
|
|
break;
|
|
case 4:
|
|
r = t;
|
|
g = p;
|
|
b = v;
|
|
break;
|
|
default:
|
|
r = v;
|
|
g = p;
|
|
b = q;
|
|
break;
|
|
}
|
|
|
|
lv_color_t result = LV_COLOR_MAKE(r, g, b);
|
|
return result;
|
|
}
|
|
|
|
/**
|
|
* Convert an RGB color to HSV
|
|
* @param r red
|
|
* @param g green
|
|
* @param b blue
|
|
* @return the given RGB color n HSV
|
|
*/
|
|
lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r, uint8_t g, uint8_t b)
|
|
{
|
|
lv_color_hsv_t hsv;
|
|
uint8_t rgbMin, rgbMax;
|
|
|
|
rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b);
|
|
rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b);
|
|
|
|
hsv.v = rgbMax;
|
|
if(hsv.v == 0) {
|
|
hsv.h = 0;
|
|
hsv.s = 0;
|
|
return hsv;
|
|
}
|
|
|
|
hsv.s = 255 * (long)(rgbMax - rgbMin) / hsv.v;
|
|
if(hsv.s == 0) {
|
|
hsv.h = 0;
|
|
return hsv;
|
|
}
|
|
|
|
if(rgbMax == r)
|
|
hsv.h = 0 + 43 * (g - b) / (rgbMax - rgbMin);
|
|
else if(rgbMax == g)
|
|
hsv.h = 85 + 43 * (b - r) / (rgbMax - rgbMin);
|
|
else
|
|
hsv.h = 171 + 43 * (r - g) / (rgbMax - rgbMin);
|
|
|
|
return hsv;
|
|
}
|