diff options
Diffstat (limited to 'src/declarative/items')
-rw-r--r-- | src/declarative/items/qsgimage.cpp | 4 | ||||
-rw-r--r-- | src/declarative/items/qsgninepatchnode.cpp | 14 | ||||
-rw-r--r-- | src/declarative/items/qsgshadereffectitem.cpp | 2 | ||||
-rw-r--r-- | src/declarative/items/qsgshadereffectmesh.cpp | 2 | ||||
-rw-r--r-- | src/declarative/items/qsgshadereffectsource.cpp | 12 | ||||
-rw-r--r-- | src/declarative/items/qsgshadereffectsource_p.h | 7 |
6 files changed, 25 insertions, 16 deletions
diff --git a/src/declarative/items/qsgimage.cpp b/src/declarative/items/qsgimage.cpp index 6f63555b81..d24db9f670 100644 --- a/src/declarative/items/qsgimage.cpp +++ b/src/declarative/items/qsgimage.cpp @@ -262,9 +262,9 @@ QSGNode *QSGImage::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *) }; QRectF nsrect(sourceRect.x() / d->pix.width(), - 1 - sourceRect.y() / d->pix.height(), + sourceRect.y() / d->pix.height(), sourceRect.width() / d->pix.width(), - -sourceRect.height() / d->pix.height()); + sourceRect.height() / d->pix.height()); node->setHorizontalWrapMode(hWrap); node->setVerticalWrapMode(vWrap); diff --git a/src/declarative/items/qsgninepatchnode.cpp b/src/declarative/items/qsgninepatchnode.cpp index 7858e98190..045dd6c94f 100644 --- a/src/declarative/items/qsgninepatchnode.cpp +++ b/src/declarative/items/qsgninepatchnode.cpp @@ -147,7 +147,8 @@ void QSGNinePatchNode::update() xChunkSize = xTexSize; } else if (m_horizontalTileMode == QSGBorderImage::Round) { xChunkCount = qCeil(xSize / xTexSize); - xChunkSize = xSize / xChunkCount; + qreal fullWidth = xChunkCount * xTexSize; + xChunkSize = xTexSize * xSize / fullWidth; } else { xChunkCount = 1; xChunkSize = xSize; @@ -163,7 +164,8 @@ void QSGNinePatchNode::update() yChunkSize = yTexSize; } else if (m_verticalTileMode == QSGBorderImage::Round) { yChunkCount = qCeil(ySize / yTexSize); - yChunkSize = ySize / yChunkCount; + qreal fullHeight = yChunkCount * yTexSize; + yChunkSize = yTexSize * ySize / fullHeight; } else { yChunkCount = 1; yChunkSize = ySize; @@ -184,10 +186,10 @@ void QSGNinePatchNode::update() // Fill in the vertices.. The loop below is pretty much an exact replica // of the one inside fillRow. - float yTexChunk1 = 1 - m_innerRect.top() / th; - float yTexChunk2 = 1 - m_innerRect.bottom() / th; + float yTexChunk1 = m_innerRect.top() / th; + float yTexChunk2 = m_innerRect.bottom() / th; - fillRow(v, 0, 1, xChunkCount, xChunkSize); + fillRow(v, 0, 0, xChunkCount, xChunkSize); fillRow(v, m_innerRect.y(), yTexChunk1, xChunkCount, xChunkSize); for (int yc=0; yc<yChunkCount; ++yc) { @@ -206,7 +208,7 @@ void QSGNinePatchNode::update() } fillRow(v, m_targetRect.height() - bottomBorder, yTexChunk2, xChunkCount, xChunkSize); - fillRow(v, m_targetRect.height(), 0, xChunkCount, xChunkSize); + fillRow(v, m_targetRect.height(), 1, xChunkCount, xChunkSize); // v = m_geometry.vertexDataAsTexturedPoint2D(); diff --git a/src/declarative/items/qsgshadereffectitem.cpp b/src/declarative/items/qsgshadereffectitem.cpp index 286b67bacd..40ec25c2cc 100644 --- a/src/declarative/items/qsgshadereffectitem.cpp +++ b/src/declarative/items/qsgshadereffectitem.cpp @@ -435,7 +435,7 @@ QSGNode *QSGShaderEffectItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeD textures.append(qMakePair(source.name, source.item)); QSGTextureProvider *t = QSGTextureProvider::from(source.item); if (t && t->textureChangedSignal()) - connect(source.item, t->textureChangedSignal(), node, SLOT(markDirtyTexture())); + connect(source.item, t->textureChangedSignal(), node, SLOT(markDirtyTexture()), Qt::DirectConnection); } m_material.setUniforms(values); m_material.setTextureProviders(textures); diff --git a/src/declarative/items/qsgshadereffectmesh.cpp b/src/declarative/items/qsgshadereffectmesh.cpp index 09d820706b..192e95c164 100644 --- a/src/declarative/items/qsgshadereffectmesh.cpp +++ b/src/declarative/items/qsgshadereffectmesh.cpp @@ -112,7 +112,7 @@ QSGGeometry *QSGGridMesh::updateGeometry(QSGGeometry *geometry, const QVector<QB bool positionFirst = attributes.at(0) == qtPositionAttributeName(); - QRectF srcRect(0, 1, 1, -1); + QRectF srcRect(0, 0, 1, 1); for (int iy = 0; iy <= vmesh; ++iy) { float fy = iy / float(vmesh); float y = float(dstRect.top()) + fy * float(dstRect.height()); diff --git a/src/declarative/items/qsgshadereffectsource.cpp b/src/declarative/items/qsgshadereffectsource.cpp index 36d380b15f..e5b79a6d78 100644 --- a/src/declarative/items/qsgshadereffectsource.cpp +++ b/src/declarative/items/qsgshadereffectsource.cpp @@ -192,7 +192,7 @@ void QSGShaderEffectTexture::grab() if (!m_renderer) { m_renderer = context->createRenderer(); - connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture())); + connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture()), Qt::DirectConnection); } m_renderer->setRootNode(static_cast<QSGRootNode *>(root)); @@ -255,7 +255,8 @@ void QSGShaderEffectTexture::grab() const QGLContext *ctx = QGLContext::currentContext(); m_renderer->setDeviceRect(m_size); m_renderer->setViewportRect(m_size); - m_renderer->setProjectMatrixToRect(m_rect); + QRectF mirrored(m_rect.left(), m_rect.bottom(), m_rect.width(), -m_rect.height()); + m_renderer->setProjectMatrixToRect(mirrored); m_renderer->setClearColor(Qt::transparent); if (m_multisampling) { @@ -292,6 +293,7 @@ QSGShaderEffectSource::QSGShaderEffectSource(QSGItem *parent) { setFlag(ItemHasContents); m_texture = new QSGShaderEffectTexture(this); + connect(m_texture, SIGNAL(textureChanged()), this, SIGNAL(textureChanged()), Qt::DirectConnection); } QSGShaderEffectSource::~QSGShaderEffectSource() @@ -492,12 +494,12 @@ QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNod QSGShaderEffectTexture *tex = qobject_cast<QSGShaderEffectTexture *>(m_texture); tex->setItem(QSGItemPrivate::get(m_sourceItem)->itemNode()); - QRectF sourceRect = m_sourceRect.isEmpty() + QRectF sourceRect = m_sourceRect.isNull() ? QRectF(0, 0, m_sourceItem->width(), m_sourceItem->height()) : m_sourceRect; tex->setRect(sourceRect); QSize textureSize = m_textureSize.isEmpty() - ? QSize(qCeil(sourceRect.width()), qCeil(sourceRect.height())) + ? QSize(qCeil(qAbs(sourceRect.width())), qCeil(qAbs(sourceRect.height()))) : m_textureSize; tex->setSize(textureSize); tex->setLive(m_live); @@ -517,7 +519,7 @@ QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNod node->setHorizontalWrapMode(hWrap); node->setVerticalWrapMode(vWrap); node->setTargetRect(QRectF(0, 0, width(), height())); - node->setSourceRect(QRectF(0, 1, 1, -1)); + node->setSourceRect(QRectF(0, 0, 1, 1)); node->update(); return node; diff --git a/src/declarative/items/qsgshadereffectsource_p.h b/src/declarative/items/qsgshadereffectsource_p.h index d8c4a18df1..1b6e1b5fe8 100644 --- a/src/declarative/items/qsgshadereffectsource_p.h +++ b/src/declarative/items/qsgshadereffectsource_p.h @@ -99,6 +99,9 @@ public: void grab(); +Q_SIGNALS: + void textureChanged(); + public Q_SLOTS: void markDirtyTexture(); @@ -183,7 +186,7 @@ public: void setMipmap(bool enabled); QSGTexture *texture() const; - const char *textureChangedSignal() const { return SIGNAL(textureChanged); } + const char *textureChangedSignal() const { return SIGNAL(textureChanged()); } Q_INVOKABLE void grab(); @@ -197,6 +200,8 @@ Q_SIGNALS: void hideSourceChanged(); void mipmapChanged(); + void textureChanged(); + protected: virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *); |