File indexing completed on 2024-03-24 03:58:52
0001 /* 0002 * SPDX-FileCopyrightText: 2020 Arjen Hiemstra <ahiemstra@heimr.nl> 0003 * 0004 * SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "shadowedtexture.h" 0008 0009 #include <QQuickWindow> 0010 #include <QSGRectangleNode> 0011 #include <QSGRendererInterface> 0012 0013 #include "scenegraph/shadowedtexturenode.h" 0014 0015 ShadowedTexture::ShadowedTexture(QQuickItem *parentItem) 0016 : ShadowedRectangle(parentItem) 0017 { 0018 } 0019 0020 ShadowedTexture::~ShadowedTexture() 0021 { 0022 } 0023 0024 QQuickItem *ShadowedTexture::source() const 0025 { 0026 return m_source; 0027 } 0028 0029 void ShadowedTexture::setSource(QQuickItem *newSource) 0030 { 0031 if (newSource == m_source) { 0032 return; 0033 } 0034 0035 m_source = newSource; 0036 m_sourceChanged = true; 0037 if (m_source && !m_source->parentItem()) { 0038 m_source->setParentItem(this); 0039 } 0040 0041 if (!isSoftwareRendering()) { 0042 update(); 0043 } 0044 Q_EMIT sourceChanged(); 0045 } 0046 0047 QSGNode *ShadowedTexture::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *data) 0048 { 0049 Q_UNUSED(data) 0050 0051 if (boundingRect().isEmpty()) { 0052 delete node; 0053 return nullptr; 0054 } 0055 0056 auto shadowNode = static_cast<ShadowedRectangleNode *>(node); 0057 0058 if (!shadowNode || m_sourceChanged) { 0059 m_sourceChanged = false; 0060 delete shadowNode; 0061 if (m_source) { 0062 shadowNode = new ShadowedTextureNode{}; 0063 } else { 0064 shadowNode = new ShadowedRectangleNode{}; 0065 } 0066 0067 if (qEnvironmentVariableIsSet("KIRIGAMI_LOWPOWER_HARDWARE")) { 0068 shadowNode->setShaderType(ShadowedRectangleMaterial::ShaderType::LowPower); 0069 } 0070 } 0071 0072 shadowNode->setBorderEnabled(border()->isEnabled()); 0073 shadowNode->setRect(boundingRect()); 0074 shadowNode->setSize(shadow()->size()); 0075 shadowNode->setRadius(corners()->toVector4D(radius())); 0076 shadowNode->setOffset(QVector2D{float(shadow()->xOffset()), float(shadow()->yOffset())}); 0077 shadowNode->setColor(color()); 0078 shadowNode->setShadowColor(shadow()->color()); 0079 shadowNode->setBorderWidth(border()->width()); 0080 shadowNode->setBorderColor(border()->color()); 0081 0082 if (m_source) { 0083 static_cast<ShadowedTextureNode *>(shadowNode)->setTextureSource(m_source->textureProvider()); 0084 } 0085 0086 shadowNode->updateGeometry(); 0087 return shadowNode; 0088 } 0089 0090 #include "moc_shadowedtexture.cpp"