summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-11-20 15:58:04 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-11-20 20:42:12 +0100
commita31484302d71c29c0e0e62f9941f9d5f0c87f9aa (patch)
treebb72334ca5295afbafc92a1e31ffb3de8633542c
parentfb21a5ce1a5831fab2af5e4d301600d6a6211e5d (diff)
Fix safe conversion
Ensure the resulting QScFixed values are no larger than can be safely returned to int after shifting the fixed factor away. Pick-to: 6.0 6.0.0 Fixes: QTBUG-88683 Change-Id: Id0754b021e5fa9a3cf0d15e37ac643cfc1509993 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
-rw-r--r--src/gui/painting/qrasterizer.cpp15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/gui/painting/qrasterizer.cpp b/src/gui/painting/qrasterizer.cpp
index 921d260320..5a63840c03 100644
--- a/src/gui/painting/qrasterizer.cpp
+++ b/src/gui/painting/qrasterizer.cpp
@@ -725,10 +725,17 @@ static inline qreal qSafeDivide(qreal x, qreal y)
static inline QScFixed qSafeFloatToQScFixed(qreal x)
{
qreal tmp = x * QScFixedFactor;
- if (tmp > qreal(std::numeric_limits<QScFixed>::max()))
- return std::numeric_limits<QScFixed>::max();
- else if (tmp < qreal(std::numeric_limits<QScFixed>::min()))
- return std::numeric_limits<QScFixed>::min();
+#if Q_PROCESSOR_WORDSIZE == 8
+ if (tmp > qreal(INT_MAX) * QScFixedFactor)
+ return QScFixed(INT_MAX) * QScFixedFactor;
+ else if (tmp < qreal(INT_MIN) * QScFixedFactor)
+ return QScFixed(INT_MIN) * QScFixedFactor;
+#else
+ if (tmp > qreal(INT_MAX))
+ return INT_MAX;
+ else if (tmp < qreal(INT_MIN))
+ return -INT_MAX;
+#endif
return QScFixed(tmp);
}