<rdar://problem/9084761> REGRESSION (r73993): Default Arabic line spacing has gotten...
[WebKit-https.git] / Source / WebCore / platform / graphics / mac / SimpleFontDataMac.mm
index 7e1b9d3c43f1f2051281b4cc789c66ad3d771ef3..f34d53bc369d1fb2b57fbbff3a9128481a4827c5 100644 (file)
@@ -241,6 +241,7 @@ void SimpleFontData::platformInit()
     NSString *familyName = [m_platformData.font() familyName];
     if ([familyName isEqualToString:@"Times"] || [familyName isEqualToString:@"Helvetica"] || [familyName isEqualToString:@"Courier"])
         ascent += floorf(((ascent + descent) * 0.15f) + 0.5f);
+#if defined(BUILDING_ON_LEOPARD)
     else if ([familyName isEqualToString:@"Geeza Pro"]) {
         // Geeza Pro has glyphs that draw slightly above the ascent or far below the descent. Adjust
         // those vertical metrics to better match reality, so that diacritics at the bottom of one line
@@ -248,6 +249,7 @@ void SimpleFontData::platformInit()
         ascent *= 1.08f;
         descent *= 2.f;
     }
+#endif
 
     // Compute and store line spacing, before the line metrics hacks are applied.
     m_fontMetrics.setLineSpacing(lroundf(ascent) + lroundf(descent) + lroundf(lineGap));
@@ -274,26 +276,15 @@ void SimpleFontData::platformInit()
 
     float xHeight;
 
-    // Measure the actual character "x", since it's possible for it to extend below the baseline, and we need the
-    // reported x-height to only include the portion of the glyph that is above the baseline.
     if (platformData().orientation() == Horizontal) {
+        // Measure the actual character "x", since it's possible for it to extend below the baseline, and we need the
+        // reported x-height to only include the portion of the glyph that is above the baseline.
         GlyphPage* glyphPageZero = GlyphPageTreeNode::getRootChild(this, 0)->page();
         NSGlyph xGlyph = glyphPageZero ? glyphPageZero->glyphDataForCharacter('x').glyph : 0;
-        if (xGlyph) {
-            CGRect xBox = platformBoundsForGlyph(xGlyph);
-            // Use the maximum of either width or height because "x" is nearly square
-            // and web pages that foolishly use this metric for width will be laid out
-            // poorly if we return an accurate height. Classic case is Times 13 point,
-            // which has an "x" that is 7x6 pixels.
-            xHeight = max(CGRectGetMaxX(xBox), -CGRectGetMinY(xBox));
-        } else {
-            xHeight = static_cast<float>(CGFontGetXHeight(m_platformData.cgFont())) / unitsPerEm;
-            // CGFontGetXHeight() returns a wrong value for "Apple Symbols" font (a float close to 0, but not strictly 0).
-            // The following code makes a guess for xHeight in that case.
-            // The int cast is a workaround for the "almost" zero value returned by CGFontGetXHeight().
-            if (!static_cast<int>(xHeight) && ascent)
-                xHeight = 2 * ascent / 3;
-        }
+        if (xGlyph)
+            xHeight = -CGRectGetMinY(platformBoundsForGlyph(xGlyph));
+        else
+            xHeight = scaleEmToUnits(CGFontGetXHeight(m_platformData.cgFont()), unitsPerEm) * pointSize;
     } else
         xHeight = verticalRightOrientationFontData()->fontMetrics().xHeight();