diff options
-rw-r--r-- | pango/pango-types.h | 26 | ||||
-rw-r--r-- | pango/pangocairo-font.c | 8 | ||||
-rw-r--r-- | tests/testmisc.c | 38 |
3 files changed, 54 insertions, 18 deletions
diff --git a/pango/pango-types.h b/pango/pango-types.h index f18225ba..ed86f699 100644 --- a/pango/pango-types.h +++ b/pango/pango-types.h @@ -107,6 +107,32 @@ typedef guint32 PangoGlyph; */ /** + * PANGO_UNITS_FLOOR: + * @d: a dimension in Pango units. + * + * Rounds a dimension down to whole device units, but does not + * convert it to device units. + * + * Return value: rounded down dimension in Pango units. + * Since: 1.50 + */ +#define PANGO_UNITS_FLOOR(d) \ + ((d) & ~(PANGO_SCALE - 1)) + +/** + * PANGO_UNITS_CEIL: + * @d: a dimension in Pango units. + * + * Rounds a dimension up to whole device units, but does not + * convert it to device units. + * + * Return value: rounded up dimension in Pango units. + * Since: 1.50 + */ +#define PANGO_UNITS_CEIL(d) \ + (((d) + (PANGO_SCALE - 1)) & ~(PANGO_SCALE - 1)) + +/** * PANGO_UNITS_ROUND: * @d: a dimension in Pango units. * diff --git a/pango/pangocairo-font.c b/pango/pangocairo-font.c index 597a320d..c2bcc51b 100644 --- a/pango/pangocairo-font.c +++ b/pango/pangocairo-font.c @@ -817,13 +817,13 @@ _pango_cairo_font_private_glyph_extents_cache_init (PangoCairoFontPrivate *cf_pr if (cf_priv->is_hinted) { if (cf_priv->font_extents.y < 0) - cf_priv->font_extents.y = PANGO_UNITS_ROUND (cf_priv->font_extents.y - PANGO_SCALE/2); + cf_priv->font_extents.y = PANGO_UNITS_FLOOR (cf_priv->font_extents.y); else - cf_priv->font_extents.y = PANGO_UNITS_ROUND (cf_priv->font_extents.y + PANGO_SCALE/2); + cf_priv->font_extents.y = PANGO_UNITS_CEIL (cf_priv->font_extents.y); if (cf_priv->font_extents.height < 0) - cf_priv->font_extents.height = PANGO_UNITS_ROUND (cf_priv->font_extents.height - PANGO_SCALE/2); + cf_priv->font_extents.height = PANGO_UNITS_FLOOR (extents.ascender) - PANGO_UNITS_CEIL (extents.descender); else - cf_priv->font_extents.height = PANGO_UNITS_ROUND (cf_priv->font_extents.height + PANGO_SCALE/2); + cf_priv->font_extents.height = PANGO_UNITS_CEIL (extents.ascender) - PANGO_UNITS_FLOOR (extents.descender); } if (PANGO_GRAVITY_IS_IMPROPER (cf_priv->gravity)) diff --git a/tests/testmisc.c b/tests/testmisc.c index 555f0dce..1aa90948 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -634,9 +634,11 @@ test_empty_line_height (void) { PangoContext *context; PangoLayout *layout; + PangoFontDescription *description; PangoRectangle ext1, ext2, ext3; cairo_font_options_t *options; int hint; + int size; if (strcmp (G_OBJECT_TYPE_NAME (pango_cairo_font_map_get_default ()), "PangoCairoCoreTextFontMap") == 0) { @@ -645,33 +647,41 @@ test_empty_line_height (void) } context = pango_font_map_create_context (pango_cairo_font_map_get_default ()); + description = pango_font_description_new (); - for (hint = CAIRO_HINT_METRICS_OFF; hint <= CAIRO_HINT_METRICS_ON; hint++) + for (size = 10; size <= 20; size++) { - 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); + pango_font_description_set_size (description, size); - layout = pango_layout_new (context); + 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); - pango_layout_get_extents (layout, NULL, &ext1); + layout = pango_layout_new (context); + pango_layout_set_font_description (layout, description); - pango_layout_set_text (layout, "a", 1); + pango_layout_get_extents (layout, NULL, &ext1); - pango_layout_get_extents (layout, NULL, &ext2); + pango_layout_set_text (layout, "a", 1); - g_assert_cmpint (ext1.height, ==, ext2.height); + pango_layout_get_extents (layout, NULL, &ext2); - pango_layout_set_text (layout, "Pg", 1); + g_assert_cmpint (ext1.height, ==, ext2.height); - pango_layout_get_extents (layout, NULL, &ext3); + pango_layout_set_text (layout, "Pg", 1); - g_assert_cmpint (ext2.height, ==, ext3.height); + pango_layout_get_extents (layout, NULL, &ext3); - g_object_unref (layout); + g_assert_cmpint (ext2.height, ==, ext3.height); + + g_object_unref (layout); + } } + pango_font_description_free (description); g_object_unref (context); } |