/** * cr_rgb_set_from_term: *@a_this: the instance of #CRRgb to set *@a_value: the terminal from which to set * *Set the rgb from a terminal symbol * * Returns CR_OK upon successful completion, an error code otherwise. */ enum CRStatus cr_rgb_set_from_term (CRRgb *a_this, const struct _CRTerm *a_value) { enum CRStatus status = CR_OK ; g_return_val_if_fail (a_this && a_value, CR_BAD_PARAM_ERROR) ; switch(a_value->type) { case TERM_RGB: if (a_value->content.rgb) { cr_rgb_set_from_rgb (a_this, a_value->content.rgb) ; } break ; case TERM_IDENT: if (a_value->content.str && a_value->content.str->stryng && a_value->content.str->stryng->str) { if (!strncmp ("inherit", a_value->content.str->stryng->str, sizeof ("inherit")-1)) { a_this->inherit = TRUE; a_this->is_transparent = FALSE ; } else { status = cr_rgb_set_from_name (a_this, a_value->content.str->stryng->str) ; } } else { cr_utils_trace_info ("a_value has NULL string value") ; } break ; case TERM_HASH: if (a_value->content.str && a_value->content.str->stryng && a_value->content.str->stryng->str) { status = cr_rgb_set_from_hex_str (a_this, a_value->content.str->stryng->str) ; } else { cr_utils_trace_info ("a_value has NULL string value") ; } break ; default: status = CR_UNKNOWN_TYPE_ERROR ; } return status ; }
/** * rsvg_css_parse_color: * @str: string to parse * @inherit: whether to inherit * * Parse a CSS2 color specifier, return RGB value * * Returns: and RGB value */ guint32 rsvg_css_parse_color (const char *str, gboolean * inherit) { gint val = 0; SETINHERIT (); if (str[0] == '#') { int i; for (i = 1; str[i]; i++) { int hexval; if (str[i] >= '0' && str[i] <= '9') hexval = str[i] - '0'; else if (str[i] >= 'A' && str[i] <= 'F') hexval = str[i] - 'A' + 10; else if (str[i] >= 'a' && str[i] <= 'f') hexval = str[i] - 'a' + 10; else break; val = (val << 4) + hexval; } /* handle #rgb case */ if (i == 4) { val = ((val & 0xf00) << 8) | ((val & 0x0f0) << 4) | (val & 0x00f); val |= val << 4; } val |= 0xff000000; /* opaque */ } else if (g_str_has_prefix (str, "rgb")) { gint r, g, b, a; gboolean has_alpha; guint nb_toks; char **toks; r = g = b = 0; a = 255; if (str[3] == 'a') { /* "rgba" */ has_alpha = TRUE; str += 4; } else { /* "rgb" */ has_alpha = FALSE; str += 3; } str = strchr (str, '('); if (str == NULL) return val; toks = rsvg_css_parse_list (str + 1, &nb_toks); if (toks) { if (nb_toks == (has_alpha ? 4 : 3)) { r = rsvg_css_clip_rgb_percent (toks[0], 255.0); g = rsvg_css_clip_rgb_percent (toks[1], 255.0); b = rsvg_css_clip_rgb_percent (toks[2], 255.0); if (has_alpha) a = rsvg_css_clip_rgb_percent (toks[3], 1.0); else a = 255; } g_strfreev (toks); } val = PACK_RGBA (r, g, b, a); } else if (!strcmp (str, "inherit")) UNSETINHERIT (); else { CRRgb rgb; if (cr_rgb_set_from_name (&rgb, (const guchar *) str) == CR_OK) { val = PACK_RGB (rgb.red, rgb.green, rgb.blue); } else { /* default to opaque black on failed lookup */ UNSETINHERIT (); val = PACK_RGB (0, 0, 0); } } return val; }
/** * Parse a CSS2 color specifier, return RGB value */ guint32 rsvg_css_parse_color (const char *str, gboolean * inherit) { gint val = 0; SETINHERIT (); if (str[0] == '#') { int i; for (i = 1; str[i]; i++) { int hexval; if (str[i] >= '0' && str[i] <= '9') hexval = str[i] - '0'; else if (str[i] >= 'A' && str[i] <= 'F') hexval = str[i] - 'A' + 10; else if (str[i] >= 'a' && str[i] <= 'f') hexval = str[i] - 'a' + 10; else break; val = (val << 4) + hexval; } /* handle #rgb case */ if (i == 4) { val = ((val & 0xf00) << 8) | ((val & 0x0f0) << 4) | (val & 0x00f); val |= val << 4; } } /* i want to use g_str_has_prefix but it isn't in my gstrfuncs.h?? */ else if (strstr (str, "rgb") != NULL) { gint r, g, b; r = g = b = 0; if (strstr (str, "%") != 0) { guint i, nb_toks; char **toks; /* assume rgb (9%, 100%, 23%) */ for (i = 0; str[i] != '('; i++); i++; toks = rsvg_css_parse_list (str + i, &nb_toks); if (toks) { if (nb_toks == 3) { r = rsvg_css_clip_rgb_percent (g_ascii_strtod (toks[0], NULL)); g = rsvg_css_clip_rgb_percent (g_ascii_strtod (toks[1], NULL)); b = rsvg_css_clip_rgb_percent (g_ascii_strtod (toks[2], NULL)); } g_strfreev (toks); } } else { /* assume "rgb (r, g, b)" */ if (3 == sscanf (str, " rgb ( %d , %d , %d ) ", &r, &g, &b)) { r = rsvg_css_clip_rgb (r); g = rsvg_css_clip_rgb (g); b = rsvg_css_clip_rgb (b); } else r = g = b = 0; } val = PACK_RGB (r, g, b); } else if (!strcmp (str, "inherit")) UNSETINHERIT (); else { CRRgb rgb; if (cr_rgb_set_from_name (&rgb, (const guchar *) str) == CR_OK) { val = PACK_RGB (rgb.red, rgb.green, rgb.blue); } else { /* default to black on failed lookup */ UNSETINHERIT (); val = 0; } } return val; }