summaryrefslogtreecommitdiff
path: root/pango/pango-layout.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-10-19 14:16:59 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-10-19 16:49:53 -0400
commit81fb35bbe96478a55c37ada1a47c842f7a650c73 (patch)
treee0b7fddd8894aaf2340d989b0167a96e88a0977a /pango/pango-layout.c
parente76ee94bb87dcd6ff808a777e0d251b318620eee (diff)
downloadpango-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.c46
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;
}