[gtk/wip/baedert/css-values: 2/7] csscolorvalue: Compute alpha/shade/mix of color literals directly
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/baedert/css-values: 2/7] csscolorvalue: Compute alpha/shade/mix of color literals directly
- Date: Thu, 9 Jan 2020 11:22:10 +0000 (UTC)
commit e4198b40e677218627cfcabc594dc2d6dfa704af
Author: Timm Bäder <mail baedert org>
Date: Thu Jan 9 11:54:58 2020 +0100
csscolorvalue: Compute alpha/shade/mix of color literals directly
The values of these are never gonna change so we can as well create
literal color values from the resulting colors instead.
gtk/gtkcsscolorvalue.c | 79 +++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 69 insertions(+), 10 deletions(-)
---
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index b8cd6c1dab..822c91faca 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -289,6 +289,41 @@ static const GtkCssValueClass GTK_CSS_VALUE_COLOR = {
gtk_css_value_color_print
};
+static void
+apply_alpha (const GdkRGBA *in,
+ GdkRGBA *out,
+ double factor)
+{
+ *out = *in;
+
+ out->alpha = CLAMP (in->alpha * factor, 0, 1);
+}
+
+static void
+apply_shade (const GdkRGBA *in,
+ GdkRGBA *out,
+ double factor)
+{
+ GtkHSLA hsla;
+
+ _gtk_hsla_init_from_rgba (&hsla, in);
+ _gtk_hsla_shade (&hsla, &hsla, factor);
+
+ _gdk_rgba_init_from_hsla (out, &hsla);
+}
+
+static void
+apply_mix (const GdkRGBA *in1,
+ const GdkRGBA *in2,
+ GdkRGBA *out,
+ double factor)
+{
+ out->red = CLAMP (in1->red + ((in2->red - in1->red) * factor), 0, 1);
+ out->green = CLAMP (in1->green + ((in2->green - in1->green) * factor), 0, 1);
+ out->blue = CLAMP (in1->blue + ((in2->blue - in1->blue) * factor), 0, 1);
+ out->alpha = CLAMP (in1->alpha + ((in2->alpha - in1->alpha) * factor), 0, 1);
+}
+
GtkCssValue *
_gtk_css_color_value_resolve (GtkCssValue *color,
GtkStyleProvider *provider,
@@ -326,17 +361,13 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
case COLOR_TYPE_SHADE:
{
GtkCssValue *val;
- GtkHSLA hsla;
GdkRGBA shade;
val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, cycle_list);
if (val == NULL)
return NULL;
- _gtk_hsla_init_from_rgba (&hsla, _gtk_css_rgba_value_get_rgba (val));
- _gtk_hsla_shade (&hsla, &hsla, color->sym_col.shade.factor);
-
- _gdk_rgba_init_from_hsla (&shade, &hsla);
+ apply_shade (_gtk_css_rgba_value_get_rgba (val), &shade, color->sym_col.shade.factor);
_gtk_css_value_unref (val);
@@ -354,7 +385,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
return NULL;
alpha = *_gtk_css_rgba_value_get_rgba (val);
- alpha.alpha = CLAMP (alpha.alpha * color->sym_col.alpha.factor, 0, 1);
+ apply_alpha (&alpha, &alpha, color->sym_col.alpha.factor);
_gtk_css_value_unref (val);
@@ -379,10 +410,7 @@ _gtk_css_color_value_resolve (GtkCssValue *color,
color2 = *_gtk_css_rgba_value_get_rgba (val);
_gtk_css_value_unref (val);
- res.red = CLAMP (color1.red + ((color2.red - color1.red) * color->sym_col.mix.factor), 0, 1);
- res.green = CLAMP (color1.green + ((color2.green - color1.green) * color->sym_col.mix.factor), 0, 1);
- res.blue = CLAMP (color1.blue + ((color2.blue - color1.blue) * color->sym_col.mix.factor), 0, 1);
- res.alpha = CLAMP (color1.alpha + ((color2.alpha - color1.alpha) * color->sym_col.mix.factor), 0, 1);
+ apply_mix (&color1, &color2, &res, color->sym_col.mix.factor);
value =_gtk_css_rgba_value_new_from_rgba (&res);
}
@@ -467,6 +495,15 @@ _gtk_css_color_value_new_shade (GtkCssValue *color,
gtk_internal_return_val_if_fail (color->class == >K_CSS_VALUE_COLOR, NULL);
+ if (color->type == COLOR_TYPE_LITERAL)
+ {
+ GdkRGBA c = *_gtk_css_rgba_value_get_rgba (color->last_value);
+
+ apply_shade (&c, &c, factor);
+
+ return _gtk_css_color_value_new_literal (&c);
+ }
+
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
value->type = COLOR_TYPE_SHADE;
value->sym_col.shade.color = _gtk_css_value_ref (color);
@@ -483,6 +520,15 @@ _gtk_css_color_value_new_alpha (GtkCssValue *color,
gtk_internal_return_val_if_fail (color->class == >K_CSS_VALUE_COLOR, NULL);
+ if (color->type == COLOR_TYPE_LITERAL)
+ {
+ GdkRGBA c = *_gtk_css_rgba_value_get_rgba (color->last_value);
+
+ apply_alpha (&c, &c, factor);
+
+ return _gtk_css_color_value_new_literal (&c);
+ }
+
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
value->type = COLOR_TYPE_ALPHA;
value->sym_col.alpha.color = _gtk_css_value_ref (color);
@@ -501,6 +547,19 @@ _gtk_css_color_value_new_mix (GtkCssValue *color1,
gtk_internal_return_val_if_fail (color1->class == >K_CSS_VALUE_COLOR, NULL);
gtk_internal_return_val_if_fail (color2->class == >K_CSS_VALUE_COLOR, NULL);
+ if (color1->type == COLOR_TYPE_LITERAL &&
+ color2->type == COLOR_TYPE_LITERAL)
+ {
+ GdkRGBA c1 = *_gtk_css_rgba_value_get_rgba (color1->last_value);
+ GdkRGBA c2 = *_gtk_css_rgba_value_get_rgba (color2->last_value);
+ GdkRGBA result;
+
+ apply_mix (&c1, &c2, &result, factor);
+
+ return _gtk_css_color_value_new_literal (&result);
+
+ }
+
value = _gtk_css_value_new (GtkCssValue, >K_CSS_VALUE_COLOR);
value->type = COLOR_TYPE_MIX;
value->sym_col.mix.color1 = _gtk_css_value_ref (color1);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]