Make tst_QTextLayout::textWidthVsWIdth() more robust

Some fonts misreport the minimum right bearing, and in those cases
we may not be able to do a perfect text layout inside the bounds
set. This is a limitation we have chosen to accept.

To avoid random failure when testing this, we detect the case and
skip the test if we see that it may fail.

Fixes: QTBUG-84415
Pick-to: 5.15
Change-Id: I6b53ea2631c5c6e476e2902b5514829a2141796f
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Eskil Abrahamsen Blomfeldt 2020-05-26 08:11:06 +02:00
parent bc380b242d
commit 4e5d686a87

View File

@ -2016,6 +2016,21 @@ void tst_QTextLayout::textWidthVsWIdth()
// minimum right bearing reported by the font engine doesn't cover all the glyphs in the font.
// The result is that this test may fail in some cases. We should fix this by running the test
// with a font that we know have no suprising right bearings. See qtextlayout.cpp for details.
QFontMetricsF fontMetrics(layout.font());
QSet<char16_t> checked;
qreal minimumRightBearing = 0.0;
for (int i = 0; i < layout.text().size(); ++i) {
QChar c = layout.text().at(i);
if (!checked.contains(c.unicode())) {
qreal rightBearing = fontMetrics.rightBearing(c);
if (rightBearing < minimumRightBearing)
minimumRightBearing = rightBearing;
checked.insert(c.unicode());
}
}
if (minimumRightBearing < fontMetrics.minRightBearing())
QSKIP("Font reports invalid minimum right bearing, and can't be used for this test.");
for (int width = 100; width < 1000; ++width) {
layout.beginLayout();
QTextLine line = layout.createLine();