# HG changeset patch # User Daniel Atallah # Date 1224821950 0 # Node ID 15c30a63f12434f8eafe18218aff8aac5b7ece77 # Parent 1163d93da1090e5f7aa5985817a1023e17102b33 Support rgb(r,g,b) style css color definitions. Fixes #7288. diff -r 1163d93da109 -r 15c30a63f124 pidgin/gtkimhtml.c --- a/pidgin/gtkimhtml.c Fri Oct 24 04:06:25 2008 +0000 +++ b/pidgin/gtkimhtml.c Fri Oct 24 04:19:10 2008 +0000 @@ -2522,6 +2522,68 @@ } } +/* CSS colors are either rgb (x,y,z) or #hex + * we need to convert to hex if it is RGB */ +static gchar* +parse_css_color(gchar *in_color) +{ + char *tmp = in_color; + + if (*tmp == 'r' && *(++tmp) == 'g' && *(++tmp) == 'b' + && *(++tmp) == '(' && *(++tmp)) { + int rgbval[] = {0, 0, 0}; + int count = 0; + const char *v_start; + + while (count < 3) { + /* Skip any leading spaces */ + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + + /* Find the subsequent contiguous digits */ + v_start = tmp; + while (*tmp && g_ascii_isdigit(*tmp)) + tmp++; + + if (tmp != v_start) { + char prev = *tmp; + *tmp = '\0'; + rgbval[count] = atoi(v_start); + *tmp = prev; + + /* deal with % */ + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + if (*tmp == '%') { + rgbval[count] = (rgbval[count] / 100.0) * 255; + tmp++; + } + } else { + purple_debug_warning("gtkimhtml", "Invalid rgb CSS color in '%s'!\n", in_color); + return in_color; + } + + if (rgbval[count] > 255) { + rgbval[count] = 255; + } else if (rgbval[count] < 0) { + rgbval[count] = 0; + } + + while (*tmp && g_ascii_isspace(*tmp)) + tmp++; + if (*tmp == ',') + tmp++; + + count++; + } + + g_free(in_color); + return g_strdup_printf("#%02X%02X%02X", rgbval[0], rgbval[1], rgbval[2]); + } + + return in_color; +} + void gtk_imhtml_insert_html_at_iter(GtkIMHtml *imhtml, const gchar *text, GtkIMHtmlOptions options, @@ -2982,7 +3044,7 @@ oldfont = fonts->data; if (color && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_FORECOLOR)) { - font->fore = color; + font->fore = parse_css_color(color); gtk_imhtml_toggle_forecolor(imhtml, font->fore); } else { if (oldfont && oldfont->fore) @@ -2991,7 +3053,7 @@ } if (background && !(options & GTK_IMHTML_NO_COLOURS) && (imhtml->format_functions & GTK_IMHTML_BACKCOLOR)) { - font->back = background; + font->back = parse_css_color(background); gtk_imhtml_toggle_backcolor(imhtml, font->back); } else { if (oldfont && oldfont->back)