diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-03-30 20:08:29 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-03-30 21:20:36 -0400 |
commit | 5ce5b8f5b7dc4616d0d88454a23dd3bd89902265 (patch) | |
tree | 734cdc5b8fa64a09f5311c14f63cf1bb2dcfc1a4 /pango/pangocairo-render.c | |
parent | 708e7d1be90ccf92c17473a78218e7f43f059309 (diff) | |
download | pango-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.c | 84 |
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 */ |