From f9612533c23d18ad1babeeb545aaa5a13d09a656 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 31 Jul 2024 19:59:09 -0400 Subject: [PATCH] css: Add gtk_css_color_to_color This api lets one obtain a color state and color values from a GtkCssColor. We don't want to force everything though sRGB, but we can't quite avoid conversion here, since we don't have a 100% match between the css color spaces and color states. css color cleanup --- gtk/gtkcsscolor.c | 48 ++++++++++++++++++++++++++++++++++++++++ gtk/gtkcsscolorprivate.h | 10 +++++++++ 2 files changed, 58 insertions(+) diff --git a/gtk/gtkcsscolor.c b/gtk/gtkcsscolor.c index 5604ef72dd..00c51132a1 100644 --- a/gtk/gtkcsscolor.c +++ b/gtk/gtkcsscolor.c @@ -19,6 +19,7 @@ #include "gtkcsscolorprivate.h" #include "gtkcolorutilsprivate.h" +#include "gdkcolorstateprivate.h" /* {{{ Initialization */ @@ -1163,5 +1164,52 @@ gtk_css_color_interpolation_method_print (GtkCssColorSpace in, } } +/* }}} */ +/* {{{ GdkColor conversion */ + +void +gtk_css_color_to_color (const GtkCssColor *css, + GdkColor *color) +{ + switch (css->color_space) + { + case GTK_CSS_COLOR_SPACE_SRGB: + gdk_color_init (color, GDK_COLOR_STATE_SRGB, css->values); + break; + + case GTK_CSS_COLOR_SPACE_SRGB_LINEAR: + gdk_color_init (color, GDK_COLOR_STATE_SRGB_LINEAR, css->values); + break; + + case GTK_CSS_COLOR_SPACE_REC2100_PQ: + gdk_color_init (color, GDK_COLOR_STATE_REC2100_PQ, css->values); + break; + + case GTK_CSS_COLOR_SPACE_HSL: + case GTK_CSS_COLOR_SPACE_HWB: + case GTK_CSS_COLOR_SPACE_OKLAB: + case GTK_CSS_COLOR_SPACE_OKLCH: + { + GtkCssColor tmp; + gtk_css_color_convert (css, GTK_CSS_COLOR_SPACE_SRGB, &tmp); + gdk_color_init (color, GDK_COLOR_STATE_SRGB, tmp.values); + } + break; + + case GTK_CSS_COLOR_SPACE_REC2020: + case GTK_CSS_COLOR_SPACE_DISPLAY_P3: + case GTK_CSS_COLOR_SPACE_XYZ: + { + GtkCssColor tmp; + gtk_css_color_convert (css, GTK_CSS_COLOR_SPACE_REC2100_PQ, &tmp); + gdk_color_init (color, GDK_COLOR_STATE_REC2100_PQ, tmp.values); + } + break; + + default: + g_assert_not_reached (); + } +} + /* }}} */ /* vim:set foldmethod=marker expandtab: */ diff --git a/gtk/gtkcsscolorprivate.h b/gtk/gtkcsscolorprivate.h index 5b88a023ac..afaee054ea 100644 --- a/gtk/gtkcsscolorprivate.h +++ b/gtk/gtkcsscolorprivate.h @@ -22,6 +22,7 @@ #include "gtk/css/gtkcssparserprivate.h" #include "gtkcsstypesprivate.h" +#include "gdk/gdkcolorprivate.h" G_BEGIN_DECLS @@ -115,4 +116,13 @@ void gtk_css_color_interpolation_method_print (GtkCssColorSpace in, GtkCssHueInterpolation interp, GString *string); +static inline gboolean +gtk_css_color_is_clear (const GtkCssColor *color) +{ + return color->values[3] < (float) 0x00ff / (float) 0xffff; +} + +void gtk_css_color_to_color (const GtkCssColor *css, + GdkColor *color); + G_END_DECLS