From ca44965f330bb96ee2c948869d75842191e50388 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 25 Oct 2010 20:41:36 +0200 Subject: [PATCH] GtkSymbolicColor: Add gtk_symbolic_color_new_alpha() This function modifies the alpha channel of a color, multiplying it by a factor. --- gtk/gtksymboliccolor.c | 49 +++++++++++++++++++++++++++++++++++++++++- gtk/gtksymboliccolor.h | 2 ++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/gtk/gtksymboliccolor.c b/gtk/gtksymboliccolor.c index 92d3eff9e3..f45c8d2046 100644 --- a/gtk/gtksymboliccolor.c +++ b/gtk/gtksymboliccolor.c @@ -32,6 +32,7 @@ typedef enum { COLOR_TYPE_LITERAL, COLOR_TYPE_NAME, COLOR_TYPE_SHADE, + COLOR_TYPE_ALPHA, COLOR_TYPE_MIX } ColorType; @@ -49,7 +50,7 @@ struct _GtkSymbolicColor { GtkSymbolicColor *color; gdouble factor; - } shade; + } shade, alpha; struct { @@ -165,6 +166,37 @@ gtk_symbolic_color_new_shade (GtkSymbolicColor *color, return symbolic_color; } +/** + * gtk_symbolic_color_new_alpha: + * @color: another #GtkSymbolicColor + * @factor: factor to apply to @color alpha + * + * Creates a symbolic color by modifying the relative alpha + * value of @color. A factor < 1.0 would resolve to a more + * transparent color, while > 1.0 would resolve to a more + * opaque color. + * + * Returns: A newly created #GtkSymbolicColor + * + * Since: 3.0 + **/ +GtkSymbolicColor * +gtk_symbolic_color_new_alpha (GtkSymbolicColor *color, + gdouble factor) +{ + GtkSymbolicColor *symbolic_color; + + g_return_val_if_fail (color != NULL, NULL); + + symbolic_color = g_slice_new0 (GtkSymbolicColor); + symbolic_color->type = COLOR_TYPE_ALPHA; + symbolic_color->alpha.color = gtk_symbolic_color_ref (color); + symbolic_color->alpha.factor = CLAMP (factor, 0, 1); + symbolic_color->ref_count = 1; + + return symbolic_color; +} + /** * gtk_symbolic_color_new_mix: * @color1: color to mix @@ -245,6 +277,9 @@ gtk_symbolic_color_unref (GtkSymbolicColor *color) case COLOR_TYPE_SHADE: gtk_symbolic_color_unref (color->shade.color); break; + case COLOR_TYPE_ALPHA: + gtk_symbolic_color_unref (color->alpha.color); + break; case COLOR_TYPE_MIX: gtk_symbolic_color_unref (color->mix.color1); gtk_symbolic_color_unref (color->mix.color2); @@ -315,6 +350,18 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color, } break; + case COLOR_TYPE_ALPHA: + { + GdkRGBA alpha; + + if (!gtk_symbolic_color_resolve (color->alpha.color, style_set, &alpha)) + return FALSE; + + *resolved_color = alpha; + resolved_color->alpha = CLAMP (alpha.alpha * color->alpha.factor, 0, 1); + + return TRUE; + } case COLOR_TYPE_MIX: { GdkRGBA color1, color2; diff --git a/gtk/gtksymboliccolor.h b/gtk/gtksymboliccolor.h index ce1d3c6fdc..d52a9d32c5 100644 --- a/gtk/gtksymboliccolor.h +++ b/gtk/gtksymboliccolor.h @@ -38,6 +38,8 @@ GtkSymbolicColor * gtk_symbolic_color_new_literal (GdkRGBA *color); GtkSymbolicColor * gtk_symbolic_color_new_name (const gchar *name); GtkSymbolicColor * gtk_symbolic_color_new_shade (GtkSymbolicColor *color, gdouble factor); +GtkSymbolicColor * gtk_symbolic_color_new_alpha (GtkSymbolicColor *color, + gdouble factor); GtkSymbolicColor * gtk_symbolic_color_new_mix (GtkSymbolicColor *color1, GtkSymbolicColor *color2, gdouble factor);