acid-drop

- Hacking the planet from a LilyGo T-Deck using custom firmware
git clone git://git.acid.vegas/acid-drop.git
Log | Files | Refs | Archive | README | LICENSE

lv_color.c (13496B)

      1 /**
      2  * @file lv_color.c
      3  *
      4  */
      5 
      6 /*********************
      7  *      INCLUDES
      8  *********************/
      9 #include "lv_color.h"
     10 #include "lv_log.h"
     11 
     12 /*********************
     13  *      DEFINES
     14  *********************/
     15 
     16 /**********************
     17  *      TYPEDEFS
     18  **********************/
     19 
     20 /**********************
     21  *  STATIC PROTOTYPES
     22  **********************/
     23 
     24 /**********************
     25  *  STATIC VARIABLES
     26  **********************/
     27 
     28 /**********************
     29  *      MACROS
     30  **********************/
     31 
     32 /**********************
     33  *   GLOBAL FUNCTIONS
     34  **********************/
     35 
     36 LV_ATTRIBUTE_FAST_MEM void lv_color_fill(lv_color_t * buf, lv_color_t color, uint32_t px_num)
     37 {
     38 #if LV_COLOR_DEPTH == 16
     39     uintptr_t buf_int = (uintptr_t)buf;
     40     if(buf_int & 0x3) {
     41         *buf = color;
     42         buf++;
     43         px_num--;
     44     }
     45 
     46     uint32_t c32 = (uint32_t)color.full + ((uint32_t)color.full << 16);
     47     uint32_t * buf32 = (uint32_t *)buf;
     48 
     49     while(px_num > 16) {
     50         *buf32 = c32;
     51         buf32++;
     52         *buf32 = c32;
     53         buf32++;
     54         *buf32 = c32;
     55         buf32++;
     56         *buf32 = c32;
     57         buf32++;
     58 
     59         *buf32 = c32;
     60         buf32++;
     61         *buf32 = c32;
     62         buf32++;
     63         *buf32 = c32;
     64         buf32++;
     65         *buf32 = c32;
     66         buf32++;
     67 
     68         px_num -= 16;
     69     }
     70 
     71     buf = (lv_color_t *)buf32;
     72 
     73     while(px_num) {
     74         *buf = color;
     75         buf++;
     76         px_num--;
     77     }
     78 #else
     79     while(px_num > 16) {
     80         *buf = color;
     81         buf++;
     82         *buf = color;
     83         buf++;
     84         *buf = color;
     85         buf++;
     86         *buf = color;
     87         buf++;
     88 
     89         *buf = color;
     90         buf++;
     91         *buf = color;
     92         buf++;
     93         *buf = color;
     94         buf++;
     95         *buf = color;
     96         buf++;
     97 
     98         *buf = color;
     99         buf++;
    100         *buf = color;
    101         buf++;
    102         *buf = color;
    103         buf++;
    104         *buf = color;
    105         buf++;
    106 
    107         *buf = color;
    108         buf++;
    109         *buf = color;
    110         buf++;
    111         *buf = color;
    112         buf++;
    113         *buf = color;
    114         buf++;
    115 
    116         px_num -= 16;
    117     }
    118     while(px_num) {
    119         *buf = color;
    120         buf++;
    121         px_num--;
    122     }
    123 #endif
    124 }
    125 
    126 lv_color_t lv_color_lighten(lv_color_t c, lv_opa_t lvl)
    127 {
    128     return lv_color_mix(lv_color_white(), c, lvl);
    129 }
    130 
    131 lv_color_t lv_color_darken(lv_color_t c, lv_opa_t lvl)
    132 {
    133     return lv_color_mix(lv_color_black(), c, lvl);
    134 }
    135 
    136 lv_color_t lv_color_change_lightness(lv_color_t c, lv_opa_t lvl)
    137 {
    138     /*It'd be better to convert the color to HSL, change L and convert back to RGB.*/
    139     if(lvl == LV_OPA_50) return c;
    140     else if(lvl < LV_OPA_50) return lv_color_darken(c, (LV_OPA_50 - lvl) * 2);
    141     else return lv_color_lighten(c, (lvl - LV_OPA_50) * 2);
    142 }
    143 
    144 /**
    145  * Convert a HSV color to RGB
    146  * @param h hue [0..359]
    147  * @param s saturation [0..100]
    148  * @param v value [0..100]
    149  * @return the given RGB color in RGB (with LV_COLOR_DEPTH depth)
    150  */
    151 lv_color_t lv_color_hsv_to_rgb(uint16_t h, uint8_t s, uint8_t v)
    152 {
    153     h = (uint32_t)((uint32_t)h * 255) / 360;
    154     s = (uint16_t)((uint16_t)s * 255) / 100;
    155     v = (uint16_t)((uint16_t)v * 255) / 100;
    156 
    157     uint8_t r, g, b;
    158 
    159     uint8_t region, remainder, p, q, t;
    160 
    161     if(s == 0) {
    162         return lv_color_make(v, v, v);
    163     }
    164 
    165     region    = h / 43;
    166     remainder = (h - (region * 43)) * 6;
    167 
    168     p = (v * (255 - s)) >> 8;
    169     q = (v * (255 - ((s * remainder) >> 8))) >> 8;
    170     t = (v * (255 - ((s * (255 - remainder)) >> 8))) >> 8;
    171 
    172     switch(region) {
    173         case 0:
    174             r = v;
    175             g = t;
    176             b = p;
    177             break;
    178         case 1:
    179             r = q;
    180             g = v;
    181             b = p;
    182             break;
    183         case 2:
    184             r = p;
    185             g = v;
    186             b = t;
    187             break;
    188         case 3:
    189             r = p;
    190             g = q;
    191             b = v;
    192             break;
    193         case 4:
    194             r = t;
    195             g = p;
    196             b = v;
    197             break;
    198         default:
    199             r = v;
    200             g = p;
    201             b = q;
    202             break;
    203     }
    204 
    205     lv_color_t result = lv_color_make(r, g, b);
    206     return result;
    207 }
    208 
    209 /**
    210  * Convert a 32-bit RGB color to HSV
    211  * @param r8 8-bit red
    212  * @param g8 8-bit green
    213  * @param b8 8-bit blue
    214  * @return the given RGB color in HSV
    215  */
    216 lv_color_hsv_t lv_color_rgb_to_hsv(uint8_t r8, uint8_t g8, uint8_t b8)
    217 {
    218     uint16_t r = ((uint32_t)r8 << 10) / 255;
    219     uint16_t g = ((uint32_t)g8 << 10) / 255;
    220     uint16_t b = ((uint32_t)b8 << 10) / 255;
    221 
    222     uint16_t rgbMin = r < g ? (r < b ? r : b) : (g < b ? g : b);
    223     uint16_t rgbMax = r > g ? (r > b ? r : b) : (g > b ? g : b);
    224 
    225     lv_color_hsv_t hsv;
    226 
    227     // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness
    228     hsv.v = (100 * rgbMax) >> 10;
    229 
    230     int32_t delta = rgbMax - rgbMin;
    231     if(delta < 3) {
    232         hsv.h = 0;
    233         hsv.s = 0;
    234         return hsv;
    235     }
    236 
    237     // https://en.wikipedia.org/wiki/HSL_and_HSV#Saturation
    238     hsv.s = 100 * delta / rgbMax;
    239     if(hsv.s < 3) {
    240         hsv.h = 0;
    241         return hsv;
    242     }
    243 
    244     // https://en.wikipedia.org/wiki/HSL_and_HSV#Hue_and_chroma
    245     int32_t h;
    246     if(rgbMax == r)
    247         h = (((g - b) << 10) / delta) + (g < b ? (6 << 10) : 0); // between yellow & magenta
    248     else if(rgbMax == g)
    249         h = (((b - r) << 10) / delta) + (2 << 10); // between cyan & yellow
    250     else if(rgbMax == b)
    251         h = (((r - g) << 10) / delta) + (4 << 10); // between magenta & cyan
    252     else
    253         h = 0;
    254     h *= 60;
    255     h >>= 10;
    256     if(h < 0) h += 360;
    257 
    258     hsv.h = h;
    259     return hsv;
    260 }
    261 
    262 /**
    263  * Convert a color to HSV
    264  * @param color color
    265  * @return the given color in HSV
    266  */
    267 lv_color_hsv_t lv_color_to_hsv(lv_color_t color)
    268 {
    269     lv_color32_t color32;
    270     color32.full = lv_color_to32(color);
    271     return lv_color_rgb_to_hsv(color32.ch.red, color32.ch.green, color32.ch.blue);
    272 }
    273 
    274 lv_color_t lv_palette_main(lv_palette_t p)
    275 {
    276     static const lv_color_t colors[] = {
    277         LV_COLOR_MAKE(0xF4, 0x43, 0x36), LV_COLOR_MAKE(0xE9, 0x1E, 0x63), LV_COLOR_MAKE(0x9C, 0x27, 0xB0), LV_COLOR_MAKE(0x67, 0x3A, 0xB7),
    278         LV_COLOR_MAKE(0x3F, 0x51, 0xB5), LV_COLOR_MAKE(0x21, 0x96, 0xF3), LV_COLOR_MAKE(0x03, 0xA9, 0xF4), LV_COLOR_MAKE(0x00, 0xBC, 0xD4),
    279         LV_COLOR_MAKE(0x00, 0x96, 0x88), LV_COLOR_MAKE(0x4C, 0xAF, 0x50), LV_COLOR_MAKE(0x8B, 0xC3, 0x4A), LV_COLOR_MAKE(0xCD, 0xDC, 0x39),
    280         LV_COLOR_MAKE(0xFF, 0xEB, 0x3B), LV_COLOR_MAKE(0xFF, 0xC1, 0x07), LV_COLOR_MAKE(0xFF, 0x98, 0x00), LV_COLOR_MAKE(0xFF, 0x57, 0x22),
    281         LV_COLOR_MAKE(0x79, 0x55, 0x48), LV_COLOR_MAKE(0x60, 0x7D, 0x8B), LV_COLOR_MAKE(0x9E, 0x9E, 0x9E)
    282     };
    283 
    284     if(p >= _LV_PALETTE_LAST) {
    285         LV_LOG_WARN("Invalid palette: %d", p);
    286         return lv_color_black();
    287     }
    288 
    289     return colors[p];
    290 
    291 }
    292 
    293 lv_color_t lv_palette_lighten(lv_palette_t p, uint8_t lvl)
    294 {
    295     static const lv_color_t colors[][5] = {
    296         {LV_COLOR_MAKE(0xEF, 0x53, 0x50), LV_COLOR_MAKE(0xE5, 0x73, 0x73), LV_COLOR_MAKE(0xEF, 0x9A, 0x9A), LV_COLOR_MAKE(0xFF, 0xCD, 0xD2), LV_COLOR_MAKE(0xFF, 0xEB, 0xEE)},
    297         {LV_COLOR_MAKE(0xEC, 0x40, 0x7A), LV_COLOR_MAKE(0xF0, 0x62, 0x92), LV_COLOR_MAKE(0xF4, 0x8F, 0xB1), LV_COLOR_MAKE(0xF8, 0xBB, 0xD0), LV_COLOR_MAKE(0xFC, 0xE4, 0xEC)},
    298         {LV_COLOR_MAKE(0xAB, 0x47, 0xBC), LV_COLOR_MAKE(0xBA, 0x68, 0xC8), LV_COLOR_MAKE(0xCE, 0x93, 0xD8), LV_COLOR_MAKE(0xE1, 0xBE, 0xE7), LV_COLOR_MAKE(0xF3, 0xE5, 0xF5)},
    299         {LV_COLOR_MAKE(0x7E, 0x57, 0xC2), LV_COLOR_MAKE(0x95, 0x75, 0xCD), LV_COLOR_MAKE(0xB3, 0x9D, 0xDB), LV_COLOR_MAKE(0xD1, 0xC4, 0xE9), LV_COLOR_MAKE(0xED, 0xE7, 0xF6)},
    300         {LV_COLOR_MAKE(0x5C, 0x6B, 0xC0), LV_COLOR_MAKE(0x79, 0x86, 0xCB), LV_COLOR_MAKE(0x9F, 0xA8, 0xDA), LV_COLOR_MAKE(0xC5, 0xCA, 0xE9), LV_COLOR_MAKE(0xE8, 0xEA, 0xF6)},
    301         {LV_COLOR_MAKE(0x42, 0xA5, 0xF5), LV_COLOR_MAKE(0x64, 0xB5, 0xF6), LV_COLOR_MAKE(0x90, 0xCA, 0xF9), LV_COLOR_MAKE(0xBB, 0xDE, 0xFB), LV_COLOR_MAKE(0xE3, 0xF2, 0xFD)},
    302         {LV_COLOR_MAKE(0x29, 0xB6, 0xF6), LV_COLOR_MAKE(0x4F, 0xC3, 0xF7), LV_COLOR_MAKE(0x81, 0xD4, 0xFA), LV_COLOR_MAKE(0xB3, 0xE5, 0xFC), LV_COLOR_MAKE(0xE1, 0xF5, 0xFE)},
    303         {LV_COLOR_MAKE(0x26, 0xC6, 0xDA), LV_COLOR_MAKE(0x4D, 0xD0, 0xE1), LV_COLOR_MAKE(0x80, 0xDE, 0xEA), LV_COLOR_MAKE(0xB2, 0xEB, 0xF2), LV_COLOR_MAKE(0xE0, 0xF7, 0xFA)},
    304         {LV_COLOR_MAKE(0x26, 0xA6, 0x9A), LV_COLOR_MAKE(0x4D, 0xB6, 0xAC), LV_COLOR_MAKE(0x80, 0xCB, 0xC4), LV_COLOR_MAKE(0xB2, 0xDF, 0xDB), LV_COLOR_MAKE(0xE0, 0xF2, 0xF1)},
    305         {LV_COLOR_MAKE(0x66, 0xBB, 0x6A), LV_COLOR_MAKE(0x81, 0xC7, 0x84), LV_COLOR_MAKE(0xA5, 0xD6, 0xA7), LV_COLOR_MAKE(0xC8, 0xE6, 0xC9), LV_COLOR_MAKE(0xE8, 0xF5, 0xE9)},
    306         {LV_COLOR_MAKE(0x9C, 0xCC, 0x65), LV_COLOR_MAKE(0xAE, 0xD5, 0x81), LV_COLOR_MAKE(0xC5, 0xE1, 0xA5), LV_COLOR_MAKE(0xDC, 0xED, 0xC8), LV_COLOR_MAKE(0xF1, 0xF8, 0xE9)},
    307         {LV_COLOR_MAKE(0xD4, 0xE1, 0x57), LV_COLOR_MAKE(0xDC, 0xE7, 0x75), LV_COLOR_MAKE(0xE6, 0xEE, 0x9C), LV_COLOR_MAKE(0xF0, 0xF4, 0xC3), LV_COLOR_MAKE(0xF9, 0xFB, 0xE7)},
    308         {LV_COLOR_MAKE(0xFF, 0xEE, 0x58), LV_COLOR_MAKE(0xFF, 0xF1, 0x76), LV_COLOR_MAKE(0xFF, 0xF5, 0x9D), LV_COLOR_MAKE(0xFF, 0xF9, 0xC4), LV_COLOR_MAKE(0xFF, 0xFD, 0xE7)},
    309         {LV_COLOR_MAKE(0xFF, 0xCA, 0x28), LV_COLOR_MAKE(0xFF, 0xD5, 0x4F), LV_COLOR_MAKE(0xFF, 0xE0, 0x82), LV_COLOR_MAKE(0xFF, 0xEC, 0xB3), LV_COLOR_MAKE(0xFF, 0xF8, 0xE1)},
    310         {LV_COLOR_MAKE(0xFF, 0xA7, 0x26), LV_COLOR_MAKE(0xFF, 0xB7, 0x4D), LV_COLOR_MAKE(0xFF, 0xCC, 0x80), LV_COLOR_MAKE(0xFF, 0xE0, 0xB2), LV_COLOR_MAKE(0xFF, 0xF3, 0xE0)},
    311         {LV_COLOR_MAKE(0xFF, 0x70, 0x43), LV_COLOR_MAKE(0xFF, 0x8A, 0x65), LV_COLOR_MAKE(0xFF, 0xAB, 0x91), LV_COLOR_MAKE(0xFF, 0xCC, 0xBC), LV_COLOR_MAKE(0xFB, 0xE9, 0xE7)},
    312         {LV_COLOR_MAKE(0x8D, 0x6E, 0x63), LV_COLOR_MAKE(0xA1, 0x88, 0x7F), LV_COLOR_MAKE(0xBC, 0xAA, 0xA4), LV_COLOR_MAKE(0xD7, 0xCC, 0xC8), LV_COLOR_MAKE(0xEF, 0xEB, 0xE9)},
    313         {LV_COLOR_MAKE(0x78, 0x90, 0x9C), LV_COLOR_MAKE(0x90, 0xA4, 0xAE), LV_COLOR_MAKE(0xB0, 0xBE, 0xC5), LV_COLOR_MAKE(0xCF, 0xD8, 0xDC), LV_COLOR_MAKE(0xEC, 0xEF, 0xF1)},
    314         {LV_COLOR_MAKE(0xBD, 0xBD, 0xBD), LV_COLOR_MAKE(0xE0, 0xE0, 0xE0), LV_COLOR_MAKE(0xEE, 0xEE, 0xEE), LV_COLOR_MAKE(0xF5, 0xF5, 0xF5), LV_COLOR_MAKE(0xFA, 0xFA, 0xFA)},
    315     };
    316 
    317     if(p >= _LV_PALETTE_LAST) {
    318         LV_LOG_WARN("Invalid palette: %d", p);
    319         return lv_color_black();
    320     }
    321 
    322     if(lvl == 0 || lvl > 5) {
    323         LV_LOG_WARN("Invalid level: %d. Must be 1..5", lvl);
    324         return lv_color_black();
    325     }
    326 
    327     lvl--;
    328 
    329     return colors[p][lvl];
    330 }
    331 
    332 lv_color_t lv_palette_darken(lv_palette_t p, uint8_t lvl)
    333 {
    334     static const lv_color_t colors[][4] = {
    335         {LV_COLOR_MAKE(0xE5, 0x39, 0x35), LV_COLOR_MAKE(0xD3, 0x2F, 0x2F), LV_COLOR_MAKE(0xC6, 0x28, 0x28), LV_COLOR_MAKE(0xB7, 0x1C, 0x1C)},
    336         {LV_COLOR_MAKE(0xD8, 0x1B, 0x60), LV_COLOR_MAKE(0xC2, 0x18, 0x5B), LV_COLOR_MAKE(0xAD, 0x14, 0x57), LV_COLOR_MAKE(0x88, 0x0E, 0x4F)},
    337         {LV_COLOR_MAKE(0x8E, 0x24, 0xAA), LV_COLOR_MAKE(0x7B, 0x1F, 0xA2), LV_COLOR_MAKE(0x6A, 0x1B, 0x9A), LV_COLOR_MAKE(0x4A, 0x14, 0x8C)},
    338         {LV_COLOR_MAKE(0x5E, 0x35, 0xB1), LV_COLOR_MAKE(0x51, 0x2D, 0xA8), LV_COLOR_MAKE(0x45, 0x27, 0xA0), LV_COLOR_MAKE(0x31, 0x1B, 0x92)},
    339         {LV_COLOR_MAKE(0x39, 0x49, 0xAB), LV_COLOR_MAKE(0x30, 0x3F, 0x9F), LV_COLOR_MAKE(0x28, 0x35, 0x93), LV_COLOR_MAKE(0x1A, 0x23, 0x7E)},
    340         {LV_COLOR_MAKE(0x1E, 0x88, 0xE5), LV_COLOR_MAKE(0x19, 0x76, 0xD2), LV_COLOR_MAKE(0x15, 0x65, 0xC0), LV_COLOR_MAKE(0x0D, 0x47, 0xA1)},
    341         {LV_COLOR_MAKE(0x03, 0x9B, 0xE5), LV_COLOR_MAKE(0x02, 0x88, 0xD1), LV_COLOR_MAKE(0x02, 0x77, 0xBD), LV_COLOR_MAKE(0x01, 0x57, 0x9B)},
    342         {LV_COLOR_MAKE(0x00, 0xAC, 0xC1), LV_COLOR_MAKE(0x00, 0x97, 0xA7), LV_COLOR_MAKE(0x00, 0x83, 0x8F), LV_COLOR_MAKE(0x00, 0x60, 0x64)},
    343         {LV_COLOR_MAKE(0x00, 0x89, 0x7B), LV_COLOR_MAKE(0x00, 0x79, 0x6B), LV_COLOR_MAKE(0x00, 0x69, 0x5C), LV_COLOR_MAKE(0x00, 0x4D, 0x40)},
    344         {LV_COLOR_MAKE(0x43, 0xA0, 0x47), LV_COLOR_MAKE(0x38, 0x8E, 0x3C), LV_COLOR_MAKE(0x2E, 0x7D, 0x32), LV_COLOR_MAKE(0x1B, 0x5E, 0x20)},
    345         {LV_COLOR_MAKE(0x7C, 0xB3, 0x42), LV_COLOR_MAKE(0x68, 0x9F, 0x38), LV_COLOR_MAKE(0x55, 0x8B, 0x2F), LV_COLOR_MAKE(0x33, 0x69, 0x1E)},
    346         {LV_COLOR_MAKE(0xC0, 0xCA, 0x33), LV_COLOR_MAKE(0xAF, 0xB4, 0x2B), LV_COLOR_MAKE(0x9E, 0x9D, 0x24), LV_COLOR_MAKE(0x82, 0x77, 0x17)},
    347         {LV_COLOR_MAKE(0xFD, 0xD8, 0x35), LV_COLOR_MAKE(0xFB, 0xC0, 0x2D), LV_COLOR_MAKE(0xF9, 0xA8, 0x25), LV_COLOR_MAKE(0xF5, 0x7F, 0x17)},
    348         {LV_COLOR_MAKE(0xFF, 0xB3, 0x00), LV_COLOR_MAKE(0xFF, 0xA0, 0x00), LV_COLOR_MAKE(0xFF, 0x8F, 0x00), LV_COLOR_MAKE(0xFF, 0x6F, 0x00)},
    349         {LV_COLOR_MAKE(0xFB, 0x8C, 0x00), LV_COLOR_MAKE(0xF5, 0x7C, 0x00), LV_COLOR_MAKE(0xEF, 0x6C, 0x00), LV_COLOR_MAKE(0xE6, 0x51, 0x00)},
    350         {LV_COLOR_MAKE(0xF4, 0x51, 0x1E), LV_COLOR_MAKE(0xE6, 0x4A, 0x19), LV_COLOR_MAKE(0xD8, 0x43, 0x15), LV_COLOR_MAKE(0xBF, 0x36, 0x0C)},
    351         {LV_COLOR_MAKE(0x6D, 0x4C, 0x41), LV_COLOR_MAKE(0x5D, 0x40, 0x37), LV_COLOR_MAKE(0x4E, 0x34, 0x2E), LV_COLOR_MAKE(0x3E, 0x27, 0x23)},
    352         {LV_COLOR_MAKE(0x54, 0x6E, 0x7A), LV_COLOR_MAKE(0x45, 0x5A, 0x64), LV_COLOR_MAKE(0x37, 0x47, 0x4F), LV_COLOR_MAKE(0x26, 0x32, 0x38)},
    353         {LV_COLOR_MAKE(0x75, 0x75, 0x75), LV_COLOR_MAKE(0x61, 0x61, 0x61), LV_COLOR_MAKE(0x42, 0x42, 0x42), LV_COLOR_MAKE(0x21, 0x21, 0x21)},
    354     };
    355 
    356     if(p >= _LV_PALETTE_LAST) {
    357         LV_LOG_WARN("Invalid palette: %d", p);
    358         return lv_color_black();
    359     }
    360 
    361     if(lvl == 0 || lvl > 4) {
    362         LV_LOG_WARN("Invalid level: %d. Must be 1..4", lvl);
    363         return lv_color_black();
    364     }
    365 
    366     lvl--;
    367 
    368     return colors[p][lvl];
    369 }