summaryrefslogtreecommitdiffstats
path: root/src/core/delegated_frame_node.cpp
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2017-03-21 18:02:26 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2017-03-22 09:04:52 +0000
commit843cc55f5fa064514246e24e9f9ffcbb3335b1df (patch)
tree8084688e5ecc6af204a9e4655b16498a03f8369a /src/core/delegated_frame_node.cpp
parent29afdb0a34e425728ccf85b8421e9b1aadb22f45 (diff)
Handle texture nodes alternative source rect
Texture nodes has an alternative and rarely used way of setting source rect using uv_top_left and uv_bottom_right. This patch adds support for it. Task-number: QTBUG-59407 Change-Id: Ic14c3dbdede6ece07eb3cda2dcfea8e860654ef2 Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'src/core/delegated_frame_node.cpp')
-rw-r--r--src/core/delegated_frame_node.cpp26
1 files changed, 18 insertions, 8 deletions
diff --git a/src/core/delegated_frame_node.cpp b/src/core/delegated_frame_node.cpp
index 03c76dd19..31b64a277 100644
--- a/src/core/delegated_frame_node.cpp
+++ b/src/core/delegated_frame_node.cpp
@@ -185,7 +185,8 @@ public:
virtual ~DelegatedNodeTreeHandler(){}
virtual void setupRenderPassNode(QSGTexture *, const QRect &, QSGNode *) = 0;
- virtual void setupTextureContentNode(QSGTexture *, const QRect &, QSGTexture::Filtering,
+ virtual void setupTextureContentNode(QSGTexture *, const QRect &, const QRectF &,
+ QSGTexture::Filtering,
QSGTextureNode::TextureCoordinatesTransformMode,
QSGNode *) = 0;
virtual void setupTiledContentNode(QSGTexture *, const QRect &, const QRectF &,
@@ -232,7 +233,7 @@ public:
imageNode->update();
}
- void setupTextureContentNode(QSGTexture *texture, const QRect &rect,
+ void setupTextureContentNode(QSGTexture *texture, const QRect &rect, const QRectF &sourceRect,
QSGTexture::Filtering filtering,
QSGTextureNode::TextureCoordinatesTransformMode texCoordTransForm,
QSGNode *) Q_DECL_OVERRIDE
@@ -244,6 +245,8 @@ public:
textureNode->setTextureCoordinatesTransform(texCoordTransForm);
if (textureNode->rect() != rect)
textureNode->setRect(rect);
+ if (textureNode->sourceRect() != sourceRect)
+ textureNode->setSourceRect(sourceRect);
if (textureNode->filtering() != filtering)
textureNode->setFiltering(filtering);
}
@@ -332,7 +335,7 @@ public:
imageNode->update();
}
- void setupTextureContentNode(QSGTexture *texture, const QRect &rect,
+ void setupTextureContentNode(QSGTexture *texture, const QRect &rect, const QRectF &sourceRect,
QSGTexture::Filtering filtering,
QSGTextureNode::TextureCoordinatesTransformMode texCoordTransForm,
QSGNode *layerChain) Q_DECL_OVERRIDE
@@ -340,6 +343,7 @@ public:
QSGTextureNode *textureNode = m_apiDelegate->createTextureNode();
textureNode->setTextureCoordinatesTransform(texCoordTransForm);
textureNode->setRect(rect);
+ textureNode->setSourceRect(sourceRect);
textureNode->setTexture(texture);
textureNode->setFiltering(filtering);
@@ -941,7 +945,6 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
currentLayerState = quad->shared_quad_state;
currentLayerChain = buildLayerChain(renderPassChain, currentLayerState);
}
-
switch (quad->material) {
case cc::DrawQuad::RENDER_PASS: {
const cc::RenderPassDrawQuad *renderPassQuad
@@ -955,12 +958,19 @@ void DelegatedFrameNode::commit(ChromiumCompositorData *chromiumCompositorData,
const cc::TextureDrawQuad *tquad = cc::TextureDrawQuad::MaterialCast(quad);
ResourceHolder *resource = findAndHoldResource(tquad->resource_id(),
resourceCandidates);
+ QSGTexture *texture = initAndHoldTexture(resource,
+ quad->ShouldDrawWithBlending(),
+ apiDelegate);
+ QSizeF textureSize;
+ if (texture)
+ textureSize = texture->textureSize();
+ gfx::RectF uv_rect = gfx::ScaleRect(
+ gfx::BoundingRect(tquad->uv_top_left, tquad->uv_bottom_right),
+ textureSize.width(), textureSize.height());
nodeHandler->setupTextureContentNode(
- initAndHoldTexture(resource,
- quad->ShouldDrawWithBlending(),
- apiDelegate),
- toQt(quad->rect),
+ texture,
+ toQt(quad->rect), toQt(uv_rect),
resource->transferableResource().filter == GL_LINEAR
? QSGTexture::Linear
: QSGTexture::Nearest,