From 67c569add0a3db5f730d81b6bcb3fed22d3a4ce6 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Thu, 9 May 2019 13:44:12 +0200 Subject: Make tst_qwidget pass on High-DPI screens (Windows) - Move the fuzz check introduced by 63090627220a6209652d236cf991305fbeb188b8 to a shared header for reuse. Use it in in more places to account for rounding errors introduced by odd window frame sizes when scaling is active. - Use the test widget size to ensure windows do not violate the minimum decorated window size on Windows when scaling is inactive on large monitors. Task-number: QTBUG-46615 Change-Id: Icf803a4bc2c275eadb8f98e60b08e39b2ebebedd Reviewed-by: Oliver Wolff --- tests/auto/shared/highdpi.h | 109 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 tests/auto/shared/highdpi.h (limited to 'tests/auto/shared') diff --git a/tests/auto/shared/highdpi.h b/tests/auto/shared/highdpi.h new file mode 100644 index 0000000000..f0c34bea25 --- /dev/null +++ b/tests/auto/shared/highdpi.h @@ -0,0 +1,109 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef HIGHDPI_H +#define HIGHDPI_H + +#include +#include +#include +#include + +// Helpers for comparing geometries a that may go through scaling in the +// platform plugin with fuzz (pass rounded-down device pixel ratios or +// scaling factors). Error message for use with QVERIFY2() are also provided. + +class HighDpi +{ +public: + HighDpi() = delete; + HighDpi(const HighDpi &) = delete; + HighDpi &operator=(const HighDpi &) = delete; + HighDpi(HighDpi &&) = delete; + HighDpi &operator=(HighDpi &&) = delete; + ~HighDpi() = delete; + + static int manhattanDelta(const QPoint &p1, const QPoint p2) + { + return (p1 - p2).manhattanLength(); + } + + static bool fuzzyCompare(const QPoint &p1, const QPoint p2, int fuzz) + { + return manhattanDelta(p1, p2) <= fuzz; + } + + static QByteArray msgPointMismatch(const QPoint &p1, const QPoint p2) + { + return QByteArray::number(p1.x()) + ',' + QByteArray::number(p1.y()) + + " != " + QByteArray::number(p2.x()) + ',' + QByteArray::number(p2.y()) + + ", manhattanLength=" + QByteArray::number(manhattanDelta(p1, p2)); + } + + // Compare a size that may go through scaling in the platform plugin with fuzz. + + static inline int manhattanDelta(const QSize &s1, const QSize &s2) + { + return qAbs(s1.width() - s2.width()) + qAbs(s1.height() - s2.height()); + } + + static inline bool fuzzyCompare(const QSize &s1, const QSize &s2, int fuzz) + { + return manhattanDelta(s1, s2) <= fuzz; + } + + static QByteArray msgSizeMismatch(const QSize &s1, const QSize &s2) + { + return QByteArray::number(s1.width()) + 'x' + QByteArray::number(s1.height()) + + " != " + QByteArray::number(s2.width()) + 'x' + QByteArray::number(s2.height()) + + ", manhattanLength=" + QByteArray::number(manhattanDelta(s1, s2)); + } + + // Compare a geometry that may go through scaling in the platform plugin with fuzz. + + static inline bool fuzzyCompare(const QRect &r1, const QRect &r2, int fuzz) + { + return manhattanDelta(r1.topLeft(), r2.topLeft()) <= fuzz + && manhattanDelta(r1.size(), r2.size()) <= fuzz; + } + + static QByteArray msgRectMismatch(const QRect &r1, const QRect &r2) + { + return formatRect(r1) + " != " + formatRect(r2); + } + +private: + static QByteArray formatRect(const QRect &r) + { + return QByteArray::number(r.width()) + 'x' + QByteArray::number(r.height()) + + (r.left() < 0 ? '-' : '+') + QByteArray::number(r.left()) + + (r.top() < 0 ? '-' : '+') + QByteArray::number(r.top()); + } +}; + +#endif // HIGHDPI_H -- cgit v1.2.3