diff options
author | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2023-10-26 14:02:48 +0300 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2023-12-09 04:46:24 +0200 |
commit | d420c1e25a0fb3b25ba4c572f2938701ce8494ec (patch) | |
tree | 91dfc17727b5cf98d5375c809a280feadbfbaaca /tests | |
parent | 5fb2d50e42e1046bf43d876e0caf92c14d914661 (diff) |
print: QPageLayout: Fix pt unit conversion
This patch corrects the miscalculation in point unit conversion,
ensuring correct margin updates.
Previously, non-pt units were rounded to two decimal places. When
converting back to pt, rounding was to zero decimals, making the result
always less than the original. This could result in margins falling
below the minimum allowed.
Example:
original_points = 8.4
multiplier = 2.83464566929
mm: qRound(8.4 / multiplier * 100) / 100 = 2.96
new_points: qRound(2.96 * multiplier) = 8 // wrong!
The fix rounds back-converted values up to two decimals, ensuring they
are never less than the original and thus stay above minimum margins.
new_points: qCeil(2.96 * multiplier * 100) / 100 = 8.4
Also, remove unused function qt_convertPoint.
Pick-to: 6.6
Change-Id: I6109f8d381aec96db1ce04cc167f7b73c1c0b9a8
Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'tests')
-rw-r--r-- | tests/auto/gui/painting/qpagelayout/tst_qpagelayout.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/tests/auto/gui/painting/qpagelayout/tst_qpagelayout.cpp b/tests/auto/gui/painting/qpagelayout/tst_qpagelayout.cpp index 123663a0e3..dbfdab2ac4 100644 --- a/tests/auto/gui/painting/qpagelayout/tst_qpagelayout.cpp +++ b/tests/auto/gui/painting/qpagelayout/tst_qpagelayout.cpp @@ -12,6 +12,8 @@ private slots: void invalid(); void basics(); void setGetMargins(); + void setUnits_data(); + void setUnits(); }; void tst_QPageLayout::invalid() @@ -238,6 +240,54 @@ void tst_QPageLayout::setGetMargins() QCOMPARE(fullPage.maximumMargins(), max); } +void tst_QPageLayout::setUnits_data() +{ + QTest::addColumn<QPageLayout::Unit>("units"); + QTest::newRow("Millimeter") << QPageLayout::Millimeter; + QTest::newRow("Point") << QPageLayout::Point; + QTest::newRow("Inch") << QPageLayout::Inch; + QTest::newRow("Pica") << QPageLayout::Pica; + QTest::newRow("Didot") << QPageLayout::Didot; + QTest::newRow("Cicero") << QPageLayout::Cicero; +} + +void tst_QPageLayout::setUnits() +{ + QFETCH(QPageLayout::Unit, units); + QPageLayout pageLayout = QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, QMarginsF(), units); + int maxLeftX100 = qFloor(pageLayout.maximumMargins().left() * 100); + QVERIFY(maxLeftX100 > 0); + for (int i = 1; i <= maxLeftX100; ++i) { + const qreal margin = i / 100.; + const QMarginsF unitsMargins = QMarginsF(margin, margin, margin, margin); + pageLayout.setMargins(unitsMargins); + pageLayout.setUnits(QPageLayout::Point); + const QMarginsF pointsMargins = pageLayout.margins(); + if (units == QPageLayout::Point) { + QCOMPARE(pointsMargins, unitsMargins); + } else { + QCOMPARE_GT(pointsMargins.left(), unitsMargins.left()); + QCOMPARE_GT(pointsMargins.top(), unitsMargins.top()); + QCOMPARE_GT(pointsMargins.right(), unitsMargins.right()); + QCOMPARE_GT(pointsMargins.bottom(), unitsMargins.bottom()); + } + pageLayout.setUnits(units); + const QMarginsF convertedUnitsMargins = pageLayout.margins(); + if (units == QPageLayout::Didot) { + // When using Didot units, the small multiplier and ceiling function in conversion + // may cause the converted units to not match the original exactly. However, we + // can verify that the converted margins are always greater than or equal to the + // original. + QCOMPARE_GE(convertedUnitsMargins.left(), unitsMargins.left()); + QCOMPARE_GE(convertedUnitsMargins.top(), unitsMargins.top()); + QCOMPARE_GE(convertedUnitsMargins.right(), unitsMargins.right()); + QCOMPARE_GE(convertedUnitsMargins.bottom(), unitsMargins.bottom()); + } else { + QCOMPARE(convertedUnitsMargins, unitsMargins); + } + } +} + QTEST_APPLESS_MAIN(tst_QPageLayout) #include "tst_qpagelayout.moc" |