Index: src/ports/SkFontHost_FreeType.cpp |
diff --git a/src/ports/SkFontHost_FreeType.cpp b/src/ports/SkFontHost_FreeType.cpp |
index cb7ce8028dccd4e92d81b1e8ce63fc3b08c4b438..fce8259a39ce40e8affbd1b5ec1189ddf338555d 100644 |
--- a/src/ports/SkFontHost_FreeType.cpp |
+++ b/src/ports/SkFontHost_FreeType.cpp |
@@ -1390,6 +1390,7 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
// pull from format-specific metrics as needed |
SkScalar ascent, descent, leading, xmin, xmax, ymin, ymax; |
+ SkScalar underlineThickness, underlinePosition; |
if (face->face_flags & FT_FACE_FLAG_SCALABLE) { // scalable outline font |
ascent = -SkIntToScalar(face->ascender) / upem; |
descent = -SkIntToScalar(face->descender) / upem; |
@@ -1398,6 +1399,17 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
xmax = SkIntToScalar(face->bbox.xMax) / upem; |
ymin = -SkIntToScalar(face->bbox.yMin) / upem; |
ymax = -SkIntToScalar(face->bbox.yMax) / upem; |
+ underlineThickness = SkIntToScalar(face->underline_thickness) / upem; |
+ underlinePosition = -SkIntToScalar(face->underline_position) / upem; |
+ |
+ if(mx) { |
+ mx->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; |
+ mx->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
+ } |
+ if(my){ |
+ my->fFlags |= SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; |
+ my->fFlags |= SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
+ } |
// we may be able to synthesize x_height and cap_height from outline |
if (!x_height) { |
FT_BBox bbox; |
@@ -1422,6 +1434,17 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
xmax = SkIntToScalar(face->available_sizes[fStrikeIndex].width) / xppem; |
ymin = descent + leading; |
ymax = ascent - descent; |
+ underlineThickness = 0; |
+ underlinePosition = 0; |
+ |
+ if(mx) { |
+ mx->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; |
+ mx->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
+ } |
+ if(my){ |
+ my->fFlags &= ~SkPaint::FontMetrics::kUnderlineThinknessIsValid_Flag; |
+ my->fFlags &= ~SkPaint::FontMetrics::kUnderlinePositionIsValid_Flag; |
+ } |
} else { |
goto ERROR; |
} |
@@ -1453,6 +1476,8 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
mx->fXMax = xmax; |
mx->fXHeight = x_height; |
mx->fCapHeight = cap_height; |
+ mx->fUnderlineThickness = underlineThickness; |
+ mx->fUnderlinePosition = underlinePosition; |
} |
if (my) { |
my->fTop = ymax * myy; |
@@ -1465,6 +1490,8 @@ void SkScalerContext_FreeType::generateFontMetrics(SkPaint::FontMetrics* mx, |
my->fXMax = xmax; |
my->fXHeight = x_height; |
my->fCapHeight = cap_height; |
+ my->fUnderlineThickness = underlineThickness; |
+ my->fUnderlinePosition = underlinePosition; |
} |
} |