From 09111969bd5aef2b424c515a1f41bb857ca436d6 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 31 Jul 2020 14:28:02 -0400 Subject: Export pango_parse_color_with_alpha This will be useful to make GdkRGBA support hex formats with alpha. --- docs/pango-sections.txt | 1 + pango/pango-attributes.h | 7 +++- pango/pango-color.c | 86 +++++++++++++++++++++++++++----------------- pango/pango-markup.c | 2 +- pango/pango-utils-internal.h | 4 --- 5 files changed, 61 insertions(+), 39 deletions(-) diff --git a/docs/pango-sections.txt b/docs/pango-sections.txt index 4648816b..04b6b442 100644 --- a/docs/pango-sections.txt +++ b/docs/pango-sections.txt @@ -423,6 +423,7 @@ PangoShowFlags pango_attr_show_new PangoColor pango_color_parse +pango_color_parse_with_alpha pango_color_copy pango_color_free pango_color_to_string diff --git a/pango/pango-attributes.h b/pango/pango-attributes.h index 6f6622ab..dd38aee2 100644 --- a/pango/pango-attributes.h +++ b/pango/pango-attributes.h @@ -65,7 +65,12 @@ PANGO_AVAILABLE_IN_ALL void pango_color_free (PangoColor *color); PANGO_AVAILABLE_IN_ALL gboolean pango_color_parse (PangoColor *color, - const char *spec); + const char *spec); +PANGO_AVAILABLE_IN_1_46 +gboolean pango_color_parse_with_alpha + (PangoColor *color, + guint16 *alpha, + const char *spec); PANGO_AVAILABLE_IN_1_16 gchar *pango_color_to_string(const PangoColor *color); diff --git a/pango/pango-color.c b/pango/pango-color.c index f06756fe..9c044810 100644 --- a/pango/pango-color.c +++ b/pango/pango-color.c @@ -207,15 +207,35 @@ hex (const char *spec, } -/* Like pango_color_parse, but allow strings of the form +/** + * pango_color_parse_with_alpha: + * @color: (nullable): a #PangoColor structure in which to store the + * result, or %NULL + * @alpha: (nullable): return location for alpha, or %NULL + * @spec: a string specifying the new color + * + * Fill in the fields of a color from a string specification. The + * string can either one of a large set of standard names. (Taken + * from the CSS specification), or it can be a hexadecimal + * value in the + * form '#rgb' '#rrggbb' '#rrrgggbbb' or '#rrrrggggbbbb' where + * 'r', 'g' and 'b' are hex digits of the red, green, and blue + * components of the color, respectively. (White in the four + * forms is '#fff' '#ffffff' '#fffffffff' and '#ffffffffffff') + * + * Additionally, parse strings of the form * '#rgba', '#rrggbbaa', '#rrrrggggbbbbaaaa', - * if alpha is not NULL. If no alpha component is found - * in the string, *alpha is set to 0xffff. + * if @alpha is not %NULL, and set @alpha to the value specified + * by the hex digits for 'a'. If no alpha component is found + * in @spec, @alpha is set to 0xffff (for a solid color). + * + * Return value: %TRUE if parsing of the specifier succeeded, + * otherwise false. */ gboolean -_pango_color_parse_with_alpha (PangoColor *color, - guint16 *alpha, - const char *spec) +pango_color_parse_with_alpha (PangoColor *color, + guint16 *alpha, + const char *spec) { g_return_val_if_fail (spec != NULL, FALSE); @@ -248,49 +268,49 @@ _pango_color_parse_with_alpha (PangoColor *color, has_alpha = TRUE; break; default: - return FALSE; + return FALSE; } if (!hex (spec, len, &r) || - !hex (spec + len, len, &g) || - !hex (spec + len * 2, len, &b) || + !hex (spec + len, len, &g) || + !hex (spec + len * 2, len, &b) || (has_alpha && !hex (spec + len * 3, len, &a))) - return FALSE; + return FALSE; if (color) - { - int bits = len * 4; - r <<= 16 - bits; - g <<= 16 - bits; - b <<= 16 - bits; - while (bits < 16) - { - r |= (r >> bits); - g |= (g >> bits); - b |= (b >> bits); - bits *= 2; - } - color->red = r; - color->green = g; - color->blue = b; - } + { + int bits = len * 4; + r <<= 16 - bits; + g <<= 16 - bits; + b <<= 16 - bits; + while (bits < 16) + { + r |= (r >> bits); + g |= (g >> bits); + b |= (b >> bits); + bits *= 2; + } + color->red = r; + color->green = g; + color->blue = b; + } if (alpha && has_alpha) { - int bits = len * 4; + int bits = len * 4; a <<= 16 - bits; - while (bits < 16) - { + while (bits < 16) + { a |= (a >> bits); - bits *= 2; - } + bits *= 2; + } *alpha = a; } } else { if (!find_color (spec, color)) - return FALSE; + return FALSE; } return TRUE; } @@ -317,5 +337,5 @@ gboolean pango_color_parse (PangoColor *color, const char *spec) { - return _pango_color_parse_with_alpha (color, NULL, spec); + return pango_color_parse_with_alpha (color, NULL, spec); } diff --git a/pango/pango-markup.c b/pango/pango-markup.c index 5375a8e0..b74c1ad4 100644 --- a/pango/pango-markup.c +++ b/pango/pango-markup.c @@ -1199,7 +1199,7 @@ span_parse_color (const char *attr_name, int line_number, GError **error) { - if (!_pango_color_parse_with_alpha (color, alpha, attr_val)) + if (!pango_color_parse_with_alpha (color, alpha, attr_val)) { g_set_error (error, G_MARKUP_ERROR, diff --git a/pango/pango-utils-internal.h b/pango/pango-utils-internal.h index 56340215..0bc355e0 100644 --- a/pango/pango-utils-internal.h +++ b/pango/pango-utils-internal.h @@ -43,10 +43,6 @@ gboolean pango_parse_flags (GType type, char *_pango_trim_string (const char *str); -gboolean _pango_color_parse_with_alpha (PangoColor *color, - guint16 *alpha, - const char *spec); - G_END_DECLS -- cgit v1.2.1