File indexing completed on 2024-04-28 07:44:49

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"