diff options
Diffstat (limited to 'pango/pango-renderer.c')
-rw-r--r-- | pango/pango-renderer.c | 66 |
1 files changed, 46 insertions, 20 deletions
diff --git a/pango/pango-renderer.c b/pango/pango-renderer.c index a246bb73..9fb10a42 100644 --- a/pango/pango-renderer.c +++ b/pango/pango-renderer.c @@ -45,7 +45,7 @@ struct _LineState PangoUnderlinePosition underline_position; PangoRectangle underline_rect; - gboolean strikethrough; + PangoLineStyle strikethrough; PangoRectangle strikethrough_rect; int strikethrough_glyphs; @@ -284,17 +284,40 @@ draw_strikethrough (PangoRenderer *renderer, LineState *state) { PangoRectangle *rect = &state->strikethrough_rect; - int num_glyphs = state->strikethrough_glyphs; - if (state->strikethrough && num_glyphs > 0) - pango_renderer_draw_rectangle (renderer, - PANGO_RENDER_PART_STRIKETHROUGH, - rect->x, - rect->y / num_glyphs, - rect->width, - rect->height / num_glyphs); + if (state->strikethrough_glyphs > 0) + { + rect->y /= state->strikethrough_glyphs; + rect->height /= state->strikethrough_glyphs; + + switch (state->strikethrough) + { + case PANGO_LINE_STYLE_NONE: + break; + case PANGO_LINE_STYLE_DOUBLE: + pango_renderer_draw_rectangle (renderer, + PANGO_RENDER_PART_STRIKETHROUGH, + rect->x, + rect->y - rect->height, + rect->width, + rect->height); + rect->y += rect->height; + G_GNUC_FALLTHROUGH; + case PANGO_LINE_STYLE_SINGLE: + case PANGO_LINE_STYLE_DOTTED: + pango_renderer_draw_rectangle (renderer, + PANGO_RENDER_PART_STRIKETHROUGH, + rect->x, + rect->y, + rect->width, + rect->height); + break; + default: + break; + } + } - state->strikethrough = FALSE; + state->strikethrough = PANGO_LINE_STYLE_NONE; state->strikethrough_glyphs = 0; rect->x += rect->width; rect->width = 0; @@ -336,7 +359,7 @@ handle_line_state_change (PangoRenderer *renderer, } if (part == PANGO_RENDER_PART_STRIKETHROUGH && - state->strikethrough) + state->strikethrough != PANGO_LINE_STYLE_NONE) { PangoRectangle *rect = &state->strikethrough_rect; @@ -372,7 +395,7 @@ add_underline (PangoRenderer *renderer, g_assert_not_reached (); break; case PANGO_LINE_STYLE_SINGLE: - if (state->underline_position == PANGO_UNDERLINE_POSITION_UNDER) + if (renderer->underline_position == PANGO_UNDERLINE_POSITION_UNDER) { new_rect.y += ink_rect->y + ink_rect->height + underline_thickness; break; @@ -484,7 +507,7 @@ add_strikethrough (PangoRenderer *renderer, new_rect.y = (base_y - strikethrough_position) * num_glyphs; new_rect.height = strikethrough_thickness * num_glyphs; - if (state->strikethrough) + if (state->strikethrough == renderer->strikethrough) { current_rect->width = new_rect.x + new_rect.width - current_rect->x; current_rect->y += new_rect.y; @@ -493,8 +516,10 @@ add_strikethrough (PangoRenderer *renderer, } else { + draw_strikethrough (renderer, state); + *current_rect = new_rect; - state->strikethrough = TRUE; + state->strikethrough = renderer->strikethrough; state->strikethrough_glyphs = num_glyphs; } } @@ -550,7 +575,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.strikethrough = FALSE; + state.strikethrough = PANGO_LINE_STYLE_NONE; text = G_LIKELY (line->layout) ? pango_layout_get_text (line->layout) : NULL; @@ -569,7 +594,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, if (renderer->underline != PANGO_LINE_STYLE_NONE || renderer->priv->overline != PANGO_OVERLINE_NONE || - renderer->strikethrough) + renderer->strikethrough != PANGO_LINE_STYLE_NONE) { ink = &ink_rect; logical = &logical_rect; @@ -622,7 +647,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, if (renderer->underline != PANGO_LINE_STYLE_NONE || renderer->priv->overline != PANGO_OVERLINE_NONE || - renderer->strikethrough) + renderer->strikethrough != PANGO_LINE_STYLE_NONE) { metrics = pango_font_get_metrics (run->item->analysis.font, run->item->analysis.language); @@ -637,7 +662,7 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, x + x_off, y - y_off, ink, logical); - if (renderer->strikethrough) + if (renderer->strikethrough != PANGO_LINE_STYLE_NONE) add_strikethrough (renderer, &state, metrics, x + x_off, y - y_off, ink, logical, run->glyphs->num_glyphs); @@ -653,7 +678,8 @@ pango_renderer_draw_layout_line (PangoRenderer *renderer, state.overline != PANGO_OVERLINE_NONE) draw_overline (renderer, &state); - if (!renderer->strikethrough && state.strikethrough) + if (renderer->strikethrough == PANGO_LINE_STYLE_NONE && + state.strikethrough != PANGO_LINE_STYLE_NONE) draw_strikethrough (renderer, &state); x_off += glyph_string_width; @@ -1406,7 +1432,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->strikethrough = FALSE; + renderer->strikethrough = PANGO_LINE_STYLE_NONE; for (l = run->item->analysis.extra_attrs; l; l = l->next) { |