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 }