summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-30 23:59:38 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-03-31 18:57:03 -0400
commite74e7766d11e0897a9080849286b8175ecfc9f76 (patch)
tree59f814b405ab46275d065b0163a659b8512f9d0b
parent3973a14c078571379962e33f06a983a2bbcdca64 (diff)
downloadgtk+-dotted-lines.tar.gz
Implement dashed and dotted underlinesdotted-lines
This is implementing new support in Pango for rendering dashed and dotted lines. This is currently using a linear gradient for dashes and a repeat node for dots.
-rw-r--r--gtk/gskpango.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/gtk/gskpango.c b/gtk/gskpango.c
index 861a3f0150..757c37259e 100644
--- a/gtk/gskpango.c
+++ b/gtk/gskpango.c
@@ -127,6 +127,85 @@ gsk_pango_renderer_draw_rectangle (PangoRenderer *renderer,
(double)height / PANGO_SCALE));
}
+#if PANGO_VERSION_CHECK(1,49,0)
+static void
+gsk_pango_renderer_draw_line (PangoRenderer *renderer,
+ PangoRenderPart part,
+ PangoRenderLineStyle style,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ GskPangoRenderer *crenderer = (GskPangoRenderer *) (renderer);
+ GdkRGBA rgba;
+ double xx, yy, ww, hh;
+
+ xx = (double)x / PANGO_SCALE;
+ yy = (double)y / PANGO_SCALE;
+ ww = (double)width / PANGO_SCALE;
+ hh = (double)height / PANGO_SCALE;
+
+ get_color (crenderer, part, &rgba);
+ switch (style)
+ {
+ case PANGO_RENDER_LINE_SOLID:
+ gtk_snapshot_append_color (crenderer->snapshot,
+ &rgba,
+ &GRAPHENE_RECT_INIT (xx, yy, ww, hh));
+ break;
+
+ case PANGO_RENDER_LINE_DOTTED:
+ {
+ GskRoundedRect dot;
+ double d = MIN (ww, hh);
+ graphene_rect_t bounds = GRAPHENE_RECT_INIT (xx, yy, d, d);
+ graphene_size_t rr = GRAPHENE_SIZE_INIT (d/2, d/2);
+ GdkRGBA transparent = { 0.f, 0.f, 0.f, 0.f };
+
+ gsk_rounded_rect_init (&dot, &bounds, &rr, &rr, &rr, &rr);
+
+ gtk_snapshot_push_repeat (crenderer->snapshot,
+ &GRAPHENE_RECT_INIT (xx, yy, ww, hh),
+ NULL);
+
+ gtk_snapshot_push_rounded_clip (crenderer->snapshot, &dot);
+ gtk_snapshot_append_color (crenderer->snapshot, &rgba, &bounds);
+ gtk_snapshot_pop (crenderer->snapshot);
+ gtk_snapshot_append_color (crenderer->snapshot, &transparent, &GRAPHENE_RECT_INIT (xx + d, yy, 0.5 * d, d));
+ gtk_snapshot_pop (crenderer->snapshot);
+ }
+ break;
+
+ case PANGO_RENDER_LINE_DASHED:
+ {
+ GskColorStop stops[4];
+ GdkRGBA transparent = { 0.f, 0.f, 0.f, 0.f };
+
+ stops[0].offset = 0;
+ stops[0].color = rgba;
+ stops[1].offset = 0.66;
+ stops[1].color = rgba;
+ stops[2].offset = 0.66;
+ stops[2].color = transparent;
+ stops[3].offset = 1;
+ stops[3].color = transparent;
+
+ gtk_snapshot_append_repeating_linear_gradient (
+ crenderer->snapshot,
+ &GRAPHENE_RECT_INIT (xx, yy, ww, hh),
+ &GRAPHENE_POINT_INIT (xx, yy),
+ &GRAPHENE_POINT_INIT (xx + 9 * MIN (ww, hh), yy),
+ stops, 4);
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+}
+#endif
+
static void
gsk_pango_renderer_draw_trapezoid (PangoRenderer *renderer,
PangoRenderPart part,
@@ -431,6 +510,9 @@ gsk_pango_renderer_class_init (GskPangoRendererClass *klass)
renderer_class->draw_trapezoid = gsk_pango_renderer_draw_trapezoid;
renderer_class->draw_error_underline = gsk_pango_renderer_draw_error_underline;
renderer_class->draw_shape = gsk_pango_renderer_draw_shape;
+#if PANGO_VERSION_CHECK(1,49,0)
+ renderer_class->draw_line = gsk_pango_renderer_draw_line;
+#endif
renderer_class->prepare_run = gsk_pango_renderer_prepare_run;
}