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"