Bug 832313 Part 1: Change GetNormalLineHeight() when under the eCompensateLeading preference to better compensate for fonts with erratic leading metrics. r?jfkthame
MozReview-Commit-ID: ARzr6iDsiRH
--- a/layout/generic/ReflowInput.cpp
+++ b/layout/generic/ReflowInput.cpp
@@ -2709,23 +2709,28 @@ GetNormalLineHeight(nsFontMetrics* aFont
nscoord normalLineHeight;
nscoord externalLeading = aFontMetrics->ExternalLeading();
nscoord internalLeading = aFontMetrics->InternalLeading();
nscoord emHeight = aFontMetrics->EmHeight();
switch (GetNormalLineHeightCalcControl()) {
case eIncludeExternalLeading:
- normalLineHeight = emHeight+ internalLeading + externalLeading;
+ normalLineHeight = emHeight + internalLeading + externalLeading;
break;
case eCompensateLeading:
- if (!internalLeading && !externalLeading)
- normalLineHeight = NSToCoordRound(emHeight * NORMAL_LINE_HEIGHT_FACTOR);
- else
- normalLineHeight = emHeight+ internalLeading + externalLeading;
+ // Use the maximum of the available font metrics, or a calculated value
+ // based on the em height, rounded to device coordinates/pixels.
+ normalLineHeight = std::max(
+ emHeight + internalLeading + externalLeading,
+ NSIntPixelsToAppUnits(
+ NSToIntRound((emHeight * NORMAL_LINE_HEIGHT_FACTOR)
+ / (float)aFontMetrics->AppUnitsPerDevPixel()),
+ aFontMetrics->AppUnitsPerDevPixel()
+ ));
break;
default:
//case eNoExternalLeading:
normalLineHeight = emHeight + internalLeading;
}
return normalLineHeight;
}