diff options
Diffstat (limited to 'pango/pango-layout.c')
-rw-r--r-- | pango/pango-layout.c | 68 |
1 files changed, 51 insertions, 17 deletions
diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 74799ddc..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) @@ -5122,6 +5122,8 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, PangoFont *font; PangoFontDescription *font_desc = NULL; gboolean free_font_desc = FALSE; + double line_height_factor = 0.0; + int absolute_line_height = 0; font_desc = pango_context_get_font_description (layout->context); @@ -5147,6 +5149,8 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, if (start <= index && index < end) { + PangoAttribute *attr; + if (!free_font_desc) { font_desc = pango_font_description_copy_static (font_desc); @@ -5158,6 +5162,14 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, NULL, NULL); + attr = pango_attr_iterator_get (&iter, PANGO_ATTR_LINE_HEIGHT); + if (attr) + line_height_factor = ((PangoAttrFloat *)attr)->value; + + attr = pango_attr_iterator_get (&iter, PANGO_ATTR_ABSOLUTE_LINE_HEIGHT); + if (attr) + absolute_line_height = ((PangoAttrInt *)attr)->value; + break; } @@ -5183,6 +5195,18 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, *height = pango_font_metrics_get_height (metrics); pango_font_metrics_unref (metrics); + + if (apply_line_height && + (absolute_line_height != 0 || line_height_factor != 0.0)) + { + int line_height, leading; + + line_height = MAX (absolute_line_height, ceilf (line_height_factor * logical_rect->height)); + + leading = line_height - logical_rect->height; + logical_rect->y -= leading / 2; + logical_rect->height += leading; + } } else { @@ -5206,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, @@ -5347,6 +5363,7 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, int line_height, leading; line_height = MAX (properties.absolute_line_height, ceilf (properties.line_height * line_logical->height)); + leading = line_height - line_logical->height; line_logical->y -= leading / 2; line_logical->height += leading; @@ -5479,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) @@ -7341,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_iter_get_line_extents (iter, ink_rect, logical_rect); + pango_layout_get_empty_extents_and_height_at_index (iter->layout, 0, &r, FALSE, NULL); + + 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; } |