Merge branch 'textview-text-shadow' into 'main'

Apply css text shadows in text views

See merge request GNOME/gtk!7154
This commit is contained in:
Matthias Clasen
2024-04-20 13:06:54 +00:00
2 changed files with 27 additions and 6 deletions

View File

@@ -28,6 +28,7 @@
#include "gtkwidgetprivate.h"
#include "gtkcsscolorvalueprivate.h"
#include "gdk/gdkrgbaprivate.h"
#include "gtkcssshadowvalueprivate.h"
#include <math.h>
@@ -97,6 +98,11 @@ gsk_pango_renderer_draw_glyph_item (PangoRenderer *renderer,
{
GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
GdkRGBA color;
gboolean has_shadow = FALSE;
if (crenderer->shadow_style)
has_shadow = gtk_css_shadow_value_push_snapshot (crenderer->shadow_style->font->text_shadow,
crenderer->snapshot);
get_color (crenderer, PANGO_RENDER_PART_FOREGROUND, &color);
@@ -106,6 +112,9 @@ gsk_pango_renderer_draw_glyph_item (PangoRenderer *renderer,
&color,
(float) x / PANGO_SCALE,
(float) y / PANGO_SCALE);
if (has_shadow)
gtk_snapshot_pop (crenderer->snapshot);
}
static void
@@ -343,20 +352,20 @@ gsk_pango_renderer_prepare_run (PangoRenderer *renderer,
GTK_IS_TEXT_VIEW (crenderer->widget))
{
GtkCssNode *node;
GtkCssValue *value;
GtkCssStyle *style;
node = gtk_text_view_get_selection_node ((GtkTextView *)crenderer->widget);
value = gtk_css_node_get_style (node)->core->color;
fg_rgba = gtk_css_color_value_get_rgba (value);
style = gtk_css_node_get_style (node);
fg_rgba = gtk_css_color_value_get_rgba (style->core->color);
}
else if (crenderer->state == GSK_PANGO_RENDERER_CURSOR && gtk_widget_has_focus (crenderer->widget))
{
GtkCssNode *node;
GtkCssValue *value;
GtkCssStyle *style;
node = gtk_widget_get_css_node (crenderer->widget);
value = gtk_css_node_get_style (node)->background->background_color;
fg_rgba = gtk_css_color_value_get_rgba (value);
style = gtk_css_node_get_style (node);
fg_rgba = gtk_css_color_value_get_rgba (style->background->background_color);
}
else
fg_rgba = appearance->fg_rgba;
@@ -382,6 +391,15 @@ gsk_pango_renderer_prepare_run (PangoRenderer *renderer,
}
else
text_renderer_set_rgba (crenderer, PANGO_RENDER_PART_UNDERLINE, fg_rgba);
crenderer->shadow_style = NULL;
if (GTK_IS_TEXT_VIEW (crenderer->widget))
{
if (crenderer->state == GSK_PANGO_RENDERER_SELECTED)
crenderer->shadow_style = gtk_css_node_get_style (gtk_text_view_get_selection_node ((GtkTextView *)crenderer->widget));
else if (crenderer->state != GSK_PANGO_RENDERER_CURSOR)
crenderer->shadow_style = gtk_css_node_get_style (gtk_widget_get_css_node (crenderer->widget));
}
}
static void
@@ -439,6 +457,7 @@ gsk_pango_renderer_release (GskPangoRenderer *renderer)
{
renderer->widget = NULL;
renderer->snapshot = NULL;
renderer->shadow_style = NULL;
if (renderer->error_color)
{

View File

@@ -20,6 +20,7 @@
#include <pango/pango.h>
#include "gtk/gtksnapshot.h"
#include "gtk/gtkcssstyleprivate.h"
G_BEGIN_DECLS
@@ -58,6 +59,7 @@ struct _GskPangoRenderer
GtkWidget *widget;
GtkSnapshot *snapshot;
const GdkRGBA *fg_color;
GtkCssStyle *shadow_style;
/* Error underline color for this widget */
GdkRGBA *error_color;