aboutsummaryrefslogtreecommitdiffstats
path: root/src/declarative/items
diff options
context:
space:
mode:
Diffstat (limited to 'src/declarative/items')
-rw-r--r--src/declarative/items/qsgimage.cpp4
-rw-r--r--src/declarative/items/qsgninepatchnode.cpp14
-rw-r--r--src/declarative/items/qsgshadereffectitem.cpp2
-rw-r--r--src/declarative/items/qsgshadereffectmesh.cpp2
-rw-r--r--src/declarative/items/qsgshadereffectsource.cpp12
-rw-r--r--src/declarative/items/qsgshadereffectsource_p.h7
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 *);