comparison src/term.c @ 9013:22c29a515b53 v7.4.1792

commit https://github.com/vim/vim/commit/ab3022196ea4f1496e79b8ee85996e31c45d02f1 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Apr 26 20:59:29 2016 +0200 patch 7.4.1792 Problem: Color name decoding is implemented several times. Solution: Move it to term.c. (Christian Brabandt)
author Christian Brabandt <cb@256bit.org>
date Tue, 26 Apr 2016 21:00:07 +0200
parents 57b791947796
children 2e3c6071db97
comparison
equal deleted inserted replaced
9012:3390e71380fa 9013:22c29a515b53
1264 {(int)KS_NAME, NULL} 1264 {(int)KS_NAME, NULL}
1265 1265
1266 }; /* end of builtin_termcaps */ 1266 }; /* end of builtin_termcaps */
1267 1267
1268 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO) 1268 #if defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
1269 # define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
1270 struct rgbcolor_table_S {
1271 char_u *color_name;
1272 guicolor_T color;
1273 };
1274
1275 static struct rgbcolor_table_S rgb_table[] = {
1276 {(char_u *)"black", RGB(0x00, 0x00, 0x00)},
1277 {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)},
1278 {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)},
1279 {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)},
1280 {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)},
1281 {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)},
1282 {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)},
1283 {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)},
1284 {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)},
1285 {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)},
1286 {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)},
1287 {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */
1288 {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)},
1289 {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)},
1290 {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)},
1291 {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)},
1292 {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)},
1293 {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)},
1294 {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)},
1295 {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)},
1296 {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)},
1297 {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)},
1298 {(char_u *)"green", RGB(0x00, 0xFF, 0x00)},
1299 {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)},
1300 {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)},
1301 {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)},
1302 {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)},
1303 {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)},
1304 {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)},
1305 {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)},
1306 {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)},
1307 {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)},
1308 {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)},
1309 {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)},
1310 {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)},
1311 {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)},
1312 {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)},
1313 {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)},
1314 {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */
1315 {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */
1316 {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)},
1317 {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)},
1318 {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)},
1319 {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)},
1320 {(char_u *)"red", RGB(0xFF, 0x00, 0x00)},
1321 {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)},
1322 {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)},
1323 {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)},
1324 {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)},
1325 {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)},
1326 };
1327
1328 static int
1329 hex_digit(int c)
1330 {
1331 if (isdigit(c))
1332 return c - '0';
1333 c = TOLOWER_ASC(c);
1334 if (c >= 'a' && c <= 'f')
1335 return c - 'a' + 10;
1336 return 0x1ffffff;
1337 }
1338
1339 guicolor_T 1269 guicolor_T
1340 termtrue_mch_get_color(char_u *name) 1270 termtrue_mch_get_color(char_u *name)
1341 { 1271 {
1342 guicolor_T color; 1272 return gui_get_color_cmn(name);
1343 int i;
1344
1345 if (*name == '#' && strlen((char *) name) == 7)
1346 {
1347 color = RGB(((hex_digit(name[1])<<4) + hex_digit(name[2])),
1348 ((hex_digit(name[3])<<4) + hex_digit(name[4])),
1349 ((hex_digit(name[5])<<4) + hex_digit(name[6])));
1350 if (color > 0xffffff)
1351 return INVALCOLOR;
1352 return color;
1353 }
1354 else
1355 {
1356 /* Check if the name is one of the colors we know */
1357 for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
1358 if (STRICMP(name, rgb_table[i].color_name) == 0)
1359 return rgb_table[i].color;
1360 }
1361
1362 /*
1363 * Last attempt. Look in the file "$VIM/rgb.txt".
1364 */
1365 {
1366 #define LINE_LEN 100
1367 FILE *fd;
1368 char line[LINE_LEN];
1369 char_u *fname;
1370 int r, g, b;
1371
1372 fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
1373 if (fname == NULL)
1374 return INVALCOLOR;
1375
1376 fd = fopen((char *)fname, "rt");
1377 vim_free(fname);
1378 if (fd == NULL)
1379 return INVALCOLOR;
1380
1381 while (!feof(fd))
1382 {
1383 int len;
1384 int pos;
1385
1386 (void)fgets(line, LINE_LEN, fd);
1387 len = strlen(line);
1388
1389 if (len <= 1 || line[len-1] != '\n')
1390 continue;
1391
1392 line[len-1] = '\0';
1393
1394 i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
1395 if (i != 3)
1396 continue;
1397
1398 if (STRICMP(line + pos, name) == 0)
1399 {
1400 fclose(fd);
1401 return (guicolor_T) RGB(r, g, b);
1402 }
1403 }
1404 fclose(fd);
1405 }
1406
1407 return INVALCOLOR;
1408 } 1273 }
1409 1274
1410 guicolor_T 1275 guicolor_T
1411 termtrue_get_color(char_u *name) 1276 termtrue_get_color(char_u *name)
1412 { 1277 {
6185 p->bt_string = &ksmd_str[0]; 6050 p->bt_string = &ksmd_str[0];
6186 ++p; 6051 ++p;
6187 } 6052 }
6188 } 6053 }
6189 #endif 6054 #endif
6055
6056 #if defined(FEAT_GUI) || defined(FEAT_TERMTRUECOLOR) || defined(PROTO)
6057 static int
6058 hex_digit(int c)
6059 {
6060 if (isdigit(c))
6061 return c - '0';
6062 c = TOLOWER_ASC(c);
6063 if (c >= 'a' && c <= 'f')
6064 return c - 'a' + 10;
6065 return 0x1ffffff;
6066 }
6067
6068 guicolor_T
6069 gui_get_color_cmn(char_u *name)
6070 {
6071 #define RGB(r, g, b) ((r<<16) | (g<<8) | (b))
6072 #define LINE_LEN 100
6073 FILE *fd;
6074 char line[LINE_LEN];
6075 char_u *fname;
6076 int r, g, b, i;
6077 guicolor_T color;
6078
6079 struct rgbcolor_table_S {
6080 char_u *color_name;
6081 guicolor_T color;
6082 };
6083
6084 static struct rgbcolor_table_S rgb_table[] = {
6085 {(char_u *)"black", RGB(0x00, 0x00, 0x00)},
6086 {(char_u *)"blue", RGB(0x00, 0x00, 0xFF)},
6087 {(char_u *)"brown", RGB(0xA5, 0x2A, 0x2A)},
6088 {(char_u *)"cyan", RGB(0x00, 0xFF, 0xFF)},
6089 {(char_u *)"darkblue", RGB(0x00, 0x00, 0x8B)},
6090 {(char_u *)"darkcyan", RGB(0x00, 0x8B, 0x8B)},
6091 {(char_u *)"darkgray", RGB(0xA9, 0xA9, 0xA9)},
6092 {(char_u *)"darkgreen", RGB(0x00, 0x64, 0x00)},
6093 {(char_u *)"darkgrey", RGB(0xA9, 0xA9, 0xA9)},
6094 {(char_u *)"darkmagenta", RGB(0x8B, 0x00, 0x8B)},
6095 {(char_u *)"darkred", RGB(0x8B, 0x00, 0x00)},
6096 {(char_u *)"darkyellow", RGB(0x8B, 0x8B, 0x00)}, /* No X11 */
6097 {(char_u *)"gray", RGB(0xBE, 0xBE, 0xBE)},
6098 {(char_u *)"gray10", RGB(0x1A, 0x1A, 0x1A)},
6099 {(char_u *)"gray20", RGB(0x33, 0x33, 0x33)},
6100 {(char_u *)"gray30", RGB(0x4D, 0x4D, 0x4D)},
6101 {(char_u *)"gray40", RGB(0x66, 0x66, 0x66)},
6102 {(char_u *)"gray50", RGB(0x7F, 0x7F, 0x7F)},
6103 {(char_u *)"gray60", RGB(0x99, 0x99, 0x99)},
6104 {(char_u *)"gray70", RGB(0xB3, 0xB3, 0xB3)},
6105 {(char_u *)"gray80", RGB(0xCC, 0xCC, 0xCC)},
6106 {(char_u *)"gray90", RGB(0xE5, 0xE5, 0xE5)},
6107 {(char_u *)"green", RGB(0x00, 0xFF, 0x00)},
6108 {(char_u *)"grey", RGB(0xBE, 0xBE, 0xBE)},
6109 {(char_u *)"grey10", RGB(0x1A, 0x1A, 0x1A)},
6110 {(char_u *)"grey20", RGB(0x33, 0x33, 0x33)},
6111 {(char_u *)"grey30", RGB(0x4D, 0x4D, 0x4D)},
6112 {(char_u *)"grey40", RGB(0x66, 0x66, 0x66)},
6113 {(char_u *)"grey50", RGB(0x7F, 0x7F, 0x7F)},
6114 {(char_u *)"grey60", RGB(0x99, 0x99, 0x99)},
6115 {(char_u *)"grey70", RGB(0xB3, 0xB3, 0xB3)},
6116 {(char_u *)"grey80", RGB(0xCC, 0xCC, 0xCC)},
6117 {(char_u *)"grey90", RGB(0xE5, 0xE5, 0xE5)},
6118 {(char_u *)"lightblue", RGB(0xAD, 0xD8, 0xE6)},
6119 {(char_u *)"lightcyan", RGB(0xE0, 0xFF, 0xFF)},
6120 {(char_u *)"lightgray", RGB(0xD3, 0xD3, 0xD3)},
6121 {(char_u *)"lightgreen", RGB(0x90, 0xEE, 0x90)},
6122 {(char_u *)"lightgrey", RGB(0xD3, 0xD3, 0xD3)},
6123 {(char_u *)"lightmagenta", RGB(0xFF, 0x8B, 0xFF)}, /* No X11 */
6124 {(char_u *)"lightred", RGB(0xFF, 0x8B, 0x8B)}, /* No X11 */
6125 {(char_u *)"lightyellow", RGB(0xFF, 0xFF, 0xE0)},
6126 {(char_u *)"magenta", RGB(0xFF, 0x00, 0xFF)},
6127 {(char_u *)"orange", RGB(0xFF, 0xA5, 0x00)},
6128 {(char_u *)"purple", RGB(0xA0, 0x20, 0xF0)},
6129 {(char_u *)"red", RGB(0xFF, 0x00, 0x00)},
6130 {(char_u *)"seagreen", RGB(0x2E, 0x8B, 0x57)},
6131 {(char_u *)"slateblue", RGB(0x6A, 0x5A, 0xCD)},
6132 {(char_u *)"violet", RGB(0xEE, 0x82, 0xEE)},
6133 {(char_u *)"white", RGB(0xFF, 0xFF, 0xFF)},
6134 {(char_u *)"yellow", RGB(0xFF, 0xFF, 0x00)},
6135 };
6136
6137
6138 if (name[0] == '#' && STRLEN(name) == 7)
6139 {
6140 /* Name is in "#rrggbb" format */
6141 color = RGB(((hex_digit(name[1]) << 4) + hex_digit(name[2])),
6142 ((hex_digit(name[3]) << 4) + hex_digit(name[4])),
6143 ((hex_digit(name[5]) << 4) + hex_digit(name[6])));
6144 if (color > 0xffffff)
6145 return INVALCOLOR;
6146 return color;
6147 }
6148
6149 /* Check if the name is one of the colors we know */
6150 for (i = 0; i < (int)(sizeof(rgb_table) / sizeof(rgb_table[0])); i++)
6151 if (STRICMP(name, rgb_table[i].color_name) == 0)
6152 return rgb_table[i].color;
6153
6154 /*
6155 * Last attempt. Look in the file "$VIM/rgb.txt".
6156 */
6157
6158 fname = expand_env_save((char_u *)"$VIMRUNTIME/rgb.txt");
6159 if (fname == NULL)
6160 return INVALCOLOR;
6161
6162 fd = fopen((char *)fname, "rt");
6163 vim_free(fname);
6164 if (fd == NULL)
6165 {
6166 if (p_verbose > 1)
6167 verb_msg((char_u *)_("Cannot open $VIMRUNTIME/rgb.txt"));
6168 return INVALCOLOR;
6169 }
6170
6171 while (!feof(fd))
6172 {
6173 int len;
6174 int pos;
6175
6176 (void)fgets(line, LINE_LEN, fd);
6177 len = strlen(line);
6178
6179 if (len <= 1 || line[len - 1] != '\n')
6180 continue;
6181
6182 line[len - 1] = '\0';
6183
6184 i = sscanf(line, "%d %d %d %n", &r, &g, &b, &pos);
6185 if (i != 3)
6186 continue;
6187
6188 if (STRICMP(line + pos, name) == 0)
6189 {
6190 fclose(fd);
6191 return (guicolor_T) RGB(r, g, b);
6192 }
6193 }
6194 fclose(fd);
6195 return INVALCOLOR;
6196 }
6197 #endif