summaryrefslogtreecommitdiff
path: root/pango/pangocairo-render.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-03-30 20:08:29 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-03-30 21:20:36 -0400
commit5ce5b8f5b7dc4616d0d88454a23dd3bd89902265 (patch)
tree734cdc5b8fa64a09f5311c14f63cf1bb2dcfc1a4 /pango/pangocairo-render.c
parent708e7d1be90ccf92c17473a78218e7f43f059309 (diff)
downloadpango-5ce5b8f5b7dc4616d0d88454a23dd3bd89902265.tar.gz
Add dashed and dotted lineslines
Extend the PangoUnderline and PangoOverline enumerations to cover dashed and dotted variants of the various lines, add api to PangoRenderer to render such lines, and implement it in the cairo renderer.
Diffstat (limited to 'pango/pangocairo-render.c')
-rw-r--r--pango/pangocairo-render.c84
1 files changed, 84 insertions, 0 deletions
diff --git a/pango/pangocairo-render.c b/pango/pangocairo-render.c
index 9e3cfab8..c5ca74e3 100644
--- a/pango/pangocairo-render.c
+++ b/pango/pangocairo-render.c
@@ -809,6 +809,89 @@ pango_cairo_renderer_draw_shape (PangoRenderer *renderer,
}
static void
+pango_cairo_renderer_draw_line (PangoRenderer *renderer,
+ PangoRenderPart part,
+ PangoRenderLineStyle style,
+ int x,
+ int y,
+ int width,
+ int height)
+{
+ PangoCairoRenderer *crenderer = (PangoCairoRenderer *) (renderer);
+
+ if (!crenderer->do_path)
+ {
+ cairo_save (crenderer->cr);
+
+ set_color (crenderer, part);
+ }
+
+ switch (style)
+ {
+ case PANGO_RENDER_LINE_SOLID:
+ cairo_rectangle (crenderer->cr,
+ crenderer->x_offset + (double)x / PANGO_SCALE,
+ crenderer->y_offset + (double)y / PANGO_SCALE,
+ (double)width / PANGO_SCALE,
+ (double)height / PANGO_SCALE);
+ break;
+
+ case PANGO_RENDER_LINE_DOTTED:
+ {
+ double radius;
+ double xc, yc;
+ double xend;
+
+ radius = MIN (width, height) / (2.0 * PANGO_SCALE);
+ xc = crenderer->x_offset + (double)x / PANGO_SCALE + radius;
+ yc = crenderer->y_offset + (double)y / PANGO_SCALE + radius;
+ xend = xc + (double)width / PANGO_SCALE;
+
+ while (xc + radius <= xend)
+ {
+ cairo_new_sub_path (crenderer->cr);
+ cairo_arc (crenderer->cr, xc, yc, radius, 0, 2 * M_PI);
+ cairo_close_path (crenderer->cr);
+ xc += 3 * radius;
+ }
+ }
+ break;
+
+ case PANGO_RENDER_LINE_DASHED:
+ {
+ double xr, yr;
+ double w, h;
+ double d;
+ double xend;
+
+ xr = crenderer->x_offset + (double)x / PANGO_SCALE;
+ yr = crenderer->y_offset + (double)y / PANGO_SCALE;
+ xend = xr + (double)width / PANGO_SCALE;
+
+ h = MIN (width, height) / (double) PANGO_SCALE;
+ w = 5 * h;
+ d = 9 * h;
+
+ while (xr <= xend)
+ {
+ cairo_rectangle (crenderer->cr, xr, yr, MIN (w, xend - xr), h);
+ xr += d;
+ }
+ }
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ if (!crenderer->do_path)
+ {
+ cairo_fill (crenderer->cr);
+ cairo_restore (crenderer->cr);
+ }
+}
+
+static void
pango_cairo_renderer_init (PangoCairoRenderer *renderer G_GNUC_UNUSED)
{
}
@@ -824,6 +907,7 @@ pango_cairo_renderer_class_init (PangoCairoRendererClass *klass)
renderer_class->draw_trapezoid = pango_cairo_renderer_draw_trapezoid;
renderer_class->draw_error_underline = pango_cairo_renderer_draw_error_underline;
renderer_class->draw_shape = pango_cairo_renderer_draw_shape;
+ renderer_class->draw_line = pango_cairo_renderer_draw_line;
}
static PangoCairoRenderer *cached_renderer = NULL; /* MT-safe */