diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-10-19 14:16:59 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-10-19 16:49:53 -0400 |
commit | 81fb35bbe96478a55c37ada1a47c842f7a650c73 (patch) | |
tree | e0b7fddd8894aaf2340d989b0167a96e88a0977a /pango/pango-layout.c | |
parent | e76ee94bb87dcd6ff808a777e0d251b318620eee (diff) | |
download | pango-81fb35bbe96478a55c37ada1a47c842f7a650c73.tar.gz |
Fix cursor pos height in some cases
For empty runs, we were sometimes using line height,
which may be scaled up by the line-height attribute.
Fix that.
Diffstat (limited to 'pango/pango-layout.c')
-rw-r--r-- | pango/pango-layout.c | 46 |
1 files changed, 28 insertions, 18 deletions
diff --git a/pango/pango-layout.c b/pango/pango-layout.c index ff2b2fba..6e761f2c 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -193,6 +193,7 @@ static void pango_layout_get_item_properties (PangoItem *item, static void pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, int index, PangoRectangle *logical_rect, + gboolean apply_line_height, int *height); static void pango_layout_finalize (GObject *object); @@ -1908,17 +1909,15 @@ pango_layout_index_to_line_and_extents (PangoLayout *layout, { if (run_rect) { - *run_rect = *line_rect; - while (TRUE) { PangoLayoutRun *run = _pango_layout_iter_get_run (&iter); - if (!run) - break; - pango_layout_iter_get_run_extents (&iter, NULL, run_rect); + if (!run) + break; + if (run->item->offset <= index && index < run->item->offset + run->item->length) break; @@ -4482,7 +4481,7 @@ pango_layout_check_lines (PangoLayout *layout) { PangoRectangle logical = { 0, }; int height = 0; - pango_layout_get_empty_extents_and_height_at_index (layout, 0, &logical, &height); + pango_layout_get_empty_extents_and_height_at_index (layout, 0, &logical, TRUE, &height); state.line_height = layout->line_spacing == 0.0 ? logical.height : layout->line_spacing * height; } @@ -5115,6 +5114,7 @@ static void pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, int index, PangoRectangle *logical_rect, + gboolean apply_line_height, int *height) { if (logical_rect) @@ -5196,7 +5196,8 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, pango_font_metrics_unref (metrics); - if (absolute_line_height != 0 || line_height_factor != 0.0) + if (apply_line_height && + (absolute_line_height != 0 || line_height_factor != 0.0)) { int line_height, leading; @@ -5229,14 +5230,6 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, } static void -pango_layout_line_get_empty_extents_and_height (PangoLayoutLine *line, - PangoRectangle *logical_rect, - int *height) -{ - pango_layout_get_empty_extents_and_height_at_index (line->layout, line->start_index, logical_rect, height); -} - -static void pango_layout_run_get_extents_and_height (PangoLayoutRun *run, PangoRectangle *run_ink, PangoRectangle *run_logical, @@ -5503,7 +5496,7 @@ pango_layout_line_get_extents_and_height (PangoLayoutLine *line, PangoRectangle r, *rect; rect = logical_rect ? logical_rect : &r; - pango_layout_line_get_empty_extents_and_height (line, rect, height); + pango_layout_get_empty_extents_and_height_at_index (line->layout, line->start_index, rect, TRUE, height); } if (caching) @@ -7365,18 +7358,35 @@ pango_layout_iter_get_run_extents (PangoLayoutIter *iter, } else { - /* The empty run at the end of a line */ + if (iter->line->runs) + { + /* The empty run at the end of a non-empty line */ + PangoLayoutRun *run = g_slist_last (iter->line->runs)->data; + pango_layout_run_get_extents_and_height (run, ink_rect, logical_rect, NULL, NULL); + } + else + { + PangoRectangle r; + + pango_layout_get_empty_extents_and_height_at_index (iter->layout, 0, &r, FALSE, NULL); - pango_layout_iter_get_line_extents (iter, ink_rect, logical_rect); + if (ink_rect) + *ink_rect = r; + + if (logical_rect) + *logical_rect = r; + } if (ink_rect) { + offset_y (iter, &ink_rect->y); ink_rect->x = iter->run_x; ink_rect->width = 0; } if (logical_rect) { + offset_y (iter, &logical_rect->y); logical_rect->x = iter->run_x; logical_rect->width = 0; } |