diff options
author | Matthias Clasen <mclasen@redhat.com> | 2021-12-10 12:49:45 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2021-12-19 10:40:34 -0500 |
commit | 704662e39856e308ef1683be607d62db0b738708 (patch) | |
tree | 438fd00eba4b44afd4cf81b6618eb68624d43e88 /pango | |
parent | 6770050e74cf83830e255f1d1e9b574feb5a60fc (diff) | |
download | pango-704662e39856e308ef1683be607d62db0b738708.tar.gz |
Fix line height with emulated small capsfix-small-caps-line-height
When we change font scale for emulating small caps,
keep the original font around in the analysis, and use
it for calculating the run height.
Fixes: #622
Diffstat (limited to 'pango')
-rw-r--r-- | pango/itemize.c | 17 | ||||
-rw-r--r-- | pango/pango-item.c | 6 | ||||
-rw-r--r-- | pango/pango-item.h | 4 | ||||
-rw-r--r-- | pango/pango-layout.c | 27 |
4 files changed, 40 insertions, 14 deletions
diff --git a/pango/itemize.c b/pango/itemize.c index 6c07e4c2..6380c12f 100644 --- a/pango/itemize.c +++ b/pango/itemize.c @@ -1045,7 +1045,8 @@ collect_font_scale (PangoContext *context, GList **stack, PangoItem *item, PangoItem *prev, - double *scale) + double *scale, + gboolean *is_small_caps) { gboolean retval = FALSE; GList *l; @@ -1123,11 +1124,14 @@ collect_font_scale (PangoContext *context, } *scale = 1.0; + *is_small_caps = TRUE; for (l = *stack; l; l = l->next) { ScaleItem *entry = l->data; *scale *= entry->scale; + if (((PangoAttrInt *)entry->attr)->value != PANGO_FONT_SCALE_SMALL_CAPS) + *is_small_caps = FALSE; retval = TRUE; } @@ -1152,11 +1156,15 @@ collect_font_scale (PangoContext *context, static void apply_scale_to_item (PangoContext *context, PangoItem *item, - double scale) + double scale, + gboolean is_small_caps) { PangoFontDescription *desc; double size; + if (is_small_caps) + pango_analysis_set_size_font (&item->analysis, item->analysis.font); + desc = pango_font_describe (item->analysis.font); size = scale * pango_font_description_get_size (desc); @@ -1182,9 +1190,10 @@ apply_font_scale (PangoContext *context, { PangoItem *item = l->data; double scale; + gboolean is_small_caps; - if (collect_font_scale (context, &stack, item, prev, &scale)) - apply_scale_to_item (context, item, scale); + if (collect_font_scale (context, &stack, item, prev, &scale, &is_small_caps)) + apply_scale_to_item (context, item, scale, is_small_caps); prev = item; } diff --git a/pango/pango-item.c b/pango/pango-item.c index d7291a08..c599241f 100644 --- a/pango/pango-item.c +++ b/pango/pango-item.c @@ -68,6 +68,9 @@ pango_item_copy (PangoItem *item) ((PangoItemPrivate *)result)->char_offset = ((PangoItemPrivate *)item)->char_offset; result->analysis = item->analysis; + if (result->analysis.lang_engine) + g_object_ref (result->analysis.lang_engine); + if (result->analysis.font) g_object_ref (result->analysis.font); @@ -102,6 +105,9 @@ pango_item_free (PangoItem *item) g_slist_free (item->analysis.extra_attrs); } + if (item->analysis.lang_engine) + g_object_unref (item->analysis.lang_engine); + if (item->analysis.font) g_object_unref (item->analysis.font); diff --git a/pango/pango-item.h b/pango/pango-item.h index 8122be19..f0eebc01 100644 --- a/pango/pango-item.h +++ b/pango/pango-item.h @@ -61,8 +61,8 @@ typedef struct _PangoItem PangoItem; /** * PangoAnalysis: - * @shape_engine: unused - * @lang_engine: unused + * @shape_engine: unused, reserved + * @lang_engine: unused, reserved * @font: the font for this segment. * @level: the bidirectional level for this segment. * @gravity: the glyph orientation for this segment (A `PangoGravity`). diff --git a/pango/pango-layout.c b/pango/pango-layout.c index 3f11d5b0..24a1a88b 100644 --- a/pango/pango-layout.c +++ b/pango/pango-layout.c @@ -5518,10 +5518,7 @@ pango_layout_get_empty_extents_and_height_at_index (PangoLayout *layout, free_font_desc = TRUE; } - pango_attr_iterator_get_font (&iter, - font_desc, - NULL, - NULL); + pango_attr_iterator_get_font (&iter, font_desc, NULL, NULL); attr = pango_attr_iterator_get (&iter, PANGO_ATTR_LINE_HEIGHT); if (attr) @@ -5689,11 +5686,25 @@ pango_layout_run_get_extents_and_height (PangoLayoutRun *run, if (height) { - if (!metrics) - metrics = pango_font_get_metrics (run->item->analysis.font, - run->item->analysis.language); + if (pango_analysis_get_size_font (&run->item->analysis)) + { + PangoFontMetrics *height_metrics; + + height_metrics = pango_font_get_metrics (pango_analysis_get_size_font (&run->item->analysis), + run->item->analysis.language); + + *height = pango_font_metrics_get_height (height_metrics); - *height = pango_font_metrics_get_height (metrics); + pango_font_metrics_unref (height_metrics); + } + else + { + if (!metrics) + metrics = pango_font_get_metrics (run->item->analysis.font, + run->item->analysis.language); + + *height = pango_font_metrics_get_height (metrics); + } } y_offset = run->y_offset; |