diff options
author | Matthias Clasen <mclasen@redhat.com> | 2022-02-07 02:36:19 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2022-02-13 14:28:05 -0600 |
commit | 086586622c11ebf3d3fd54d26a6779248e7cbc40 (patch) | |
tree | 8f11360c638dbd5ec428fa8e6b1ea9ca52f06bfd /pango/pango-renderer.c | |
parent | 3bd01215723f0c0de9339418c5de762d476b79a4 (diff) | |
download | pango-086586622c11ebf3d3fd54d26a6779248e7cbc40.tar.gz |
More work on line styles
Diffstat (limited to 'pango/pango-renderer.c')
-rw-r--r-- | pango/pango-renderer.c | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/pango/pango-renderer.c b/pango/pango-renderer.c index 9fb10a42..6f6f2c73 100644 --- a/pango/pango-renderer.c +++ b/pango/pango-renderer.c @@ -49,7 +49,7 @@ struct _LineState PangoRectangle strikethrough_rect; int strikethrough_glyphs; - PangoOverline overline; + PangoLineStyle overline; PangoRectangle overline_rect; int logical_rect_end; @@ -63,7 +63,6 @@ struct _PangoRendererPrivate PangoLayoutLine *line; LineState *line_state; - PangoOverline overline; }; static void pango_renderer_finalize (GObject *gobject); @@ -234,6 +233,8 @@ draw_underline (PangoRenderer *renderer, rect->height); G_GNUC_FALLTHROUGH; case PANGO_LINE_STYLE_SINGLE: + case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_DASHED: pango_renderer_draw_rectangle (renderer, PANGO_RENDER_PART_UNDERLINE, rect->x, @@ -241,7 +242,7 @@ draw_underline (PangoRenderer *renderer, rect->width, rect->height); break; - case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_WAVY: pango_renderer_draw_error_underline (renderer, rect->x, rect->y, @@ -258,15 +259,26 @@ draw_overline (PangoRenderer *renderer, LineState *state) { PangoRectangle *rect = &state->overline_rect; - PangoOverline overline = state->overline; + PangoLineStyle overline = state->overline; - state->overline = PANGO_OVERLINE_NONE; + state->overline = PANGO_LINE_STYLE_NONE; switch (overline) { - case PANGO_OVERLINE_NONE: + case PANGO_LINE_STYLE_NONE: break; - case PANGO_OVERLINE_SINGLE: + case PANGO_LINE_STYLE_DOUBLE: + pango_renderer_draw_rectangle (renderer, + PANGO_RENDER_PART_OVERLINE, + rect->x, + rect->y - 2 * rect->height, + rect->width, + rect->height); + G_GNUC_FALLTHROUGH; + case PANGO_LINE_STYLE_SINGLE: + case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_DASHED: + case PANGO_LINE_STYLE_WAVY: pango_renderer_draw_rectangle (renderer, PANGO_RENDER_PART_OVERLINE, rect->x, @@ -305,6 +317,8 @@ draw_strikethrough (PangoRenderer *renderer, G_GNUC_FALLTHROUGH; case PANGO_LINE_STYLE_SINGLE: case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_DASHED: + case PANGO_LINE_STYLE_WAVY: pango_renderer_draw_rectangle (renderer, PANGO_RENDER_PART_STRIKETHROUGH, rect->x, @@ -347,13 +361,13 @@ handle_line_state_change (PangoRenderer *renderer, } if (part == PANGO_RENDER_PART_OVERLINE && - state->overline != PANGO_OVERLINE_NONE) + state->overline != PANGO_LINE_STYLE_NONE) { PangoRectangle *rect = &state->overline_rect; rect->width = state->logical_rect_end - rect->x; draw_overline (renderer, state); - state->overline = renderer->priv->overline; + state->overline = renderer->overline; rect->x = state->logical_rect_end; rect->width = 0; } @@ -395,6 +409,8 @@ add_underline (PangoRenderer *renderer, g_assert_not_reached (); break; case PANGO_LINE_STYLE_SINGLE: + case PANGO_LINE_STYLE_DASHED: + case PANGO_LINE_STYLE_DOTTED: if (renderer->underline_position == PANGO_UNDERLINE_POSITION_UNDER) { new_rect.y += ink_rect->y + ink_rect->height + underline_thickness; @@ -402,7 +418,7 @@ add_underline (PangoRenderer *renderer, } G_GNUC_FALLTHROUGH; case PANGO_LINE_STYLE_DOUBLE: - case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_WAVY: new_rect.y -= underline_position; if (state->underline == renderer->underline) { @@ -452,14 +468,18 @@ add_overline (PangoRenderer *renderer, new_rect.height = underline_thickness; new_rect.y = base_y; - switch (renderer->priv->overline) + switch (renderer->overline) { - case PANGO_OVERLINE_NONE: + case PANGO_LINE_STYLE_NONE: g_assert_not_reached (); break; - case PANGO_OVERLINE_SINGLE: + case PANGO_LINE_STYLE_SINGLE: + case PANGO_LINE_STYLE_DOUBLE: + case PANGO_LINE_STYLE_DASHED: + case PANGO_LINE_STYLE_DOTTED: + case PANGO_LINE_STYLE_WAVY: new_rect.y -= ascent; - if (state->overline == renderer->priv->overline) + if (state->overline == renderer->overline) { new_rect.y = MIN (current_rect->y, new_rect.y); new_rect.height = MAX (current_rect->height, new_rect.height); @@ -471,7 +491,7 @@ add_overline (PangoRenderer *renderer, break; } - if (renderer->priv->overline == state->overline && + if (renderer->overline == state->overline && new_rect.y == current_rect->y && new_rect.height == current_rect->height) { @@ -482,7 +502,7 @@ add_overline (PangoRenderer *renderer, draw_overline (renderer, state); *current_rect = new_rect; - state->overline = renderer->priv->overline; + state->overline = renderer->overline; } } @@ -574,7 +594,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, state.underline = PANGO_LINE_STYLE_NONE; state.underline_position = PANGO_UNDERLINE_POSITION_NORMAL; - state.overline = PANGO_OVERLINE_NONE; + state.overline = PANGO_LINE_STYLE_NONE; state.strikethrough = PANGO_LINE_STYLE_NONE; text = G_LIKELY (line->layout) ? pango_layout_get_text (line->layout) : NULL; @@ -593,7 +613,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, pango_renderer_prepare_run (renderer, run); if (renderer->underline != PANGO_LINE_STYLE_NONE || - renderer->priv->overline != PANGO_OVERLINE_NONE || + renderer->overline != PANGO_LINE_STYLE_NONE || renderer->strikethrough != PANGO_LINE_STYLE_NONE) { ink = &ink_rect; @@ -646,7 +666,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, x + x_off, y - y_off); if (renderer->underline != PANGO_LINE_STYLE_NONE || - renderer->priv->overline != PANGO_OVERLINE_NONE || + renderer->overline != PANGO_LINE_STYLE_NONE || renderer->strikethrough != PANGO_LINE_STYLE_NONE) { metrics = pango_font_get_metrics (run->item->analysis.font, @@ -657,7 +677,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, x + x_off, y - y_off, ink, logical); - if (renderer->priv->overline != PANGO_OVERLINE_NONE) + if (renderer->overline != PANGO_LINE_STYLE_NONE) add_overline (renderer, &state,metrics, x + x_off, y - y_off, ink, logical); @@ -674,8 +694,8 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, state.underline != PANGO_LINE_STYLE_NONE) draw_underline (renderer, &state); - if (renderer->priv->overline == PANGO_OVERLINE_NONE && - state.overline != PANGO_OVERLINE_NONE) + if (renderer->overline == PANGO_LINE_STYLE_NONE && + state.overline != PANGO_LINE_STYLE_NONE) draw_overline (renderer, &state); if (renderer->strikethrough == PANGO_LINE_STYLE_NONE && @@ -1431,7 +1451,7 @@ pango_renderer_default_prepare_run (PangoRenderer *renderer, renderer->underline = PANGO_LINE_STYLE_NONE; renderer->underline_position = PANGO_UNDERLINE_POSITION_NORMAL; - renderer->priv->overline = PANGO_OVERLINE_NONE; + renderer->overline = PANGO_LINE_STYLE_NONE; renderer->strikethrough = PANGO_LINE_STYLE_NONE; for (l = run->item->analysis.extra_attrs; l; l = l->next) @@ -1449,7 +1469,7 @@ pango_renderer_default_prepare_run (PangoRenderer *renderer, break; case PANGO_ATTR_OVERLINE: - renderer->priv->overline = attr->int_value; + renderer->overline = attr->int_value; break; case PANGO_ATTR_STRIKETHROUGH: |