summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2021-09-30 17:08:29 -0400
committerMatthias Clasen <mclasen@redhat.com>2021-09-30 17:10:47 -0400
commite1704d198b8c1320c5d608d83971c354d9bd9da1 (patch)
tree1b26218e65b368d71f74b05dc3fd943be97b696f
parent20967565edabb728b3826ff1501a8081d6e322ad (diff)
downloadpango-fix-jumping-empty-lines.tar.gz
pangocairo: Round font metrics when appropriatefix-jumping-empty-lines
When metrics hinting is on, we used to provide rounded font metrics. We should keep doing that since otherwise we end up with logical rects sometimes being rounded and sometimes not, leading to jumping empty lines. Test included. Fixes: #421
-rw-r--r--pango/pangocairo-fcfont.c14
-rw-r--r--tests/testmisc.c41
2 files changed, 54 insertions, 1 deletions
diff --git a/pango/pangocairo-fcfont.c b/pango/pangocairo-fcfont.c
index 0019f83a..85cc45c8 100644
--- a/pango/pangocairo-fcfont.c
+++ b/pango/pangocairo-fcfont.c
@@ -76,8 +76,20 @@ pango_cairo_fc_font_create_base_metrics_for_context (PangoCairoFont *cfont,
PangoContext *context)
{
PangoFcFont *fcfont = (PangoFcFont *) (cfont);
+ PangoFontMetrics *metrics;
+ const cairo_font_options_t *options;
- return pango_fc_font_create_base_metrics_for_context (fcfont, context);
+ metrics = pango_fc_font_create_base_metrics_for_context (fcfont, context);
+
+ options = pango_cairo_context_get_font_options (context);
+ if (cairo_font_options_get_hint_metrics (options) == CAIRO_HINT_METRICS_ON)
+ {
+ metrics->ascent = PANGO_PIXELS_CEIL (metrics->ascent) * PANGO_SCALE;
+ metrics->descent = PANGO_PIXELS_CEIL (metrics->descent) * PANGO_SCALE;
+ metrics->height = PANGO_PIXELS_CEIL (metrics->height) * PANGO_SCALE;
+ }
+
+ return metrics;
}
static void
diff --git a/tests/testmisc.c b/tests/testmisc.c
index 60694134..cf64e00f 100644
--- a/tests/testmisc.c
+++ b/tests/testmisc.c
@@ -489,6 +489,46 @@ test_extents (void)
g_object_unref (context);
}
+static void
+test_empty_line_height (void)
+{
+ PangoContext *context;
+ PangoLayout *layout;
+ PangoRectangle ext1, ext2, ext3;
+ cairo_font_options_t *options;
+ int hint;
+
+ context = pango_font_map_create_context (pango_cairo_font_map_get_default ());
+
+ for (hint = CAIRO_HINT_METRICS_OFF; hint <= CAIRO_HINT_METRICS_ON; hint++)
+ {
+ options = cairo_font_options_create ();
+ cairo_font_options_set_hint_metrics (options, hint);
+ pango_cairo_context_set_font_options (context, options);
+ cairo_font_options_destroy (options);
+
+ layout = pango_layout_new (context);
+
+ pango_layout_get_extents (layout, NULL, &ext1);
+
+ pango_layout_set_text (layout, "a", 1);
+
+ pango_layout_get_extents (layout, NULL, &ext2);
+
+ g_assert_cmpint (ext1.height, ==, ext2.height);
+
+ pango_layout_set_text (layout, "Pg", 1);
+
+ pango_layout_get_extents (layout, NULL, &ext3);
+
+ g_assert_cmpint (ext2.height, ==, ext3.height);
+
+ g_object_unref (layout);
+ }
+
+ g_object_unref (context);
+}
+
int
main (int argc, char *argv[])
{
@@ -514,6 +554,7 @@ main (int argc, char *argv[])
g_test_add_func ("/bidi/get-cursor", test_get_cursor);
g_test_add_func ("/layout/index-to-x", test_index_to_x);
g_test_add_func ("/layout/extents", test_extents);
+ g_test_add_func ("/layout/empty-line-height", test_empty_line_height);
return g_test_run ();
}