#ifndef COLORS_H #define COLORS_H #include #include typedef enum color_mode { MODE_NONE, MODE_ANSI16, MODE_ANSI256, MODE_TRUECOLOR }color_mode; typedef enum NamedColor { Black, Red, Green, Yellow, Blue, Magenta, Cyan, White, BrightBlack, BrightRed, BrightGreen, BrightYellow, BrightBlue, BrightMagenta, BrightCyan, BrightWhite, }NamedColor; 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; }colorconfig; typedef enum ColorParseError { COLOR_OK, COLOR_ERR_FORMAT, COLOR_ERR_HEX, COLOR_ERR_RGB, COLOR_ERR_HSL, COLOR_ERR_UNKNOWN_NAME }ColorParseError; void colorconfig_init(colorconfig *config); enum color_mode detect_color_mode(void); bool enable_windows_ansi(void); int parse_namedcolors(const char *name, rgbcolor *out_rgb); 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); #endif