From a8e3d34ea91d80b5032ae0029cdcd7e97f83da7f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 30 Nov 2007 04:29:58 +0000 Subject: =?UTF-8?q?Bug=20485536=20=E2=80=93=20underline=5Fposition=20can?= =?UTF-8?q?=20be=20zero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 2007-11-29 Behdad Esfahbod Bug 485536 – underline_position can be zero * pango/pango-utils.c (pango_cairo_quantize_line_geometry): Document that returned position may be zero. * pango/pangocairo-win32font.c (pango_cairo_win32_font_create_metrics_for_context): * pango/pangofc-font.c (get_face_metrics): Handle case of underline_position==0 after rounding. svn path=/trunk/; revision=2506 --- pango/opentype/harfbuzz-impl.c | 2 ++ pango/pango-utils.c | 3 +++ pango/pangocairo-win32font.c | 3 +++ pango/pangofc-font.c | 42 +++++++++++++++++++++++++++--------------- 4 files changed, 35 insertions(+), 15 deletions(-) (limited to 'pango') diff --git a/pango/opentype/harfbuzz-impl.c b/pango/opentype/harfbuzz-impl.c index 79b837de..4ba70ed4 100644 --- a/pango/opentype/harfbuzz-impl.c +++ b/pango/opentype/harfbuzz-impl.c @@ -65,5 +65,7 @@ _hb_free( HB_Pointer block ) HB_INTERNAL HB_Error _hb_err (HB_Error code) { + static int numerr = 0; + numerr++; return code; } diff --git a/pango/pango-utils.c b/pango/pango-utils.c index 51d8fd01..1776ab9f 100644 --- a/pango/pango-utils.c +++ b/pango/pango-utils.c @@ -1593,6 +1593,9 @@ pango_is_zero_width (gunichar ch) * multiples of %PANGO_SCALE. The purpose of this function is to avoid * such lines looking blurry. * + * Care is taken to make sure @thickness is at least 1 when this function + * returns, but returned @position may become zero as a result of rounding. + * * Since: 1.12 */ void diff --git a/pango/pangocairo-win32font.c b/pango/pangocairo-win32font.c index af4e1d07..d01e6f0b 100644 --- a/pango/pangocairo-win32font.c +++ b/pango/pangocairo-win32font.c @@ -140,6 +140,9 @@ pango_cairo_win32_font_create_metrics_for_context (PangoCairoFont *font, &metrics->underline_position); pango_quantize_line_geometry (&metrics->strikethrough_thickness, &metrics->strikethrough_position); + /* Quantizing may have pushed underline_position to 0. Not good */ + if (metrics->underline_position == 0) + metrics->underline_position = - metrics->underline_thickness; layout = pango_layout_new (context); font_desc = pango_font_describe_with_absolute_size ((PangoFont *) font); diff --git a/pango/pangofc-font.c b/pango/pangofc-font.c index d2c395ff..bd185bd8 100644 --- a/pango/pangofc-font.c +++ b/pango/pangofc-font.c @@ -304,7 +304,7 @@ get_face_metrics (PangoFcFont *fcfont, TT_OS2 *os2; gboolean have_transform = FALSE; - if (!face) + if (G_UNLIKELY (!face)) { metrics->descent = 0; metrics->ascent = PANGO_SCALE * PANGO_UNKNOWN_GLYPH_HEIGHT; @@ -358,27 +358,32 @@ get_face_metrics (PangoFcFont *fcfont, metrics->ascent = PANGO_UNITS_26_6 (ascender); } - /* Versions of FreeType < 2.1.8 get underline thickness wrong - * for Postscript fonts (always zero), so we need a fallback - */ - if (face->underline_thickness == 0) + + metrics->underline_thickness = 0; + metrics->underline_position = 0; + + { + FT_Fixed ft_thickness, ft_position; + + ft_thickness = FT_MulFix (face->underline_thickness, face->size->metrics.y_scale); + metrics->underline_thickness = PANGO_UNITS_26_6 (ft_thickness); + + ft_position = FT_MulFix (face->underline_position, face->size->metrics.y_scale); + metrics->underline_position = PANGO_UNITS_26_6 (ft_position); + } + + if (metrics->underline_thickness == 0 || metrics->underline_position == 0) { metrics->underline_thickness = (PANGO_SCALE * face->size->metrics.y_ppem) / 14; metrics->underline_position = - metrics->underline_thickness; } - else - { - FT_Fixed ft_thickness, ft_position; - ft_thickness = FT_MulFix (face->underline_thickness, face->size->metrics.y_scale); - metrics->underline_thickness = PANGO_UNITS_26_6 (ft_thickness); - ft_position = FT_MulFix (face->underline_position, face->size->metrics.y_scale); - metrics->underline_position = PANGO_UNITS_26_6 (ft_position); - } + metrics->strikethrough_thickness = 0; + metrics->strikethrough_position = 0; os2 = FT_Get_Sfnt_Table (face, ft_sfnt_os2); - if (os2 && os2->version != 0xFFFF && os2->yStrikeoutSize != 0) + if (os2 && os2->version != 0xFFFF) { FT_Fixed ft_thickness, ft_position; @@ -388,12 +393,14 @@ get_face_metrics (PangoFcFont *fcfont, ft_position = FT_MulFix (os2->yStrikeoutPosition, face->size->metrics.y_scale); metrics->strikethrough_position = PANGO_UNITS_26_6 (ft_position); } - else + + if (metrics->strikethrough_thickness == 0 || metrics->strikethrough_position == 0) { metrics->strikethrough_thickness = metrics->underline_thickness; metrics->strikethrough_position = (PANGO_SCALE * face->size->metrics.y_ppem) / 4; } + /* If hinting is on for this font, quantize the underline and strikethrough position * to integer values. */ @@ -403,8 +410,13 @@ get_face_metrics (PangoFcFont *fcfont, &metrics->underline_position); pango_quantize_line_geometry (&metrics->strikethrough_thickness, &metrics->strikethrough_position); + + /* Quantizing may have pushed underline_position to 0. Not good */ + if (metrics->underline_position == 0) + metrics->underline_position = - metrics->underline_thickness; } + PANGO_FC_FONT_UNLOCK_FACE (fcfont); } -- cgit v1.2.1