Apply css text shadows in text views

For now, this just applies the shadow from the widget's style,
there is no way to apply different shadows to text ranges (except
for the selection, which already has its own css style).
This commit is contained in:
Matthias Clasen
2024-04-19 20:54:01 -04:00
parent 02115912aa
commit 7ff4cba624
2 changed files with 21 additions and 0 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
@@ -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;