qhighdpiscaling.cpp

Absolute File Name:/home/qt/qt5_coco/qt5/qtbase/src/gui/kernel/qhighdpiscaling.cpp
Switch to Source codePreprocessed file
LineSourceCount
1-
2-
3-
4-
5const QLoggingCategory &lcScaling() { static const QLoggingCategory category("qt.scaling"); return category; };-
6-
7-
8static const char legacyDevicePixelEnvVar[] = "QT_DEVICE_PIXEL_RATIO";-
9static const char scaleFactorEnvVar[] = "QT_SCALE_FACTOR";-
10static const char autoScreenEnvVar[] = "QT_AUTO_SCREEN_SCALE_FACTOR";-
11static const char screenFactorsEnvVar[] = "QT_SCREEN_SCALE_FACTORS";-
12-
13static inline qreal initialGlobalScaleFactor()-
14{-
15-
16 qreal result = 1;-
17 if (qEnvironmentVariableIsSet(scaleFactorEnvVar)) {-
18 bool ok;-
19 const qreal f = qgetenv(scaleFactorEnvVar).toDouble(&ok);-
20 if (ok && f > 0) {-
21 for (bool qt_category_enabled = lcScaling().isDebugEnabled(); qt_category_enabled; qt_category_enabled = false) QMessageLogger(__FILE__, 6066, __PRETTY_FUNCTION__, lcScaling().categoryName()).debug() << "Apply " << scaleFactorEnvVar << f;-
22 result = f;-
23 }-
24 } else {-
25 if (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar)) {-
26 QMessageLogger(__FILE__, 6571, __PRETTY_FUNCTION__).warning() << "Warning:" << legacyDevicePixelEnvVar << "is deprecated. Instead use:" << endl-
27 << " " << autoScreenEnvVar << "to enable platform plugin controlled per-screen factors." << endl-
28 << " " << screenFactorsEnvVar << "to set per-screen factors." << endl-
29 << " " << scaleFactorEnvVar << "to set the application global scale factor.";-
30-
31 int dpr = qEnvironmentVariableIntValue(legacyDevicePixelEnvVar);-
32 if (dpr > 0)-
33 result = dpr;-
34 }-
35 }-
36 return result;-
37}-
38qreal QHighDpiScaling::m_factor = 1.0;-
39bool QHighDpiScaling::m_active = false;-
40bool QHighDpiScaling::m_usePixelDensity = false;-
41bool QHighDpiScaling::m_pixelDensityScalingActive = false;-
42bool QHighDpiScaling::m_globalScalingActive = false;-
43bool QHighDpiScaling::m_screenFactorSet = false;-
44QDpi QHighDpiScaling::m_logicalDpi = QDpi(-1,-1);-
45-
46-
47-
48-
49-
50-
51static inline bool usePixelDensity()-
52{-
53-
54-
55-
56 if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling))-
57 return false;-
58 bool screenEnvValueOk;-
59 const int screenEnvValue = qEnvironmentVariableIntValue(autoScreenEnvVar, &screenEnvValueOk);-
60 if (screenEnvValueOk && screenEnvValue < 1)-
61 return false;-
62 return QCoreApplication::testAttribute(Qt::AA_EnableHighDpiScaling)-
63 || (screenEnvValueOk && screenEnvValue > 0)-
64 || (qEnvironmentVariableIsSet(legacyDevicePixelEnvVar) && qgetenv(legacyDevicePixelEnvVar).toLower() == "auto");-
65}-
66-
67void QHighDpiScaling::initHighDpiScaling()-
68{-
69-
70 m_factor = initialGlobalScaleFactor();-
71 m_globalScalingActive = !qFuzzyCompare(m_factor, qreal(1));-
72-
73 m_usePixelDensity = usePixelDensity();-
74-
75 m_pixelDensityScalingActive = false;-
76-
77-
78-
79 m_active = m_globalScalingActive || m_usePixelDensity;-
80}-
81-
82void QHighDpiScaling::updateHighDpiScaling()-
83{-
84 if (QCoreApplication::testAttribute(Qt::AA_DisableHighDpiScaling)
QCoreApplicati...ighDpiScaling)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
85 return;
never executed: return;
0
86-
87 if (m_usePixelDensity
m_usePixelDensityDescription
TRUEnever evaluated
FALSEnever evaluated
&& !m_pixelDensityScalingActive
!m_pixelDensityScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
88 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)();-
89 for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0: screens) {-
90 if (!qFuzzyCompare(screenSubfactor(screen->handle()), qreal(1))
!qFuzzyCompare...()), qreal(1))Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
91 m_pixelDensityScalingActive = true;-
92 break;
never executed: break;
0
93 }-
94 }
never executed: end of block
0
95 }
never executed: end of block
0
96 if (qEnvironmentVariableIsSet(screenFactorsEnvVar)
qEnvironmentVa...FactorsEnvVar)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
97 int i = 0;-
for (QForeachContainer<typename QtPrivate::remove_reference<decltype(qgetenv(screenFactorsEnvVar).split(';
98 '))>::type> _container_((const auto specs = qgetenv(screenFactorsEnvVar).split(';'))); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1));-
99 for (const QByteArray &spec = *_container_.i; _container_.control; _container_.control = 0: specs) {-
100 QScreen *screen = 0;-
101 int equalsPos = spec.lastIndexOf('=');-
102 double factor = 0;-
103 if (equalsPos > 0
equalsPos > 0Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
104-
105 QByteArray name = spec.mid(0, equalsPos);-
106 QByteArray f = spec.mid(equalsPos + 1);-
107 bool ok;-
108 factor = f.toDouble(&ok);-
109 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
) {
0
110 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)();-
111 for (QScreen *s = *_container_.i; _container_.control; _container_.control = 0: screens) {-
112 if (s->name() == QString::fromLocal8Bit(name)
s->name() == Q...ocal8Bit(name)Description
TRUEnever evaluated
FALSEnever evaluated
) {
0
113 screen = s;-
114 break;
never executed: break;
0
115 }-
116 }
never executed: end of block
0
117 }
never executed: end of block
0
118 }
never executed: end of block
else {
0
119-
120 bool ok;-
121 factor = spec.toDouble(&ok);-
122 if (ok
okDescription
TRUEnever evaluated
FALSEnever evaluated
&& i < QGuiApplication::screens().count()
i < QGuiApplic...eens().count()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
123 screen = QGuiApplication::screens().at(i);
never executed: screen = QGuiApplication::screens().at(i);
0
124 }
never executed: end of block
0
125 if (screen
screenDescription
TRUEnever evaluated
FALSEnever evaluated
)
0
126 setScreenFactor(screen, factor);
never executed: setScreenFactor(screen, factor);
0
127 ++i;-
128 }
never executed: end of block
0
129 }
never executed: end of block
0
130 m_active = m_globalScalingActive
m_globalScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
|| m_screenFactorSet
m_screenFactorSetDescription
TRUEnever evaluated
FALSEnever evaluated
|| m_pixelDensityScalingActive
m_pixelDensityScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
;
0
131-
132 QPlatformScreen *primaryScreen = QGuiApplication::primaryScreen()->handle();-
133 qreal sf = screenSubfactor(primaryScreen);-
134 QDpi primaryDpi = primaryScreen->logicalDpi();-
135 m_logicalDpi = QDpi(primaryDpi.first / sf, primaryDpi.second / sf);-
136}
never executed: end of block
0
137-
138-
139-
140-
141void QHighDpiScaling::setGlobalFactor(qreal factor)-
142{-
143 if (qFuzzyCompare(factor, m_factor)
qFuzzyCompare(...tor, m_factor)Description
TRUEnever evaluated
FALSEnever evaluated
)
0
144 return;
never executed: return;
0
145 if (!QGuiApplication::allWindows().isEmpty()
!QGuiApplicati...ws().isEmpty()Description
TRUEnever evaluated
FALSEnever evaluated
)
0
146 QMessageLogger(__FILE__, 319328, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist.");
never executed: QMessageLogger(__FILE__, 328, __PRETTY_FUNCTION__).warning("QHighDpiScaling::setFactor: Should only be called when no windows exist.");
0
147-
148 m_globalScalingActive = !qFuzzyCompare(factor, qreal(1));-
149 m_factor = m_globalScalingActive
m_globalScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
? factor : qreal(1);
0
150 m_active = m_globalScalingActive
m_globalScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
|| m_screenFactorSet
m_screenFactorSetDescription
TRUEnever evaluated
FALSEnever evaluated
|| m_pixelDensityScalingActive
m_pixelDensityScalingActiveDescription
TRUEnever evaluated
FALSEnever evaluated
;
0
151 for (QForeachContainer<typename QtPrivate::remove_reference<decltype(QGuiApplication::const auto screens ())>::type> _container_((= QGuiApplication::screens())); _container_.control && _container_.i != _container_.e; ++_container_.i, _container_.control ^= 1)();-
152 for (QScreen *screen = *_container_.i; _container_.control; _container_.control = 0: screens)-
153 screen->d_func()->updateHighDpi();
never executed: screen->d_func()->updateHighDpi();
0
154}
never executed: end of block
0
155-
156static const char scaleFactorProperty[] = "_q_scaleFactor";-
157-
158-
159-
160-
161void QHighDpiScaling::setScreenFactor(QScreen *screen, qreal factor)-
162{-
163 if (!qFuzzyCompare(factor, qreal(1))) {-
164 m_screenFactorSet = true;-
165 m_active = true;-
166 }-
167 screen->setProperty(scaleFactorProperty, QVariant(factor));-
168-
169-
170 if (screen->handle())-
171 screen->d_func()->setPlatformScreen(screen->handle());-
172}-
173-
174QPoint QHighDpiScaling::mapPositionToNative(const QPoint &pos, const QPlatformScreen *platformScreen)-
175{-
176 if (!platformScreen)-
177 return pos;-
178 const qreal scaleFactor = factor(platformScreen);-
179 const QPoint topLeft = platformScreen->geometry().topLeft();-
180 return (pos - topLeft) * scaleFactor + topLeft;-
181}-
182-
183QPoint QHighDpiScaling::mapPositionFromNative(const QPoint &pos, const QPlatformScreen *platformScreen)-
184{-
185 if (!platformScreen)-
186 return pos;-
187 const qreal scaleFactor = factor(platformScreen);-
188 const QPoint topLeft = platformScreen->geometry().topLeft();-
189 return (pos - topLeft) / scaleFactor + topLeft;-
190}-
191-
192qreal QHighDpiScaling::screenSubfactor(const QPlatformScreen *screen)-
193{-
194 qreal factor = qreal(1.0);-
195 if (screen) {-
196 if (m_usePixelDensity)-
197 factor *= screen->pixelDensity();-
198 if (m_screenFactorSet) {-
199 QVariant screenFactor = screen->screen()->property(scaleFactorProperty);-
200 if (screenFactor.isValid())-
201 factor *= screenFactor.toReal();-
202 }-
203 }-
204 return factor;-
205}-
206-
207QDpi QHighDpiScaling::logicalDpi()-
208{-
209 return m_logicalDpi;-
210}-
211-
212qreal QHighDpiScaling::factor(const QScreen *screen)-
213{-
214-
215 if (!m_active)-
216 return qreal(1.0);-
217-
218-
219-
220 qreal factor = m_factor;-
221 if (screen)-
222 factor *= screenSubfactor(screen->handle());-
223 return factor;-
224}-
225-
226qreal QHighDpiScaling::factor(const QPlatformScreen *platformScreen)-
227{-
228 if (!m_active)-
229 return qreal(1.0);-
230-
231 return m_factor * screenSubfactor(platformScreen);-
232}-
233-
234qreal QHighDpiScaling::factor(const QWindow *window)-
235{-
236 if (!m_active)-
237 return qreal(1.0);-
238-
239 return factor(window ? window->screen() : QGuiApplication::primaryScreen());-
240}-
241-
242QPoint QHighDpiScaling::origin(const QScreen *screen)-
243{-
244 return screen->geometry().topLeft();-
245}-
246-
247QPoint QHighDpiScaling::origin(const QPlatformScreen *platformScreen)-
248{-
249 return platformScreen->geometry().topLeft();-
250}-
251-
252-
253-
Switch to Source codePreprocessed file

Generated by Squish Coco Non-Commercial 4.3.0-BETA-master-30-08-2018-4cb69e9