Bug 1406552 - Only update max ascent / descent with em ones when ascent and descent are zero. r?jfkthame
The original code was added in
bug 385263 for fixing
bug 279032 that a
single font provides zero for max ascent / descent in its HHEA table
which caused Firefox to crash.
Unconditionally picking the maximum of max ascent / descent and their
em correspondents doesn't seem to be essential for working around that
case, so this patch changes it to just use the em ascent / descent when
both max ascent and descent are zero.
This fixes a webcompat problem related to Roboto font on Linux (and
presumably also Android given it uses FreeType backend as well).
MozReview-Commit-ID: EpKrfiOwnZt
--- a/gfx/thebes/gfxFT2FontBase.cpp
+++ b/gfx/thebes/gfxFT2FontBase.cpp
@@ -312,28 +312,24 @@ gfxFT2FontBase::InitMetrics()
mMetrics.emDescent = -os2->sTypoDescender * yScale;
FT_Short typoHeight =
os2->sTypoAscender - os2->sTypoDescender + os2->sTypoLineGap;
lineHeight = typoHeight * yScale;
// If the OS/2 fsSelection USE_TYPO_METRICS bit is set,
// set maxAscent/Descent from the sTypo* fields instead of hhea.
const uint16_t kUseTypoMetricsMask = 1 << 7;
- if (os2->fsSelection & kUseTypoMetricsMask) {
- mMetrics.maxAscent = NS_round(mMetrics.emAscent);
- mMetrics.maxDescent = NS_round(mMetrics.emDescent);
- } else {
+ if ((os2->fsSelection & kUseTypoMetricsMask) ||
// maxAscent/maxDescent get used for frame heights, and some fonts
// don't have the HHEA table ascent/descent set (bug 279032).
+ (mMetrics.maxAscent == 0.0 && mMetrics.maxDescent == 0.0)) {
// We use NS_round here to parallel the pixel-rounded values that
// freetype gives us for ftMetrics.ascender/descender.
- mMetrics.maxAscent =
- std::max(mMetrics.maxAscent, NS_round(mMetrics.emAscent));
- mMetrics.maxDescent =
- std::max(mMetrics.maxDescent, NS_round(mMetrics.emDescent));
+ mMetrics.maxAscent = NS_round(mMetrics.emAscent);
+ mMetrics.maxDescent = NS_round(mMetrics.emDescent);
}
} else {
mMetrics.emAscent = mMetrics.maxAscent;
mMetrics.emDescent = mMetrics.maxDescent;
}
// gfxFont::Metrics::underlineOffset is the position of the top of the
// underline.
--- a/layout/reftests/font-face/reftest.list
+++ b/layout/reftests/font-face/reftest.list
@@ -124,17 +124,17 @@ load 486974-1.html
!= 507960-1-bad-sfnt-version-woff.html 507960-1-ref.html
!= 507960-1-bad-woff-sig.html 507960-1-ref.html
!= 507960-1-bad-offset-woff.html 507960-1-ref.html
!= 507960-1-woff-bad-hint.html 507960-1-ref.html
# Tests for bug 523717
== underline-offset-change-1.html underline-offset-change-1-ref.html
== underline-offset-change-2.html underline-offset-change-2-ref.html
-fails-if(cocoaWidget||winWidget) != underline-offset-change-1-ref.html underline-offset-change-2-ref.html # Bug 534132
+fails != underline-offset-change-1-ref.html underline-offset-change-2-ref.html # Bug 534132
!= 534352-1-extra-cmap-sentinel.html 534352-1-extra-cmap-sentinel-ref.html
== bug533251.html bug533251-ref.html
# Bug 875287
== font-familiy-whitespace-1.html font-familiy-whitespace-1-ref.html
!= font-familiy-whitespace-1.html font-familiy-whitespace-1-notref.html
deleted file mode 100644
--- a/testing/web-platform/meta/css/CSS2/margin-padding-clear/padding-em-inherit-001.xht.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[padding-em-inherit-001.xht]
- expected: FAIL