File indexing completed on 2024-04-21 15:01:14
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 #if QT_CONFIG(opengl) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0014 #include "scenegraph/shadowedtexturenode.h" 0015 #endif 0016 0017 ShadowedTexture::ShadowedTexture(QQuickItem *parentItem) 0018 : ShadowedRectangle(parentItem) 0019 { 0020 } 0021 0022 ShadowedTexture::~ShadowedTexture() 0023 { 0024 } 0025 0026 QQuickItem *ShadowedTexture::source() const 0027 { 0028 return m_source; 0029 } 0030 0031 void ShadowedTexture::setSource(QQuickItem *newSource) 0032 { 0033 if (newSource == m_source) { 0034 return; 0035 } 0036 0037 m_source = newSource; 0038 m_sourceChanged = true; 0039 if (m_source && !m_source->parentItem()) { 0040 m_source->setParentItem(this); 0041 } 0042 0043 if (!isSoftwareRendering()) { 0044 update(); 0045 } 0046 Q_EMIT sourceChanged(); 0047 } 0048 0049 QSGNode *ShadowedTexture::updatePaintNode(QSGNode *node, QQuickItem::UpdatePaintNodeData *data) 0050 { 0051 Q_UNUSED(data) 0052 #if QT_CONFIG(opengl) || QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) 0053 0054 auto shadowNode = static_cast<ShadowedRectangleNode *>(node); 0055 0056 if (!shadowNode || m_sourceChanged) { 0057 m_sourceChanged = false; 0058 delete shadowNode; 0059 if (m_source) { 0060 shadowNode = new ShadowedTextureNode{}; 0061 } else { 0062 shadowNode = new ShadowedRectangleNode{}; 0063 } 0064 0065 if (qEnvironmentVariableIsSet("KIRIGAMI_LOWPOWER_HARDWARE")) { 0066 shadowNode->setShaderType(ShadowedRectangleMaterial::ShaderType::LowPower); 0067 } 0068 } 0069 0070 shadowNode->setBorderEnabled(border()->isEnabled()); 0071 shadowNode->setRect(boundingRect()); 0072 shadowNode->setSize(shadow()->size()); 0073 shadowNode->setRadius(corners()->toVector4D(radius())); 0074 shadowNode->setOffset(QVector2D{float(shadow()->xOffset()), float(shadow()->yOffset())}); 0075 shadowNode->setColor(color()); 0076 shadowNode->setShadowColor(shadow()->color()); 0077 shadowNode->setBorderWidth(border()->width()); 0078 shadowNode->setBorderColor(border()->color()); 0079 0080 if (m_source) { 0081 static_cast<ShadowedTextureNode *>(shadowNode)->setTextureSource(m_source->textureProvider()); 0082 } 0083 0084 shadowNode->updateGeometry(); 0085 return shadowNode; 0086 #else 0087 Q_UNUSED(node) 0088 return nullptr; 0089 #endif 0090 } 0091 0092 #include "moc_shadowedtexture.cpp"