summaryrefslogtreecommitdiff
path: root/pango/pangofc-font.c
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@gnome.org>2007-11-30 04:29:58 +0000
committerBehdad Esfahbod <behdad@src.gnome.org>2007-11-30 04:29:58 +0000
commita8e3d34ea91d80b5032ae0029cdcd7e97f83da7f (patch)
tree97d0dfb5c0017e44c1b596da1ef954d12a24f863 /pango/pangofc-font.c
parentf802d542d6c1ab729cabd90a9c72891f1c2c8ee8 (diff)
downloadpango-a8e3d34ea91d80b5032ae0029cdcd7e97f83da7f.tar.gz
Bug 485536 – underline_position can be zero
2007-11-29 Behdad Esfahbod <behdad@gnome.org> 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
Diffstat (limited to 'pango/pangofc-font.c')
-rw-r--r--pango/pangofc-font.c42
1 files changed, 27 insertions, 15 deletions
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);
}