summaryrefslogtreecommitdiff
path: root/defs/colors.h
blob: 1bb74085a6aad1ad1f5ede39c856e4304a50094d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef COLORS_H
#define COLORS_H

#include <stddef.h>
#include <stdbool.h>

typedef enum color_mode {
    MODE_NONE, 
    MODE_ANSI16, 
    MODE_ANSI256, 
    MODE_TRUECOLOR 
}color_mode;


typedef struct{
    unsigned char red;
    unsigned char green;
    unsigned char blue;
}rgbcolor;

typedef struct colorconfig {
    enum color_mode mode;
    bool has_solid_color; 
    rgbcolor solid_color;
    bool rainbow_enabled;     //flag
    int saturation;          //default 100
    int brightness;          //default 50
    rgbcolor *rainbow_cache;    //array of rgbcolor malloced
    size_t rainbow_count;
    bool has_gradient;
    rgbcolor gradient_start; 
    rgbcolor gradient_end; 
}colorconfig;

typedef enum ColorParseError {
    COLOR_OK,
    COLOR_ERR_FORMAT,
    COLOR_ERR_HEX,
    COLOR_ERR_RGB,
    COLOR_ERR_HSL,
}ColorParseError;

void colorconfig_init(colorconfig *config);
enum color_mode detect_color_mode(void);
bool enable_windows_ansi(void);
ColorParseError parse_color(const char *s, rgbcolor *out);
const char *color_parse_error_message(ColorParseError error);
unsigned char rgb_to_ansi16(rgbcolor rgb);
unsigned char rgb_to_ansi256(rgbcolor rgb);
rgbcolor hsl_to_rgb(unsigned short h, unsigned char s, unsigned char l);
rgbcolor lerp_color_hsv(rgbcolor start, rgbcolor end, float t);
void rgb_to_fg_escape(rgbcolor rgb, color_mode mode, char *out, size_t size);
void print_color_debug(const colorconfig *config, bool ansi_enabled);

#endif