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 }