From ac1e87d9f373ad649d989f254b37d2f29ddf25fe Mon Sep 17 00:00:00 2001 From: Konstantin Tokarev Date: Wed, 3 Aug 2016 15:45:02 +0300 Subject: [PATCH] Added capHeight() to QRawFont and QFontMetrics(F) Cap height is an important metric of font, in particular it is required to make decent implementation of "initial-letter" CSS property in QtWebKit. Note that some fonts lack cap height metadata, so we need to fall back to measuring H letter height. Change-Id: Icf69d92159d070889085e20d31f2e397d796d940 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/gui/text/qfontengine.cpp | 15 +++++ src/gui/text/qfontengine_ft.cpp | 13 ++++ src/gui/text/qfontengine_ft_p.h | 1 + src/gui/text/qfontengine_p.h | 4 ++ src/gui/text/qfontengine_qpf2.cpp | 5 ++ src/gui/text/qfontengine_qpf2_p.h | 1 + src/gui/text/qfontmetrics.cpp | 36 +++++++++++ src/gui/text/qfontmetrics.h | 2 + src/gui/text/qrawfont.cpp | 17 ++++++ src/gui/text/qrawfont.h | 1 + .../fontdatabases/mac/qfontengine_coretext.mm | 13 ++++ .../mac/qfontengine_coretext_p.h | 1 + .../platforms/windows/qwindowsfontengine.cpp | 57 ++++++++++++++++++ .../platforms/windows/qwindowsfontengine.h | 1 + .../windows/qwindowsfontenginedirectwrite.cpp | 12 ++++ .../windows/qwindowsfontenginedirectwrite.h | 2 + tests/auto/gui/text/qrawfont/testdata.qrc | 1 + .../gui/text/qrawfont/testfont_os2_v1.ttf | Bin 0 -> 72960 bytes tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | 30 ++++++++- 19 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 tests/auto/gui/text/qrawfont/testfont_os2_v1.ttf diff --git a/src/gui/text/qfontengine.cpp b/src/gui/text/qfontengine.cpp index adc8f634dc1..dbd47151bd3 100644 --- a/src/gui/text/qfontengine.cpp +++ b/src/gui/text/qfontengine.cpp @@ -418,6 +418,13 @@ glyph_metrics_t QFontEngine::boundingBox(glyph_t glyph, const QTransform &matrix return metrics; } +QFixed QFontEngine::calculatedCapHeight() const +{ + const glyph_t glyph = glyphIndex('H'); + glyph_metrics_t bb = const_cast(this)->boundingBox(glyph); + return bb.height; +} + QFixed QFontEngine::xHeight() const { const glyph_t glyph = glyphIndex('x'); @@ -1703,6 +1710,11 @@ QFixed QFontEngineBox::ascent() const return _size; } +QFixed QFontEngineBox::capHeight() const +{ + return _size; +} + QFixed QFontEngineBox::descent() const { return 0; @@ -2163,6 +2175,9 @@ glyph_metrics_t QFontEngineMulti::boundingBox(glyph_t glyph) QFixed QFontEngineMulti::ascent() const { return engine(0)->ascent(); } +QFixed QFontEngineMulti::capHeight() const +{ return engine(0)->capHeight(); } + QFixed QFontEngineMulti::descent() const { return engine(0)->descent(); } diff --git a/src/gui/text/qfontengine_ft.cpp b/src/gui/text/qfontengine_ft.cpp index 51b1418bc3e..b79fa6e9db5 100644 --- a/src/gui/text/qfontengine_ft.cpp +++ b/src/gui/text/qfontengine_ft.cpp @@ -414,6 +414,7 @@ QFontEngine::Properties QFreetypeFace::properties() const p.italicAngle = 0; p.capHeight = p.ascent; p.lineWidth = face->underline_thickness; + return p; } @@ -1299,6 +1300,18 @@ QFixed QFontEngineFT::ascent() const return v; } +QFixed QFontEngineFT::capHeight() const +{ + TT_OS2 *os2 = (TT_OS2 *)FT_Get_Sfnt_Table(freetype->face, ft_sfnt_os2); + if (os2 && os2->version >= 2) { + lockFace(); + QFixed answer = QFixed::fromFixed(FT_MulFix(os2->sCapHeight, freetype->face->size->metrics.y_scale)); + unlockFace(); + return answer; + } + return calculatedCapHeight(); +} + QFixed QFontEngineFT::descent() const { QFixed v = QFixed::fromFixed(-metrics.descender); diff --git a/src/gui/text/qfontengine_ft_p.h b/src/gui/text/qfontengine_ft_p.h index 3cdf0cda477..5ca3721c711 100644 --- a/src/gui/text/qfontengine_ft_p.h +++ b/src/gui/text/qfontengine_ft_p.h @@ -209,6 +209,7 @@ private: int synthesized() const Q_DECL_OVERRIDE; QFixed ascent() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; QFixed descent() const Q_DECL_OVERRIDE; QFixed leading() const Q_DECL_OVERRIDE; QFixed xHeight() const Q_DECL_OVERRIDE; diff --git a/src/gui/text/qfontengine_p.h b/src/gui/text/qfontengine_p.h index f3eeddab411..69331cb0bb7 100644 --- a/src/gui/text/qfontengine_p.h +++ b/src/gui/text/qfontengine_p.h @@ -211,6 +211,7 @@ public: glyph_metrics_t tightBoundingBox(const QGlyphLayout &glyphs); virtual QFixed ascent() const = 0; + virtual QFixed capHeight() const = 0; virtual QFixed descent() const = 0; virtual QFixed leading() const = 0; virtual QFixed xHeight() const; @@ -348,6 +349,7 @@ protected: QFixed lastRightBearing(const QGlyphLayout &glyphs, bool round = false); inline void setUserData(const QVariant &userData) { m_userData = userData; } + QFixed calculatedCapHeight() const; private: struct GlyphCacheEntry { @@ -414,6 +416,7 @@ public: virtual QFontEngine *cloneWithSize(qreal pixelSize) const Q_DECL_OVERRIDE; virtual QFixed ascent() const Q_DECL_OVERRIDE; + virtual QFixed capHeight() const Q_DECL_OVERRIDE; virtual QFixed descent() const Q_DECL_OVERRIDE; virtual QFixed leading() const Q_DECL_OVERRIDE; virtual qreal maxCharWidth() const Q_DECL_OVERRIDE; @@ -451,6 +454,7 @@ public: virtual void getGlyphBearings(glyph_t glyph, qreal *leftBearing = 0, qreal *rightBearing = 0) Q_DECL_OVERRIDE; virtual QFixed ascent() const Q_DECL_OVERRIDE; + virtual QFixed capHeight() const Q_DECL_OVERRIDE; virtual QFixed descent() const Q_DECL_OVERRIDE; virtual QFixed leading() const Q_DECL_OVERRIDE; virtual QFixed xHeight() const Q_DECL_OVERRIDE; diff --git a/src/gui/text/qfontengine_qpf2.cpp b/src/gui/text/qfontengine_qpf2.cpp index 2e4af09550c..110d512d39e 100644 --- a/src/gui/text/qfontengine_qpf2.cpp +++ b/src/gui/text/qfontengine_qpf2.cpp @@ -459,6 +459,11 @@ QFixed QFontEngineQPF2::ascent() const return QFixed::fromReal(extractHeaderField(fontData, Tag_Ascent).value()); } +QFixed QFontEngineQPF2::capHeight() const +{ + return calculatedCapHeight(); +} + QFixed QFontEngineQPF2::descent() const { return QFixed::fromReal(extractHeaderField(fontData, Tag_Descent).value()); diff --git a/src/gui/text/qfontengine_qpf2_p.h b/src/gui/text/qfontengine_qpf2_p.h index 50aac245c11..e5c38ffbaf3 100644 --- a/src/gui/text/qfontengine_qpf2_p.h +++ b/src/gui/text/qfontengine_qpf2_p.h @@ -172,6 +172,7 @@ public: glyph_metrics_t boundingBox(glyph_t glyph) Q_DECL_OVERRIDE; QFixed ascent() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; QFixed descent() const Q_DECL_OVERRIDE; QFixed leading() const Q_DECL_OVERRIDE; qreal maxCharWidth() const Q_DECL_OVERRIDE; diff --git a/src/gui/text/qfontmetrics.cpp b/src/gui/text/qfontmetrics.cpp index 2189923b25a..aca59d02883 100644 --- a/src/gui/text/qfontmetrics.cpp +++ b/src/gui/text/qfontmetrics.cpp @@ -274,6 +274,24 @@ int QFontMetrics::ascent() const return qRound(engine->ascent()); } +/*! + Returns the cap height of the font. + + \since 5.8 + + The cap height of a font is the height of a capital letter above + the baseline. It specifically is the height of capital letters + that are flat - such as H or I - as opposed to round letters such + as O, or pointed letters like A, both of which may display overshoot. + + \sa ascent() +*/ +int QFontMetrics::capHeight() const +{ + QFontEngine *engine = d->engineForScript(QChar::Script_Common); + Q_ASSERT(engine != 0); + return qRound(engine->capHeight()); +} /*! Returns the descent of the font. @@ -1138,6 +1156,24 @@ qreal QFontMetricsF::ascent() const return engine->ascent().toReal(); } +/*! + Returns the cap height of the font. + + \since 5.8 + + The cap height of a font is the height of a capital letter above + the baseline. It specifically is the height of capital letters + that are flat - such as H or I - as opposed to round letters such + as O, or pointed letters like A, both of which may display overshoot. + + \sa ascent() +*/ +qreal QFontMetricsF::capHeight() const +{ + QFontEngine *engine = d->engineForScript(QChar::Script_Common); + Q_ASSERT(engine != 0); + return engine->capHeight().toReal(); +} /*! Returns the descent of the font. diff --git a/src/gui/text/qfontmetrics.h b/src/gui/text/qfontmetrics.h index 22e51f29f70..3eac309092b 100644 --- a/src/gui/text/qfontmetrics.h +++ b/src/gui/text/qfontmetrics.h @@ -73,6 +73,7 @@ public: { qSwap(d, other.d); } int ascent() const; + int capHeight() const; int descent() const; int height() const; int leading() const; @@ -146,6 +147,7 @@ public: void swap(QFontMetricsF &other) { qSwap(d, other.d); } qreal ascent() const; + qreal capHeight() const; qreal descent() const; qreal height() const; qreal leading() const; diff --git a/src/gui/text/qrawfont.cpp b/src/gui/text/qrawfont.cpp index 19ac4f1dbce..1fbe0ce9d16 100644 --- a/src/gui/text/qrawfont.cpp +++ b/src/gui/text/qrawfont.cpp @@ -324,6 +324,23 @@ qreal QRawFont::ascent() const return d->isValid() ? d->fontEngine->ascent().toReal() : 0.0; } +/*! + Returns the cap height of this QRawFont in pixel units. + + \since 5.8 + + The cap height of a font is the height of a capital letter above + the baseline. It specifically is the height of capital letters + that are flat - such as H or I - as opposed to round letters such + as O, or pointed letters like A, both of which may display overshoot. + + \sa QFontMetricsF::capHeight() +*/ +qreal QRawFont::capHeight() const +{ + return d->isValid() ? d->fontEngine->capHeight().toReal() : 0.0; +} + /*! Returns the descent of this QRawFont in pixel units. diff --git a/src/gui/text/qrawfont.h b/src/gui/text/qrawfont.h index 5791c6af164..0252e623709 100644 --- a/src/gui/text/qrawfont.h +++ b/src/gui/text/qrawfont.h @@ -118,6 +118,7 @@ public: QFont::HintingPreference hintingPreference() const; qreal ascent() const; + qreal capHeight() const; qreal descent() const; qreal leading() const; qreal xHeight() const; diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm index 339212db259..646212124bc 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext.mm @@ -378,6 +378,19 @@ QFixed QCoreTextFontEngine::ascent() const ? QFixed::fromReal(CTFontGetAscent(ctfont)).round() : QFixed::fromReal(CTFontGetAscent(ctfont)); } + +QFixed QCoreTextFontEngine::capHeight() const +{ + QFixed c = QFixed::fromReal(CTFontGetCapHeight(ctfont)); + if (c <= 0) + return calculatedCapHeight(); + + if (fontDef.styleStrategy & QFont::ForceIntegerMetrics) + c = c.round(); + + return c; +} + QFixed QCoreTextFontEngine::descent() const { QFixed d = QFixed::fromReal(CTFontGetDescent(ctfont)); diff --git a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h index b7c9edc5280..d9ffbb56974 100644 --- a/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h +++ b/src/platformsupport/fontdatabases/mac/qfontengine_coretext_p.h @@ -78,6 +78,7 @@ public: glyph_metrics_t boundingBox(glyph_t glyph) Q_DECL_OVERRIDE; QFixed ascent() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; QFixed descent() const Q_DECL_OVERRIDE; QFixed leading() const Q_DECL_OVERRIDE; QFixed xHeight() const Q_DECL_OVERRIDE; diff --git a/src/plugins/platforms/windows/qwindowsfontengine.cpp b/src/plugins/platforms/windows/qwindowsfontengine.cpp index 744d882bb21..12340182af3 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.cpp +++ b/src/plugins/platforms/windows/qwindowsfontengine.cpp @@ -192,6 +192,7 @@ void QWindowsFontEngine::getCMap() lineWidth = otm->otmsUnderscoreSize; fsType = otm->otmfsType; free(otm); + } else { unitsPerEm = tm.tmHeight; } @@ -540,6 +541,62 @@ QFixed QWindowsFontEngine::leading() const return tm.tmExternalLeading; } +namespace { +# pragma pack(1) + + struct OS2Table + { + quint16 version; + qint16 avgCharWidth; + quint16 weightClass; + quint16 widthClass; + quint16 type; + qint16 subscriptXSize; + qint16 subscriptYSize; + qint16 subscriptXOffset; + qint16 subscriptYOffset; + qint16 superscriptXSize; + qint16 superscriptYSize; + qint16 superscriptXOffset; + qint16 superscriptYOffset; + qint16 strikeOutSize; + qint16 strikeOutPosition; + qint16 familyClass; + quint8 panose[10]; + quint32 unicodeRanges[4]; + quint8 vendorID[4]; + quint16 selection; + quint16 firstCharIndex; + quint16 lastCharIndex; + qint16 typoAscender; + qint16 typoDescender; + qint16 typoLineGap; + quint16 winAscent; + quint16 winDescent; + quint32 codepageRanges[2]; + qint16 height; + qint16 capHeight; + quint16 defaultChar; + quint16 breakChar; + quint16 maxContext; + }; + +# pragma pack() +} + +QFixed QWindowsFontEngine::capHeight() const +{ + const QByteArray tableData = getSfntTable(MAKE_TAG('O', 'S', '/', '2')); + if (tableData.size() >= sizeof(OS2Table)) { + const OS2Table *table = reinterpret_cast(tableData.constData()); + if (qFromBigEndian(table->version) >= 2) { + qint16 capHeight = qFromBigEndian(table->capHeight); + if (capHeight > 0) + return QFixed(capHeight) / designToDevice; + } + } + return calculatedCapHeight(); +} QFixed QWindowsFontEngine::xHeight() const { diff --git a/src/plugins/platforms/windows/qwindowsfontengine.h b/src/plugins/platforms/windows/qwindowsfontengine.h index 921351a4b07..b63d8fd282d 100644 --- a/src/plugins/platforms/windows/qwindowsfontengine.h +++ b/src/plugins/platforms/windows/qwindowsfontengine.h @@ -103,6 +103,7 @@ public: QFixed descent() const Q_DECL_OVERRIDE; QFixed leading() const Q_DECL_OVERRIDE; QFixed xHeight() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; QFixed averageCharWidth() const Q_DECL_OVERRIDE; qreal maxCharWidth() const Q_DECL_OVERRIDE; qreal minLeftBearing() const Q_DECL_OVERRIDE; diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp index 5408ff41e5c..18be3b0ce65 100644 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp +++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.cpp @@ -208,6 +208,7 @@ QWindowsFontEngineDirectWrite::QWindowsFontEngineDirectWrite(IDWriteFontFace *di , m_lineThickness(-1) , m_unitsPerEm(-1) , m_ascent(-1) + , m_capHeight(-1) , m_descent(-1) , m_xHeight(-1) , m_lineGap(-1) @@ -244,6 +245,7 @@ void QWindowsFontEngineDirectWrite::collectMetrics() m_lineThickness = DESIGN_TO_LOGICAL(metrics.underlineThickness); m_ascent = DESIGN_TO_LOGICAL(metrics.ascent); + m_capHeight = DESIGN_TO_LOGICAL(metrics.capHeight); m_descent = DESIGN_TO_LOGICAL(metrics.descent); m_xHeight = DESIGN_TO_LOGICAL(metrics.xHeight); m_lineGap = DESIGN_TO_LOGICAL(metrics.lineGap); @@ -461,6 +463,16 @@ QFixed QWindowsFontEngineDirectWrite::ascent() const : m_ascent; } +QFixed QWindowsFontEngineDirectWrite::capHeight() const +{ + if (m_capHeight <= 0) + return calculatedCapHeight(); + + return fontDef.styleStrategy & QFont::ForceIntegerMetrics + ? m_capHeight.round() + : m_capHeight; +} + QFixed QWindowsFontEngineDirectWrite::descent() const { return fontDef.styleStrategy & QFont::ForceIntegerMetrics diff --git a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h index f038dcfde48..fb2df00b7ef 100644 --- a/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h +++ b/src/plugins/platforms/windows/qwindowsfontenginedirectwrite.h @@ -87,6 +87,7 @@ public: const QTransform &matrix, GlyphFormat) Q_DECL_OVERRIDE; QFixed ascent() const Q_DECL_OVERRIDE; + QFixed capHeight() const Q_DECL_OVERRIDE; QFixed descent() const Q_DECL_OVERRIDE; QFixed leading() const Q_DECL_OVERRIDE; QFixed xHeight() const Q_DECL_OVERRIDE; @@ -122,6 +123,7 @@ private: QFixed m_underlinePosition; int m_unitsPerEm; QFixed m_ascent; + QFixed m_capHeight; QFixed m_descent; QFixed m_xHeight; QFixed m_lineGap; diff --git a/tests/auto/gui/text/qrawfont/testdata.qrc b/tests/auto/gui/text/qrawfont/testdata.qrc index 8f8e32ed246..c7ac9641d14 100644 --- a/tests/auto/gui/text/qrawfont/testdata.qrc +++ b/tests/auto/gui/text/qrawfont/testdata.qrc @@ -1,6 +1,7 @@ testfont_bold_italic.ttf + testfont_os2_v1.ttf ../../../shared/resources/testfont.ttf diff --git a/tests/auto/gui/text/qrawfont/testfont_os2_v1.ttf b/tests/auto/gui/text/qrawfont/testfont_os2_v1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ee8b67d892869206eddd9c80c899f2833874838a GIT binary patch literal 72960 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%0Aq#$i-$hpcR1dk+}=w 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 HcclIUa(g3j literal 0 HcmV?d00001 diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp index 471b32dd50c..3cf108ed621 100644 --- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp +++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp @@ -93,6 +93,7 @@ private slots: private: QString testFont; QString testFontBoldItalic; + QString testFontOs2V1; #endif // QT_NO_RAWFONT }; @@ -110,6 +111,7 @@ void tst_QRawFont::initTestCase() { testFont = QFINDTESTDATA("testfont.ttf"); testFontBoldItalic = QFINDTESTDATA("testfont_bold_italic.ttf"); + testFontOs2V1 = QFINDTESTDATA("testfont_os2_v1.ttf"); if (testFont.isEmpty() || testFontBoldItalic.isEmpty()) QFAIL("qrawfont unittest font files not found!"); @@ -184,6 +186,7 @@ void tst_QRawFont::correctFontData_data() QTest::addColumn("hintingPreference"); QTest::addColumn("unitsPerEm"); QTest::addColumn("pixelSize"); + QTest::addColumn("capHeight"); int hintingPreferences[] = { int(QFont::PreferDefaultHinting), @@ -207,7 +210,8 @@ void tst_QRawFont::correctFontData_data() << QFont::Normal << QFont::HintingPreference(*hintingPreference) << qreal(1000.0) - << qreal(10.0); + << qreal(10.0) + << 7; fileName = testFontBoldItalic; title = fileName @@ -221,7 +225,23 @@ void tst_QRawFont::correctFontData_data() << QFont::Bold << QFont::HintingPreference(*hintingPreference) << qreal(1000.0) - << qreal(10.0); + << qreal(10.0) + << 7; + + fileName = testFontOs2V1; + title = fileName + + QLatin1String(": hintingPreference=") + + QString::number(*hintingPreference); + + QTest::newRow(qPrintable(title)) + << fileName + << QString::fromLatin1("QtBidiTestFont") + << QFont::StyleNormal + << QFont::Normal + << QFont::HintingPreference(*hintingPreference) + << qreal(1000.0) + << qreal(10.0) + << 7; ++hintingPreference; } @@ -236,6 +256,7 @@ void tst_QRawFont::correctFontData() QFETCH(QFont::HintingPreference, hintingPreference); QFETCH(qreal, unitsPerEm); QFETCH(qreal, pixelSize); + QFETCH(int, capHeight); QRawFont font(fileName, 10, hintingPreference); QVERIFY(font.isValid()); @@ -246,6 +267,11 @@ void tst_QRawFont::correctFontData() QCOMPARE(font.hintingPreference(), hintingPreference); QCOMPARE(font.unitsPerEm(), unitsPerEm); QCOMPARE(font.pixelSize(), pixelSize); + + // Some platforms return the actual fractional height of the + // H character when the value is missing from the OS/2 table, + // so we ceil it off to match (any touched pixel counts). + QCOMPARE(qCeil(font.capHeight()), capHeight); } void tst_QRawFont::glyphIndices()