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 | |
16 | using namespace Qt::StringLiterals; |
17 | |
18 | ShadowedTexture::ShadowedTexture(QQuickItem *parentItem) |
19 | : ShadowedRectangle(parentItem) |
20 | { |
21 | } |
22 | |
23 | ShadowedTexture::~ShadowedTexture() |
24 | { |
25 | } |
26 | |
27 | QQuickItem *ShadowedTexture::source() const |
28 | { |
29 | return m_source; |
30 | } |
31 | |
32 | void 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 | |
50 | QSGNode *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 |