Fix QHighDpi::fromNativeLocalExposedRegion rounding errors
Calling bottom/right/bottomRight on a QRect is discouraged, as it does not give the true bottom-right corner of the rectangle, instead giving a point one unit to the left and top of the true bottom right. Dividing this point by a scale factor of e.g. 2, and then using qCeil on the bottom right x and y coordinates would result in a pointRegion that was 1x1 * scaleFactor larger than it should, manifesting as rendering issues at later stages. We can get away from the whole problem by initially converting the QRect to a QRectF, and basing the pointRegion's rect on the scaled size instead of bottom-right coordinates. Change-Id: I4d4895660655cfa8749c93c7d2573ae79cd7898b Reviewed-by: Simon Hausmann <simon.hausmann@qt.io> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io> Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>bb10
parent
a9dfdbd06a
commit
5138fada0b
|
|
@ -398,11 +398,11 @@ inline QRegion fromNativeLocalExposedRegion(const QRegion &pixelRegion, const QW
|
|||
|
||||
const qreal scaleFactor = QHighDpiScaling::factor(window);
|
||||
QRegion pointRegion;
|
||||
for (const QRect &rect : pixelRegion) {
|
||||
const QPointF topLeftP = QPointF(rect.topLeft()) / scaleFactor;
|
||||
const QPointF bottomRightP = QPointF(rect.bottomRight()) / scaleFactor;
|
||||
for (const QRectF &rect : pixelRegion) {
|
||||
const QPointF topLeftP = rect.topLeft() / scaleFactor;
|
||||
const QSizeF sizeP = rect.size() / scaleFactor;
|
||||
pointRegion += QRect(QPoint(qFloor(topLeftP.x()), qFloor(topLeftP.y())),
|
||||
QPoint(qCeil(bottomRightP.x()), qCeil(bottomRightP.y())));
|
||||
QSize(qCeil(sizeP.width()), qCeil(sizeP.height())));
|
||||
}
|
||||
return pointRegion;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue