From ab3022196ea4f1496e79b8ee85996e31c45d02f1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 26 Apr 2016 20:59:29 +0200 Subject: patch 7.4.1792 Problem: Color name decoding is implemented several times. Solution: Move it to term.c. (Christian Brabandt) --- src/term.c | 280 +++++++++++++++++++++++++++++++------------------------------ 1 file changed, 144 insertions(+), 136 deletions(-) (limited to 'src/term.c') diff --git a/src/term.c b/src/term.c index f66236725..a6faaa30a 100644 --- a/src/term.c +++ b/src/term.c @@ -1266,145 +1266,10 @@ static struct builtin_term builtin_termcaps[] = }; /* end of builtin_termcaps */ #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) -# define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) -struct rgbcolor_table_S { - char_u *color_name; - guicolor_T color; -}; - -static struct rgbcolor_table_S rgb_table[] = { - {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, - {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, - {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, - {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, - {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, - {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, - {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, - {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, - {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, - {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, - {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, - {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ - {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, - {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, - {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, - {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, - {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, - {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, - {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, - {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, - {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, - {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, - {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, - {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, - {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, - {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, - {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, - {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, - {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, - {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, - {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, - {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, - {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, - {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, - {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, - {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, - {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, - {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, - {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ - {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ - {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, - {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, - {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, - {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, - {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, - {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, - {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, - {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, - {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, - {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, -}; - - static int -hex_digit(int c) -{ - if (isdigit(c)) - return c - '0'; - c = TOLOWER_ASC(c); - if (c >= 'a' && c <= 'f') - return c - 'a' + 10; - return 0x1ffffff; -} - guicolor_T termtrue_mch_get_color(char_u *name) { - guicolor_T color; - int i; - - if (*name == '#' && strlen((char *) name) == 7) - { - color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])), - ((hex_digit(name[3])<<4) + hex_digit(name[4])), - ((hex_digit(name[5])<<4) + hex_digit(name[6]))); - if (color > 0xffffff) - return INVALCOLOR; - return color; - } - else - { - /* Check if the name is one of the colors we know */ - for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) - if (STRICMP(name, rgb_table[i].color_name) == 0) - return rgb_table[i].color; - } - - /* - * Last attempt. Look in the file "$VIM/rgb.txt". - */ - { -#define LINE_LEN 100 - FILE *fd; - char line[LINE_LEN]; - char_u *fname; - int r, g, b; - - fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); - if (fname == NULL) - return INVALCOLOR; - - fd = fopen((char *)fname, "rt"); - vim_free(fname); - if (fd == NULL) - return INVALCOLOR; - - while (!feof(fd)) - { - int len; - int pos; - - (void)fgets(line, LINE_LEN, fd); - len = strlen(line); - - if (len <= 1 || line[len-1] != '\n') - continue; - - line[len-1] = '\0'; - - i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); - if (i != 3) - continue; - - if (STRICMP(line + pos, name) == 0) - { - fclose(fd); - return (guicolor_T) RGB(r, g, b); - } - } - fclose(fd); - } - - return INVALCOLOR; + return gui_get_color_cmn(name); } guicolor_T @@ -6187,3 +6052,146 @@ update_tcap(int attr) } } #endif + +#if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO) + static int +hex_digit(int c) +{ + if (isdigit(c)) + return c - '0'; + c = TOLOWER_ASC(c); + if (c >= 'a' && c <= 'f') + return c - 'a' + 10; + return 0x1ffffff; +} + + guicolor_T +gui_get_color_cmn(char_u *name) +{ +#define RGB(r, g, b) ((r<<16) | (g<<8) | (b)) +#define LINE_LEN 100 + FILE *fd; + char line[LINE_LEN]; + char_u *fname; + int r, g, b, i; + guicolor_T color; + + struct rgbcolor_table_S { + char_u *color_name; + guicolor_T color; + }; + + static struct rgbcolor_table_S rgb_table[] = { + {(char_u *)"black", RGB(0x00, 0x00, 0x00)}, + {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)}, + {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)}, + {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)}, + {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)}, + {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)}, + {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)}, + {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)}, + {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)}, + {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)}, + {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)}, + {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */ + {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)}, + {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"green", RGB(0x00, 0xFF, 0x00)}, + {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)}, + {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)}, + {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)}, + {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)}, + {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)}, + {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)}, + {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)}, + {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)}, + {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)}, + {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)}, + {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)}, + {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)}, + {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)}, + {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)}, + {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)}, + {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */ + {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */ + {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)}, + {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)}, + {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)}, + {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)}, + {(char_u *)"red", RGB(0xFF, 0x00, 0x00)}, + {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)}, + {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)}, + {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)}, + {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)}, + {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)}, + }; + + + if (name[0] == '#' && STRLEN(name) == 7) + { + /* Name is in "#rrggbb" format */ + color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])), + ((hex_digit(name[3]) << 4) + hex_digit(name[4])), + ((hex_digit(name[5]) << 4) + hex_digit(name[6]))); + if (color > 0xffffff) + return INVALCOLOR; + return color; + } + + /* Check if the name is one of the colors we know */ + for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++) + if (STRICMP(name, rgb_table[i].color_name) == 0) + return rgb_table[i].color; + + /* + * Last attempt. Look in the file "$VIM/rgb.txt". + */ + + fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt"); + if (fname == NULL) + return INVALCOLOR; + + fd = fopen((char *)fname, "rt"); + vim_free(fname); + if (fd == NULL) + { + if (p_verbose > 1) + verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt")); + return INVALCOLOR; + } + + while (!feof(fd)) + { + int len; + int pos; + + (void)fgets(line, LINE_LEN, fd); + len = strlen(line); + + if (len <= 1 || line[len - 1] != '\n') + continue; + + line[len - 1] = '\0'; + + i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos); + if (i != 3) + continue; + + if (STRICMP(line + pos, name) == 0) + { + fclose(fd); + return (guicolor_T) RGB(r, g, b); + } + } + fclose(fd); + return INVALCOLOR; +} +#endif -- cgit v1.2.1