File indexing completed on 2024-05-19 12:42:34

0001 /*
0002  * This file is part of the KDE project
0003  *
0004  * SPDX-FileCopyrightText: 2013 Arjen Hiemstra <ahiemstra@heimr.nl>
0005  *
0006  * SPDX-License-Identifier: LGPL-2.0-or-later
0007  *
0008  */
0009 
0010 #include "ImageDataItem.h"
0011 
0012 #include <QPixmap>
0013 #include <QSGSimpleTextureNode>
0014 #include <QQuickWindow>
0015 
0016 using namespace Calligra::Components;
0017 
0018 class ImageDataItem::Private
0019 {
0020 public:
0021     Private() : imageChanged(false)
0022     { }
0023 
0024     QImage data;
0025     bool imageChanged;
0026 };
0027 
0028 ImageDataItem::ImageDataItem(QQuickItem* parent)
0029     : QQuickItem{parent}, d{new Private}
0030 {
0031     setFlag(QQuickItem::ItemHasContents, true);
0032 }
0033 
0034 ImageDataItem::~ImageDataItem()
0035 {
0036     delete d;
0037 }
0038 
0039 QImage ImageDataItem::data() const
0040 {
0041     return d->data;
0042 }
0043 
0044 void ImageDataItem::setData(const QImage& newValue)
0045 {
0046     if(newValue != d->data) {
0047         d->data = newValue;
0048         setImplicitWidth(d->data.width());
0049         setImplicitHeight(d->data.height());
0050         d->imageChanged = true;
0051         update();
0052         emit dataChanged();
0053     }
0054 }
0055 
0056 QSGNode* ImageDataItem::updatePaintNode(QSGNode* node, QQuickItem::UpdatePaintNodeData*)
0057 {
0058     if(d->data.isNull()) {
0059         return node;
0060     }
0061 
0062     float w = widthValid() ? width() : d->data.width();
0063     float h = heightValid() ? height() : d->data.height();
0064 
0065     auto texNode = static_cast<QSGSimpleTextureNode*>(node);
0066     if(!texNode) {
0067         texNode = new QSGSimpleTextureNode{};
0068     }
0069     texNode->setRect(0, 0, w, h);
0070 
0071     if (!texNode->texture() || d->imageChanged) {
0072         delete texNode->texture();
0073         auto texture = window()->createTextureFromImage(d->data);
0074         texNode->setTexture(texture);
0075         d->imageChanged = false;
0076     }
0077 
0078     return texNode;
0079 }