File indexing completed on 2025-03-09 04:06:00

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "ImageBuilder.h"
0008 #include "DocumentManager.h"
0009 
0010 #include <QApplication>
0011 #include <QDesktopWidget>
0012 
0013 #include <KoCompositeOpRegistry.h>
0014 
0015 #include <KisDocument.h>
0016 #include <kis_image.h>
0017 #include <kis_config.h>
0018 #include <kis_clipboard.h>
0019 #include <kis_layer.h>
0020 #include <kis_painter.h>
0021 #include "kis_paint_layer.h"
0022 #include "kis_import_catcher.h"
0023 
0024 
0025 ImageBuilder::ImageBuilder(QObject* parent)
0026 : QObject(parent)
0027 {
0028 }
0029 
0030 ImageBuilder::~ImageBuilder()
0031 {
0032 
0033 }
0034 
0035 QString ImageBuilder::createBlankImage(int width, int height, int resolution)
0036 {
0037     DocumentManager::instance()->newDocument(width, height, resolution / 72.0f);
0038     return QString("temp://%1x%2").arg(width).arg(height);
0039 }
0040 
0041 QString ImageBuilder::createBlankImage(const QVariantMap& options)
0042 {
0043     DocumentManager::instance()->newDocument(options);
0044     return QString("temp://custom");
0045 }
0046 
0047 QString ImageBuilder::createImageFromClipboard()
0048 {
0049     QSize sz = KisClipboard::instance()->clipSize();
0050     KisPaintDeviceSP clipDevice = KisClipboard::instance()->clip(QRect(0, 0, sz.width(), sz.height()), false);
0051 
0052     if (clipDevice) {
0053         connect(DocumentManager::instance(), SIGNAL(documentChanged()), SLOT(createImageFromClipboardDelayed()));
0054         DocumentManager::instance()->newDocument(sz.width(), sz.height(), 1.0);
0055     }
0056     else {
0057         sz.setWidth(qApp->desktop()->width());
0058         sz.setHeight(qApp->desktop()->height());
0059         DocumentManager::instance()->newDocument(sz.width(), sz.height(), 1.0f);
0060     }
0061     return QString("temp://%1x%2").arg(sz.width()).arg(sz.height());
0062 }
0063 
0064 void ImageBuilder::createImageFromClipboardDelayed()
0065 {
0066     DocumentManager::instance()->disconnect(this, SLOT(createImageFromClipboardDelayed()));
0067 
0068     KisPaintDeviceSP clip = KisClipboard::instance()->clip(QRect(), true);
0069     KisImageWSP image = DocumentManager::instance()->document()->image();
0070     if (image && image->root() && image->root()->firstChild()) {
0071         KisNodeSP node = image->root()->firstChild();
0072         while (node && (!dynamic_cast<KisPaintLayer*>(node.data()) || node->userLocked())) {
0073             node = node->nextSibling();
0074         }
0075 
0076         if (!node) {
0077             KisPaintLayerSP newLayer = new KisPaintLayer(image, image->nextLayerName(), OPACITY_OPAQUE_U8);
0078             image->addNode(newLayer);
0079             node = newLayer;
0080         }
0081 
0082         KIS_SAFE_ASSERT_RECOVER_RETURN(node);
0083 
0084         KisPaintLayer * layer = dynamic_cast<KisPaintLayer*>(node.data());
0085         KIS_SAFE_ASSERT_RECOVER_RETURN(layer);
0086 
0087         layer->setOpacity(OPACITY_OPAQUE_U8);
0088         const QRect r = clip->exactBounds();
0089         KisImportCatcher::adaptClipToImageColorSpace(clip, image);
0090 
0091         KisPainter::copyAreaOptimized(QPoint(), clip, layer->paintDevice(), r);
0092         layer->setDirty();
0093 
0094     }
0095 }
0096 
0097 QString ImageBuilder::createImageFromTemplate(const QVariantMap& options)
0098 {
0099     DocumentManager::instance()->newDocument(options);
0100     return QString("temp://%1").arg(options.value("template").toString());
0101 }