1/*
2 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7#include "shadowedtexture.h"
8
9#include <QQuickWindow>
10#include <QSGRectangleNode>
11#include <QSGRendererInterface>
12
13#include "scenegraph/shadernode.h"
14#include "scenegraph/softwarerectanglenode.h"
15
16using namespace Qt::StringLiterals;
17
18ShadowedTexture::ShadowedTexture(QQuickItem *parentItem)
19 : ShadowedRectangle(parentItem)
20{
21}
22
23ShadowedTexture::~ShadowedTexture()
24{
25}
26
27QQuickItem *ShadowedTexture::source() const
28{
29 return m_source;
30}
31
32void ShadowedTexture::setSource(QQuickItem *newSource)
33{
34 if (newSource == m_source) {
35 return;
36 }
37
38 m_source = newSource;
39 m_sourceChanged = true;
40 if (m_source && !m_source->parentItem()) {
41 m_source->setParentItem(this);
42 }
43
44 if (!isSoftwareRendering()) {
45 update();
46 }
47 Q_EMIT sourceChanged();
48}
49
50QSGNode *ShadowedTexture::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *data)
51{
52 Q_UNUSED(data)
53
54 if (boundingRect().isEmpty()) {
55 delete node;
56 return nullptr;
57 }
58
59 if (isSoftwareRendering()) {
60 auto rectangleNode = static_cast<SoftwareRectangleNode *>(node);
61 if (!rectangleNode) {
62 rectangleNode = new SoftwareRectangleNode{};
63 }
64
65 rectangleNode->setRect(boundingRect());
66 rectangleNode->setWindow(window());
67 rectangleNode->setColor(color());
68 rectangleNode->setRadius(radius());
69 rectangleNode->setBorderWidth(border()->width());
70 rectangleNode->setBorderColor(border()->color());
71
72 if (m_source) {
73 rectangleNode->setTextureProvider(m_source->textureProvider());
74 }
75
76 return rectangleNode;
77 }
78
79 auto shaderNode = static_cast<ShaderNode *>(node);
80 if (!shaderNode) {
81 shaderNode = new ShaderNode{};
82 }
83
84 QString shader = u"shadowed"_s;
85 if (border()->isEnabled()) {
86 shader += u"_border"_s;
87 }
88
89 if (m_source) {
90 shader += u"_texture"_s;
91 } else {
92 shader += u"_rectangle"_s;
93 }
94
95 if (isLowPowerRendering()) {
96 shader += u"_lowpower"_s;
97 }
98
99 shaderNode->setShader(shader);
100 shaderNode->setUniformBufferSize(sizeof(float) * 40);
101
102 updateShaderNode(shaderNode);
103
104 if (m_source) {
105 shaderNode->setTexture(channel: 0, provider: m_source->textureProvider());
106 }
107
108 shaderNode->update();
109
110 return shaderNode;
111}
112
113#include "moc_shadowedtexture.cpp"
114

source code of kirigami/src/primitives/shadowedtexture.cpp