summaryrefslogtreecommitdiff
path: root/pango/pango-renderer.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2022-02-07 02:36:19 -0500
committerMatthias Clasen <mclasen@redhat.com>2022-02-13 14:28:05 -0600
commit086586622c11ebf3d3fd54d26a6779248e7cbc40 (patch)
tree8f11360c638dbd5ec428fa8e6b1ea9ca52f06bfd /pango/pango-renderer.c
parent3bd01215723f0c0de9339418c5de762d476b79a4 (diff)
downloadpango-086586622c11ebf3d3fd54d26a6779248e7cbc40.tar.gz
More work on line styles
Diffstat (limited to 'pango/pango-renderer.c')
-rw-r--r--pango/pango-renderer.c68
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: