pagelayout: Fix inaccuracy in marginsPixels and paintRectPixels

Do not use rounded value for conversion, which gives inaccurate result.

Example case: typical margin for A4 paper size is 8.4 pt. At 600 dpi,
the old code was using rounded point value of 8, which produces an
incorrect result:

8 / (72.0 / 600) = 67 pixels

The correct margin is of course:

8.4 / (72.0 / 600) = 70 pixels

Change-Id: I44b2eeabb82fd3bf8e2dcfcba66ae96cde763875
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
(cherry picked from commit e28a664ae12e22a2cecbd669d3d8562c742eb4a2)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Jarkko Koivikko 2023-11-27 19:03:40 +02:00 committed by Qt Cherry-pick Bot
parent 0aaa84b714
commit 0025362dd1
2 changed files with 78 additions and 6 deletions

View File

@ -82,7 +82,7 @@ public:
void clampMargins(const QMarginsF &margins);
QMarginsF margins(QPageLayout::Unit units) const;
QMargins marginsPoints() const;
QMarginsF marginsPoints() const;
QMargins marginsPixels(int resolution) const;
void setDefaultMargins(const QMarginsF &minMargins);
@ -164,14 +164,14 @@ QMarginsF QPageLayoutPrivate::margins(QPageLayout::Unit units) const
return qt_convertMargins(m_margins, m_units, units);
}
QMargins QPageLayoutPrivate::marginsPoints() const
QMarginsF QPageLayoutPrivate::marginsPoints() const
{
return qt_convertMargins(m_margins, m_units, QPageLayout::Point).toMargins();
return qt_convertMargins(m_margins, m_units, QPageLayout::Point);
}
QMargins QPageLayoutPrivate::marginsPixels(int resolution) const
{
return marginsPoints() / qt_pixelMultiplier(resolution);
return QMarginsF(marginsPoints() / qt_pixelMultiplier(resolution)).toMargins();
}
void QPageLayoutPrivate::setDefaultMargins(const QMarginsF &minMargins)
@ -699,7 +699,7 @@ QMarginsF QPageLayout::margins(Unit units) const
QMargins QPageLayout::marginsPoints() const
{
return d->marginsPoints();
return d->marginsPoints().toMargins();
}
/*!
@ -866,7 +866,7 @@ QRect QPageLayout::paintRectPoints() const
if (!isValid())
return QRect();
return d->m_mode == FullPageMode ? d->fullRectPoints()
: d->fullRectPoints() - d->marginsPoints();
: d->fullRectPoints() - d->marginsPoints().toMargins();
}
/*!

View File

@ -90,12 +90,14 @@ void tst_QPageLayout::basics()
QCOMPARE(tenpoint.margins(QPageLayout::Millimeter), QMarginsF(3.53, 3.53, 3.53, 3.53));
QCOMPARE(tenpoint.marginsPoints(), QMargins(10, 10, 10, 10));
QCOMPARE(tenpoint.marginsPixels(72), QMargins(10, 10, 10, 10));
QCOMPARE(tenpoint.marginsPixels(600), QMargins(83, 83, 83, 83));
QCOMPARE(tenpoint.minimumMargins(), QMarginsF(0, 0, 0, 0));
QCOMPARE(tenpoint.maximumMargins(), QMarginsF(595, 842, 595, 842));
QCOMPARE(tenpoint.fullRect(), QRectF(0, 0, 595, 842));
QCOMPARE(tenpoint.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 210, 297));
QCOMPARE(tenpoint.fullRectPoints(), QRect(0, 0, 595, 842));
QCOMPARE(tenpoint.fullRectPixels(72), QRect(0, 0, 595, 842));
QCOMPARE(tenpoint.fullRectPixels(600), QRect(0, 0, 4958, 7016));
QCOMPARE(tenpoint.paintRect(), QRectF(10, 10, 575, 822));
QCOMPARE(tenpoint.paintRect(QPageLayout::Millimeter), QRectF(3.53, 3.53, 202.94, 289.94));
QCOMPARE(tenpoint.paintRect(QPageLayout::Millimeter).x(), 3.53);
@ -108,6 +110,7 @@ void tst_QPageLayout::basics()
QCOMPARE(tenpoint.paintRect(QPageLayout::Millimeter).bottom(), 293.47);
QCOMPARE(tenpoint.paintRectPoints(), QRect(10, 10, 575, 822));
QCOMPARE(tenpoint.paintRectPixels(72), QRect(10, 10, 575, 822));
QCOMPARE(tenpoint.paintRectPixels(600), QRect(83, 83, 4792, 6850));
// Change orientation
tenpoint.setOrientation(QPageLayout::Landscape);
@ -119,10 +122,12 @@ void tst_QPageLayout::basics()
QCOMPARE(tenpoint.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(tenpoint.fullRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.fullRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.fullRectPixels(600), QRect(0, 0, 7016, 4958));
QCOMPARE(tenpoint.paintRect(), QRectF(10, 10, 822, 575));
QCOMPARE(tenpoint.paintRect(QPageLayout::Millimeter), QRectF(3.53, 3.53, 289.94, 202.94));
QCOMPARE(tenpoint.paintRectPoints(), QRect(10, 10, 822, 575));
QCOMPARE(tenpoint.paintRectPixels(72), QRect(10, 10, 822, 575));
QCOMPARE(tenpoint.paintRectPixels(600), QRect(83, 83, 6850, 4792));
// Change mode
QCOMPARE(tenpoint.mode(), QPageLayout::StandardMode);
@ -136,10 +141,77 @@ void tst_QPageLayout::basics()
QCOMPARE(tenpoint.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(tenpoint.fullRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.fullRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.fullRectPixels(600), QRect(0, 0, 7016, 4958));
QCOMPARE(tenpoint.paintRect(), QRectF(0, 0, 842, 595));
QCOMPARE(tenpoint.paintRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(tenpoint.paintRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.paintRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(tenpoint.paintRectPixels(600), QRect(0, 0, 7016, 4958));
// A4, 8.4pt margins
QPageLayout fraction = QPageLayout(QPageSize(QPageSize::A4), QPageLayout::Portrait, QMarginsF(8.4, 8.4, 8.4, 8.4));
QCOMPARE(fraction.isValid(), true);
QCOMPARE(fraction.margins(), QMarginsF(8.4, 8.4, 8.4, 8.4));
QCOMPARE(fraction.margins(QPageLayout::Millimeter), QMarginsF(2.96, 2.96, 2.96, 2.96));
QCOMPARE(fraction.marginsPoints(), QMarginsF(8, 8, 8, 8));
QCOMPARE(fraction.marginsPixels(72), QMargins(8, 8, 8, 8));
QCOMPARE(fraction.marginsPixels(600), QMargins(70, 70, 70, 70));
QCOMPARE(fraction.minimumMargins(), QMarginsF(0, 0, 0, 0));
QCOMPARE(fraction.maximumMargins(), QMarginsF(595, 842, 595, 842));
QCOMPARE(fraction.fullRect(), QRectF(0, 0, 595, 842));
QCOMPARE(fraction.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 210, 297));
QCOMPARE(fraction.fullRectPoints(), QRect(0, 0, 595, 842));
QCOMPARE(fraction.fullRectPixels(72), QRect(0, 0, 595, 842));
QCOMPARE(fraction.fullRectPixels(600), QRect(0, 0, 4958, 7016));
QCOMPARE(fraction.paintRect(), QRectF(8.4, 8.4, 578.2, 825.2));
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter), QRectF(2.96, 2.96, 204.08, 291.08));
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).x(), 2.96);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).y(), 2.96);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).width(), 204.08);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).height(), 291.08);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).left(), 2.96);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).right(), 207.04);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).top(), 2.96);
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter).bottom(), 294.04);
QCOMPARE(fraction.paintRectPoints(), QRect(8, 8, 579, 826));
QCOMPARE(fraction.paintRectPixels(72), QRect(8, 8, 579, 826));
QCOMPARE(fraction.paintRectPixels(600), QRect(70, 70, 4818, 6876));
// Change orientation
fraction.setOrientation(QPageLayout::Landscape);
QCOMPARE(fraction.orientation(), QPageLayout::Landscape);
QCOMPARE(fraction.margins(), QMarginsF(8.4, 8.4, 8.4, 8.4));
QCOMPARE(fraction.minimumMargins(), QMarginsF(0, 0, 0, 0));
QCOMPARE(fraction.maximumMargins(), QMarginsF(842, 595, 842, 595));
QCOMPARE(fraction.fullRect(), QRectF(0, 0, 842, 595));
QCOMPARE(fraction.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(fraction.fullRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(fraction.fullRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(fraction.fullRectPixels(600), QRect(0, 0, 7016, 4958));
QCOMPARE(fraction.paintRect(), QRectF(8.4, 8.4, 825.2, 578.2));
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter), QRectF(2.96, 2.96, 291.08, 204.08));
QCOMPARE(fraction.paintRectPoints(), QRect(8, 8, 826, 579));
QCOMPARE(fraction.paintRectPixels(72), QRect(8, 8, 826, 579));
QCOMPARE(fraction.paintRectPixels(600), QRect(70, 70, 6876, 4818));
// Change mode
QCOMPARE(fraction.mode(), QPageLayout::StandardMode);
fraction.setMode(QPageLayout::FullPageMode);
QCOMPARE(fraction.mode(), QPageLayout::FullPageMode);
QCOMPARE(fraction.orientation(), QPageLayout::Landscape);
QCOMPARE(fraction.margins(), QMarginsF(8.4, 8.4, 8.4, 8.4));
QCOMPARE(fraction.minimumMargins(), QMarginsF(0, 0, 0, 0));
QCOMPARE(fraction.maximumMargins(), QMarginsF(842, 595, 842, 595));
QCOMPARE(fraction.fullRect(), QRectF(0, 0, 842, 595));
QCOMPARE(fraction.fullRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(fraction.fullRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(fraction.fullRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(fraction.fullRectPixels(600), QRect(0, 0, 7016, 4958));
QCOMPARE(fraction.paintRect(), QRectF(0, 0, 842, 595));
QCOMPARE(fraction.paintRect(QPageLayout::Millimeter), QRectF(0, 0, 297, 210));
QCOMPARE(fraction.paintRectPoints(), QRect(0, 0, 842, 595));
QCOMPARE(fraction.paintRectPixels(72), QRect(0, 0, 842, 595));
QCOMPARE(fraction.paintRectPixels(600), QRect(0, 0, 7016, 4958));
}
void tst_QPageLayout::setGetMargins()