Bug 832313 Part 1: Change GetNormalLineHeight() when under the eCompensateLeading preference to better compensate for fonts with erratic leading metrics. r?jfkthame draft
authorBrad Werth <bwerth@mozilla.com>
Tue, 25 Oct 2016 10:32:35 -0700
changeset 429824 52effd40245ce4677bb55cc3ff1d65afc65c0fd6
parent 429741 d26ac63f1b81c3fce35448a7c502e95e0b5c56c0
child 429825 caae3df0ec333cea98bba84c76f1c90a1c189456
push id33670
push userbwerth@mozilla.com
push dateWed, 26 Oct 2016 16:37:49 +0000
reviewersjfkthame
bugs832313
milestone52.0a1
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
layout/generic/ReflowInput.cpp
--- 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;
 }