diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-10-16 12:22:57 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2018-10-17 09:15:46 +0000 |
commit | af4c0ee6c07f020e733574b1af99ab524bc41a9a (patch) | |
tree | 0402631da2bf3e2daad1c942f2b4b1b1f117b1d4 | |
parent | 7b334a0cebfc9480b5c5f7cf487feb1157d6ef07 (diff) |
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 <simon.hausmann@qt.io>
Reviewed-by: Andy Nichols <andy.nichols@qt.io>
-rw-r--r-- | src/quick/items/qquickborderimage.cpp | 26 | ||||
-rw-r--r-- | src/quick/scenegraph/qsgbasicinternalimagenode.cpp | 2 |
2 files changed, 19 insertions, 9 deletions
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<qreal>(0, sourceSize.width() - (border->right() + border->left()) * devicePixelRatio) / sourceSize.width(), - qMax<qreal>(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<qreal>(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); diff --git a/src/quick/scenegraph/qsgbasicinternalimagenode.cpp b/src/quick/scenegraph/qsgbasicinternalimagenode.cpp index c8699218ba..53271af9ab 100644 --- a/src/quick/scenegraph/qsgbasicinternalimagenode.cpp +++ b/src/quick/scenegraph/qsgbasicinternalimagenode.cpp @@ -484,7 +484,7 @@ void QSGBasicInternalImageNode::updateGeometry() int hTiles = ceilRight - floorLeft; int vTiles = ceilBottom - floorTop; - bool hasTiles = hTiles != 1 || vTiles != 1; + bool hasTiles = hTiles > 1 || vTiles > 1; bool fullTexture = innerSourceRect == QRectF(0, 0, 1, 1); // An image can be rendered as a single quad if: |