From af4c0ee6c07f020e733574b1af99ab524bc41a9a Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 16 Oct 2018 12:22:57 +0200 Subject: Improve some pathelogical borderImage cases Makes what the renderer is expected to do more well-defined, and makes the software and OpenGL backend agree in the rendering of the QML lancelot tests. Change-Id: I3991ec06e3b4b5f1713e224bb3b7d57e8f951ab4 Reviewed-by: Simon Hausmann Reviewed-by: Andy Nichols --- src/quick/items/qquickborderimage.cpp | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) (limited to 'src/quick/items/qquickborderimage.cpp') diff --git a/src/quick/items/qquickborderimage.cpp b/src/quick/items/qquickborderimage.cpp index d49829096f..e4e766a129 100644 --- a/src/quick/items/qquickborderimage.cpp +++ b/src/quick/items/qquickborderimage.cpp @@ -591,10 +591,18 @@ void QQuickBorderImagePrivate::calculateRects(const QQuickScaleGrid *border, *innerTargetRect = *targetRect; if (border) { - *innerSourceRect = QRectF(border->left() * devicePixelRatio / qreal(sourceSize.width()), - border->top() * devicePixelRatio / qreal(sourceSize.height()), - qMax(0, sourceSize.width() - (border->right() + border->left()) * devicePixelRatio) / sourceSize.width(), - qMax(0, sourceSize.height() - (border->bottom() + border->top()) * devicePixelRatio) / sourceSize.height()); + qreal borderLeft = border->left() * devicePixelRatio; + qreal borderRight = border->right() * devicePixelRatio; + qreal borderTop = border->top() * devicePixelRatio; + qreal borderBottom = border->bottom() * devicePixelRatio; + if (borderLeft + borderRight > sourceSize.width() && borderLeft < sourceSize.width()) + borderRight = sourceSize.width() - borderLeft; + if (borderTop + borderBottom > sourceSize.height() && borderTop < sourceSize.height()) + borderBottom = sourceSize.height() - borderTop; + *innerSourceRect = QRectF(QPointF(borderLeft / qreal(sourceSize.width()), + borderTop * devicePixelRatio / qreal(sourceSize.height())), + QPointF((sourceSize.width() - borderRight) / qreal(sourceSize.width()), + (sourceSize.height() - borderBottom) / qreal(sourceSize.height()))), *innerTargetRect = QRectF(border->left(), border->top(), qMax(0, targetSize.width() - (border->right() + border->left())), @@ -604,14 +612,16 @@ void QQuickBorderImagePrivate::calculateRects(const QQuickScaleGrid *border, qreal hTiles = 1; qreal vTiles = 1; const QSizeF innerTargetSize = innerTargetRect->size() * devicePixelRatio; - if (innerSourceRect->width() != 0 - && horizontalTileMode != QQuickBorderImage::Stretch) { + if (innerSourceRect->width() <= 0) + hTiles = 0; + else if (horizontalTileMode != QQuickBorderImage::Stretch) { hTiles = innerTargetSize.width() / qreal(innerSourceRect->width() * sourceSize.width()); if (horizontalTileMode == QQuickBorderImage::Round) hTiles = qCeil(hTiles); } - if (innerSourceRect->height() != 0 - && verticalTileMode != QQuickBorderImage::Stretch) { + if (innerSourceRect->height() <= 0) + vTiles = 0; + else if (verticalTileMode != QQuickBorderImage::Stretch) { vTiles = innerTargetSize.height() / qreal(innerSourceRect->height() * sourceSize.height()); if (verticalTileMode == QQuickBorderImage::Round) vTiles = qCeil(vTiles); -- cgit v1.2.3