#ifndef COLORS_H #define COLORS_H #include #include 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