⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colors.c

📁 浏览器的源代码,可移植到嵌入式设备.
💻 C
字号:
#include <string.h>#include <stdlib.h>#include <glib.h>#include <ctype.h>#include "colors.h"#define DEBUG_LEVEL 5#include "debug.h"/* * If EXTENDED_COLOR is defined, the extended set of named colors is supported. * These colors're not standard but they're supported in most browsers. * NOTE: The colors MUST be in alphabetical order and lower case because the *       code uses a binary search. */#define EXTENDED_COLORstatic const struct key {   char *key;   gint32 val;} color_keyword [] = {#ifdef EXTENDED_COLOR   { "aliceblue", 0xf0f8ff},   { "antiquewhite", 0xfaebd7},#endif   { "aqua", 0x00ffff},#ifdef EXTENDED_COLOR   { "aquamarine", 0x7fffd4},   { "azure", 0xf0ffff},   { "beige", 0xf5f5dc},   { "bisque", 0xffe4c4},#endif   { "black", 0x000000},#ifdef EXTENDED_COLOR   { "blanchedalmond", 0xffebcd},#endif   {"blue", 0x0000ff},#ifdef EXTENDED_COLOR   { "blueviolet", 0x8a2be2},   { "brown", 0xa52a2a},   { "burlywood", 0xdeb887},   { "cadetblue", 0x5f9ea0},   { "chartreuse", 0x7fff00},   { "chocolate", 0xd2691e},   { "coral", 0xff7f50},   { "cornflowerblue", 0x6495ed},   { "cornsilk", 0xfff8dc},   { "crimson", 0xdc1436},   { "cyan", 0x00ffff},   { "darkblue", 0x00008b},   { "darkcyan", 0x008b8b},   { "darkgoldenrod", 0xb8860b},   { "darkgray", 0xa9a9a9},   { "darkgreen", 0x006400},   { "darkkhaki", 0xbdb76b},   { "darkmagenta", 0x8b008b},   { "darkolivegreen", 0x556b2f},   { "darkorange", 0xff8c00},   { "darkorchid", 0x9932cc},   { "darkred", 0x8b0000},   { "darksalmon", 0xe9967a},   { "darkseagreen", 0x8fbc8f},   { "darkslateblue", 0x483d8b},   { "darkslategray", 0x2f4f4f},   { "darkturquoise", 0x00ced1},   { "darkviolet", 0x9400d3},   { "deeppink", 0xff1493},   { "deepskyblue", 0x00bfff},   { "dimgray", 0x696969},   { "dodgerblue", 0x1e90ff},   { "firebrick", 0xb22222},   { "floralwhite", 0xfffaf0},   { "forestgreen", 0x228b22},#endif   { "fuchsia", 0xff00ff},#ifdef EXTENDED_COLOR   { "gainsboro", 0xdcdcdc},   { "ghostwhite", 0xf8f8ff},   { "gold", 0xffd700},   { "goldenrod", 0xdaa520},#endif   { "gray", 0x808080},   { "green", 0x008000},#ifdef EXTENDED_COLOR   { "greenyellow", 0xadff2f},   { "honeydew", 0xf0fff0},   { "hotpink", 0xff69b4},   { "indianred", 0xcd5c5c},   { "indigo", 0x4b0082},   { "ivory", 0xfffff0},   { "khaki", 0xf0e68c},   { "lavender", 0xe6e6fa},   { "lavenderblush", 0xfff0f5},   { "lawngreen", 0x7cfc00},   { "lemonchiffon", 0xfffacd},   { "lightblue", 0xadd8e6},   { "lightcoral", 0xf08080},   { "lightcyan", 0xe0ffff},   { "lightgoldenrodyellow", 0xfafad2},   { "lightgreen", 0x90ee90},   { "lightgrey", 0xd3d3d3},   { "lightpink", 0xffb6c1},   { "lightsalmon", 0xffa07a},   { "lightseagreen", 0x20b2aa},   { "lightskyblue", 0x87cefa},   { "lightslategray", 0x778899},   { "lightsteelblue", 0xb0c4de},   { "lightyellow", 0xffffe0},#endif   { "lime", 0x00ff00},#ifdef EXTENDED_COLOR   { "limegreen", 0x32cd32},   { "linen", 0xfaf0e6},   { "magenta", 0xff00ff},#endif   { "maroon", 0x800000},#ifdef EXTENDED_COLOR   { "mediumaquamarine", 0x66cdaa},   { "mediumblue", 0x0000cd},   { "mediumorchid", 0xba55d3},   { "mediumpurple", 0x9370db},   { "mediumseagreen", 0x3cb371},   { "mediumslateblue", 0x7b68ee},   { "mediumspringgreen", 0x00fa9a},   { "mediumturquoise", 0x48d1cc},   { "mediumvioletred", 0xc71585},   { "midnightblue", 0x191970},   { "mintcream", 0xf5fffa},   { "mistyrose", 0xffe4e1},   { "moccasin", 0xffe4b5},   { "navajowhite", 0xffdead},#endif   { "navy", 0x000080},#ifdef EXTENDED_COLOR   { "oldlace", 0xfdf5e6},#endif   { "olive", 0x808000},#ifdef EXTENDED_COLOR   { "olivedrab", 0x6b8e23},   { "orange", 0xffa500},   { "orangered", 0xff4500},   { "orchid", 0xda70d6},   { "palegoldenrod", 0xeee8aa},   { "palegreen", 0x98fb98},   { "paleturquoise", 0xafeeee},   { "palevioletred", 0xdb7093},   { "papayawhip", 0xffefd5},   { "peachpuff", 0xffdab9},   { "peru", 0xcd853f},   { "pink", 0xffc0cb},   { "plum", 0xdda0dd},   { "powderblue", 0xb0e0e6},#endif   { "purple", 0x800080},   { "red", 0xff0000},#ifdef EXTENDED_COLOR   { "rosybrown", 0xbc8f8f},   { "royalblue", 0x4169e1},   { "saddlebrown", 0x8b4513},   { "salmon", 0xfa8072},   { "sandybrown", 0xf4a460},   { "seagreen", 0x2e8b57},   { "seashell", 0xfff5ee},   { "sienna", 0xa0522d},#endif   { "silver", 0xc0c0c0},#ifdef EXTENDED_COLOR   { "skyblue", 0x87ceeb},   { "slateblue", 0x6a5acd},   { "slategray", 0x708090},   { "snow", 0xfffafa},   { "springgreen", 0x00ff7f},   { "steelblue", 0x4682b4},   { "tan", 0xd2b48c},#endif   { "teal", 0x008080},#ifdef EXTENDED_COLOR   { "thistle", 0xd8bfd8},   { "tomato", 0xff6347},   { "turquoise", 0x40e0d0},   { "violet", 0xee82ee},   { "wheat", 0xf5deb3},#endif   { "white", 0xffffff},#ifdef EXTENDED_COLOR   { "whitesmoke", 0xf5f5f5},#endif   { "yellow", 0xffff00},#ifdef EXTENDED_COLOR   { "yellowgreen", 0x9acd32},#endif};#define NCOLORS   (sizeof(color_keyword) / sizeof(struct key))/* * Parse a color in hex (RRGGBB) * * Return Value: *   parsed color if successful (err = 0), *   default_color on error (err = 1). */static gint32 Color_parse_hex (const char *s, gint32 default_color, gint *err){  gint32 ret_color;  gchar *tail;  *err = 1;  ret_color = strtol(s, &tail, 16);  if ( tail - s == 6 )     *err = 0;  else     ret_color = default_color;  return ret_color;}/* * Parse the color info from a subtag. * If subtag string begins with # or with 0x simply return the color number * otherwise search one color from the set of named colors. * * Return Value: *    Parsed color if successful, *    default_color (+ error code) on error. */gint32 a_Color_parse (const char *subtag, gint32 default_color, gint *err){   const char *cp;   gint32 ret_color;   gint ret, low, mid, high, st = 1;   /* skip leading spaces */   for (cp = subtag; isspace(*cp); cp++);   ret_color = default_color;   if (*cp == '#') {      ret_color = Color_parse_hex(cp + 1, default_color, &st);   } else if (*cp == '0' && (cp[1] == 'x' || cp[1] == 'X') ) {      ret_color = Color_parse_hex(cp + 2, default_color, &st);      st = 2;   } else {      /* Binary search */      low = 0;      high = NCOLORS - 1;      while (low <= high) {         mid = (low + high) / 2;         if ((ret = g_strcasecmp(cp, color_keyword[mid].key)) < 0)            high = mid - 1;         else if (ret > 0)            low = mid + 1;         else {            ret_color = color_keyword[mid].val;            st = 0;            break;         }      }      if (low > high) {         /* try for RRGGBB lacking the leading '#' */         ret_color = Color_parse_hex(cp, default_color, &st);         st = 1;      }   }   DEBUG_MSG(3, "subtag: %s\n", subtag);   DEBUG_MSG(3, "color :  %X\n", ret_color);   *err = st;   return ret_color;}/* * Return a "distance" measure (between [0, 10]) */static int Color_distance(long c1, long c2){   return (labs((c1 & 0x0000ff) - (c2 & 0x0000ff)) +           labs(((c1 & 0x00ff00) - (c2 & 0x00ff00)) >> 8)  +           labs(((c1 & 0xff0000) - (c2 & 0xff0000)) >> 16)) / 75;}/* * Return a suitable "visited link" color */gint32 a_Color_vc(gint32 c1, gint32 c2, gint32 c3){  static gint32 /*darkcyan darkmagenta olive    darkred    white     black*/          v[6] = {0x008b8b, 0x8b008b, 0x808000, 0x8b0000, 0xffffff, 0x000000};  gint i;  for (i = 0; i < 6; ++i)     if (Color_distance(c1, v[i]) >= 2 &&         Color_distance(c2, v[i]) >= 2 &&         Color_distance(c3, v[i]) >= 2)        break;  return (i < 6) ? v[i] : c1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -