diff options
author | Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@theqtcompany.com> | 2015-11-25 13:47:27 +0100 |
---|---|---|
committer | Konstantin Ritt <ritt.ks@gmail.com> | 2015-11-25 19:53:46 +0000 |
commit | 50cd0daf29d434b78cc70bbf732ee33b2bc18600 (patch) | |
tree | e2683bddf4ed9edb0846a9967c6b6de5f0b6a223 /tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | |
parent | 0325842b9926f87f22beb3b8dda32c20b2f994ec (diff) |
Fix kerned advances in QRawFont on OS X and Windows
On Windows, the wrong value was used to calculate the
design-to-device scale. The assumption has been that tmHeight
in the TEXTMETRIC is the pixel size of the em square, but
it is not, it's the height of the font (ascent + descent).
The pixel size of the font is defined to be the em square size
in pixels.
On OS X, the kerning data was never actually read from the
font. I've added a lazy initialization for this similar to
the one in the FT engine.
This was discovered when investigating QTBUG-48546, as it turned
out that the kerning information extracted by Qt in this case was
different from the one used by Harfbuzz.
I've changed testfont.ttf to kern "_2" so that the digit is positioned
directly on top of the underscore and constructed a test.
[ChangeLog][QRawFont] Fixed kerning on advances in QRawFont for
OS X and Windows.
Change-Id: Ic9a321ad119ea880cef89b861c75a820ab8d3182
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Diffstat (limited to 'tests/auto/gui/text/qrawfont/tst_qrawfont.cpp')
-rw-r--r-- | tests/auto/gui/text/qrawfont/tst_qrawfont.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp index c12acf65cc..b1e292f094 100644 --- a/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp +++ b/tests/auto/gui/text/qrawfont/tst_qrawfont.cpp @@ -93,6 +93,8 @@ private slots: void multipleRawFontsFromData(); void rawFontFromInvalidData(); + + void kernedAdvances(); private: QString testFont; QString testFontBoldItalic; @@ -954,6 +956,38 @@ void tst_QRawFont::rawFontFromInvalidData() QVERIFY(!font.isValid()); } +#define FUZZY_LTEQ(X, Y) (X < Y || qFuzzyCompare(X, Y)) + +void tst_QRawFont::kernedAdvances() +{ + const int emSquareSize = 1000; + const qreal pixelSize = 16.0; + const int underScoreAW = 500; + const int underscoreTwoKerning = -500; + const qreal errorMargin = 1.0 / 16.0; // Fixed point error margin + + QRawFont font(testFont, pixelSize); + QVERIFY(font.isValid()); + + QVector<quint32> glyphIndexes = font.glyphIndexesForString(QStringLiteral("__")); + QCOMPARE(glyphIndexes.size(), 2); + + QVector<QPointF> advances = font.advancesForGlyphIndexes(glyphIndexes, QRawFont::KernedAdvances); + QCOMPARE(advances.size(), 2); + + qreal expectedAdvanceWidth = pixelSize * underScoreAW / emSquareSize; + QVERIFY(FUZZY_LTEQ(qAbs(advances.at(0).x() - expectedAdvanceWidth), errorMargin)); + + glyphIndexes = font.glyphIndexesForString(QStringLiteral("_2")); + QCOMPARE(glyphIndexes.size(), 2); + + advances = font.advancesForGlyphIndexes(glyphIndexes, QRawFont::KernedAdvances); + QCOMPARE(advances.size(), 2); + + expectedAdvanceWidth = pixelSize * (underScoreAW + underscoreTwoKerning) / emSquareSize; + QVERIFY(FUZZY_LTEQ(qAbs(advances.at(0).x() - expectedAdvanceWidth), errorMargin)); +} + #endif // QT_NO_RAWFONT QTEST_MAIN(tst_QRawFont) |