diff options
Diffstat (limited to 'src/gui/kernel/qhighdpiscaling_p.h')
-rw-r--r-- | src/gui/kernel/qhighdpiscaling_p.h | 176 |
1 files changed, 106 insertions, 70 deletions
diff --git a/src/gui/kernel/qhighdpiscaling_p.h b/src/gui/kernel/qhighdpiscaling_p.h index 422f76134a..d6deb8a72a 100644 --- a/src/gui/kernel/qhighdpiscaling_p.h +++ b/src/gui/kernel/qhighdpiscaling_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtGui module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** 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 Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** 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-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QHIGHDPISCALING_P_H #define QHIGHDPISCALING_P_H @@ -64,7 +28,7 @@ QT_BEGIN_NAMESPACE -Q_DECLARE_LOGGING_CATEGORY(lcScaling); +Q_DECLARE_LOGGING_CATEGORY(lcHighDpi); class QScreen; class QPlatformScreen; @@ -96,45 +60,66 @@ public: static bool isActive() { return m_active; } + struct Point { + enum Kind { + Invalid, + DeviceIndependent, + Native + }; + Kind kind; + QPoint point; + }; + struct ScaleAndOrigin { qreal factor; QPoint origin; }; - static ScaleAndOrigin scaleAndOrigin(const QPlatformScreen *platformScreen, QPoint *nativePosition = nullptr); - static ScaleAndOrigin scaleAndOrigin(const QScreen *screen, QPoint *nativePosition = nullptr); - static ScaleAndOrigin scaleAndOrigin(const QWindow *platformScreen, QPoint *nativePosition = nullptr); + + static ScaleAndOrigin scaleAndOrigin(const QPlatformScreen *platformScreen, Point position = Point{ Point::Invalid, QPoint() }); + static ScaleAndOrigin scaleAndOrigin(const QScreen *screen, Point position = Point{ Point::Invalid, QPoint() }); + static ScaleAndOrigin scaleAndOrigin(const QWindow *platformScreen, Point position = Point{ Point::Invalid, QPoint() }); template<typename C> - static qreal factor(C *context, QPoint *nativePosition = nullptr) { - return scaleAndOrigin(context, nativePosition).factor; + static qreal factor(C *context) { + return scaleAndOrigin(context).factor; } static QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen); static QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen); - static QPointF mapPositionToGlobal(const QPointF &pos, const QPoint &windowGlobalPosition, const QWindow *window); - static QPointF mapPositionFromGlobal(const QPointF &pos, const QPoint &windowGlobalPosition, const QWindow *window); static QDpi logicalDpi(const QScreen *screen); + static qreal roundScaleFactor(qreal rawFactor); private: + struct ScreenFactor { + ScreenFactor(QString name, qreal factor) + :name(name), factor(factor) { } + QString name; + qreal factor; + }; + static qreal rawScaleFactor(const QPlatformScreen *screen); - static qreal roundScaleFactor(qreal rawFactor); static QDpi effectiveLogicalDpi(const QPlatformScreen *screen, qreal rawFactor, qreal roundedFactor); static qreal screenSubfactor(const QPlatformScreen *screen); + static QScreen *screenForPosition(Point position, QScreen *guess); + static QVector<QHighDpiScaling::ScreenFactor> parseScreenScaleFactorsSpec(const QStringView &screenScaleFactors); static qreal m_factor; static bool m_active; - static bool m_usePixelDensity; + static bool m_usePlatformPluginDpi; + static bool m_platformPluginDpiScalingActive; static bool m_globalScalingActive; - static bool m_pixelDensityScalingActive; static bool m_screenFactorSet; - static QDpi m_logicalDpi; + static bool m_usePhysicalDpi; + static QVector<ScreenFactor> m_screenFactors; + static DpiAdjustmentPolicy m_dpiAdjustmentPolicy; + static QHash<QString, qreal> m_namedScreenScaleFactors; + +#ifndef QT_NO_DEBUG_STREAM + friend Q_GUI_EXPORT QDebug operator<<(QDebug, const ScreenFactor &); +#endif }; -// Coordinate system conversion functions: -// QHighDpi::fromNativePixels : from physical(screen/backing) to logical pixels -// QHighDpi::toNativePixels : from logical to physical pixels - namespace QHighDpi { inline qreal scale(qreal value, qreal scaleFactor, QPointF /* origin */ = QPointF(0, 0)) @@ -187,7 +172,7 @@ inline QMargins scale(const QMargins &margins, qreal scaleFactor, QPoint origin template<typename T> QList<T> scale(const QList<T> &list, qreal scaleFactor, QPoint origin = QPoint(0, 0)) { - if (!QHighDpiScaling::isActive()) + if (qFuzzyCompare(scaleFactor, qreal(1))) return list; QList<T> scaled; @@ -199,27 +184,35 @@ QList<T> scale(const QList<T> &list, qreal scaleFactor, QPoint origin = QPoint(0 inline QRegion scale(const QRegion ®ion, qreal scaleFactor, QPoint origin = QPoint(0, 0)) { - if (!QHighDpiScaling::isActive()) + if (qFuzzyCompare(scaleFactor, qreal(1))) return region; - QRegion scaled; - for (const QRect &rect : region) - scaled += scale(QRectF(rect), scaleFactor, origin).toRect(); - return scaled; + QRegion scaled = region.translated(-origin); + scaled = QTransform::fromScale(scaleFactor, scaleFactor).map(scaled); + return scaled.translated(origin); } template <typename T> -inline QPoint position(T) { return QPoint(); } -inline QPoint position(QPoint point) { return point; } -inline QPoint position(QPointF point) { return point.toPoint(); } -inline QPoint position(QRect rect) { return rect.center(); } -inline QPoint position(QRectF rect) { return rect.center().toPoint(); } +inline QHighDpiScaling::Point position(T, QHighDpiScaling::Point::Kind) { + return QHighDpiScaling::Point{ QHighDpiScaling::Point::Invalid, QPoint() }; +} +inline QHighDpiScaling::Point position(QPoint point, QHighDpiScaling::Point::Kind kind) { + return QHighDpiScaling::Point{ kind, point }; +} +inline QHighDpiScaling::Point position(QPointF point, QHighDpiScaling::Point::Kind kind) { + return QHighDpiScaling::Point{ kind, point.toPoint() }; +} +inline QHighDpiScaling::Point position(QRect rect, QHighDpiScaling::Point::Kind kind) { + return QHighDpiScaling::Point{ kind, rect.topLeft() }; +} +inline QHighDpiScaling::Point position(QRectF rect, QHighDpiScaling::Point::Kind kind) { + return QHighDpiScaling::Point{ kind, rect.topLeft().toPoint() }; +} template <typename T, typename C> T fromNativePixels(const T &value, const C *context) { - QPoint nativePosition = position(value); - QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context, &nativePosition); + QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context); return scale(value, qreal(1) / so.factor, so.origin); } @@ -242,6 +235,38 @@ T toNativeLocalPosition(const T &value, const C *context) return scale(value, QHighDpiScaling::factor(context)); } +template <typename T, typename C> +T fromNativeGlobalPosition(const T &value, const C *context) +{ + QHighDpiScaling::ScaleAndOrigin so = + QHighDpiScaling::scaleAndOrigin(context, position(value, QHighDpiScaling::Point::Native)); + return scale(value, qreal(1) / so.factor, so.origin); +} + +template <typename T, typename C> +T toNativeGlobalPosition(const T &value, const C *context) +{ + QHighDpiScaling::ScaleAndOrigin so = + QHighDpiScaling::scaleAndOrigin(context, position(value, QHighDpiScaling::Point::DeviceIndependent)); + return scale(value, so.factor, so.origin); +} + +template <typename T, typename C> +T fromNativeWindowGeometry(const T &value, const C *context) +{ + QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context); + QPoint effectiveOrigin = (context && context->isTopLevel()) ? so.origin : QPoint(0,0); + return scale(value, qreal(1) / so.factor, effectiveOrigin); +} + +template <typename T, typename C> +T toNativeWindowGeometry(const T &value, const C *context) +{ + QHighDpiScaling::ScaleAndOrigin so = QHighDpiScaling::scaleAndOrigin(context); + QPoint effectiveOrigin = (context && context->isTopLevel()) ? so.origin : QPoint(0,0); + return scale(value, so.factor, effectiveOrigin); +} + template <typename T> inline T fromNative(const T &value, qreal scaleFactor, QPoint origin = QPoint(0, 0)) { @@ -316,13 +341,16 @@ public: static inline QPoint origin(const QPlatformScreen *) { return QPoint(); } static inline QPoint mapPositionFromNative(const QPoint &pos, const QPlatformScreen *) { return pos; } static inline QPoint mapPositionToNative(const QPoint &pos, const QPlatformScreen *) { return pos; } - static inline QPointF mapPositionToGlobal(const QPointF &pos, const QPoint &windowGlobalPosition, const QWindow *window) { return pos; } - static inline QPointF mapPositionFromGlobal(const QPointF &pos, const QPoint &windowGlobalPosition, const QWindow *window) { return pos; } - static inline QDpi logicalDpi(const QScreen *screen) { return QDpi(-1,-1); } + static inline QPointF mapPositionToGlobal(const QPointF &pos, const QPoint &, const QWindow *) { return pos; } + static inline QPointF mapPositionFromGlobal(const QPointF &pos, const QPoint &, const QWindow *) { return pos; } + static inline QDpi logicalDpi(const QScreen *) { return QDpi(-1,-1); } }; namespace QHighDpi { template <typename T> inline + T scale(const T &value, ...) { return value; } + + template <typename T> inline T toNative(const T &value, ...) { return value; } template <typename T> inline T fromNative(const T &value, ...) { return value; } @@ -331,6 +359,14 @@ namespace QHighDpi { T fromNativeLocalPosition(const T &value, ...) { return value; } template <typename T> inline T toNativeLocalPosition(const T &value, ...) { return value; } + template <typename T, typename C> inline + T fromNativeGlobalPosition(const T &value, const C *) { return value; } + template <typename T, typename C> inline + T toNativeGlobalPosition(const T &value, const C *) { return value; } + template <typename T, typename C> inline + T fromNativeWindowGeometry(const T &value, const C *) { return value; } + template <typename T, typename C> inline + T toNativeWindowGeometry(const T &value, const C *) { return value; } template <typename T> inline T fromNativeLocalRegion(const T &value, ...) { return value; } |