File indexing completed on 2024-06-16 04:16:52

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Boudewijn Rempt <boud@valdyas.org>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_brush_import.h"
0008 
0009 #include <QCheckBox>
0010 #include <QBuffer>
0011 #include <QSlider>
0012 #include <QApplication>
0013 
0014 #include <kpluginfactory.h>
0015 #include <QFileInfo>
0016 
0017 #include <KoColorSpace.h>
0018 #include <KoColorSpaceRegistry.h>
0019 #include <KoColorModelStandardIds.h>
0020 
0021 #include <KisDocument.h>
0022 
0023 #include <kis_transaction.h>
0024 #include <kis_paint_device.h>
0025 #include <kis_image.h>
0026 #include <kis_paint_layer.h>
0027 #include <kis_node.h>
0028 #include <kis_group_layer.h>
0029 
0030 #include <kis_gbr_brush.h>
0031 #include <kis_imagepipe_brush.h>
0032 #include <KisAnimatedBrushAnnotation.h>
0033 #include <KisGlobalResourcesInterface.h>
0034 
0035 K_PLUGIN_FACTORY_WITH_JSON(KisBrushImportFactory, "krita_brush_import.json", registerPlugin<KisBrushImport>();)
0036 
0037 KisBrushImport::KisBrushImport(QObject *parent, const QVariantList &) : KisImportExportFilter(parent)
0038 {
0039 }
0040 
0041 KisBrushImport::~KisBrushImport()
0042 {
0043 }
0044 
0045 
0046 KisImportExportErrorCode KisBrushImport::convert(KisDocument *document, QIODevice *io, KisPropertiesConfigurationSP /*configuration*/)
0047 {
0048     QSharedPointer<KisColorfulBrush> brush;
0049 
0050     if (mimeType() == "image/x-gimp-brush") {
0051         brush = toQShared(new KisGbrBrush(filename()));
0052     }
0053     else if (mimeType() == "image/x-gimp-brush-animated") {
0054         brush = toQShared(new KisImagePipeBrush(filename()));
0055     }
0056     else {
0057         return ImportExportCodes::FileFormatIncorrect;
0058     }
0059 
0060     if (!brush->loadFromDevice(io, KisGlobalResourcesInterface::instance())) {
0061         return ImportExportCodes::FileFormatIncorrect;
0062     }
0063 
0064     if (!brush->valid()) {
0065         return ImportExportCodes::FileFormatIncorrect;;
0066     }
0067 
0068     const KoColorSpace *colorSpace = 0;
0069     if (brush->isImageType()) {
0070         colorSpace = KoColorSpaceRegistry::instance()->rgb8();
0071         brush->setBrushApplication(IMAGESTAMP);
0072     }
0073     else {
0074         colorSpace = KoColorSpaceRegistry::instance()->colorSpace(GrayAColorModelID.id(), Integer8BitsColorDepthID.id(), "");
0075     }
0076 
0077     KisImageSP image = new KisImage(document->createUndoStore(), brush->width(), brush->height(), colorSpace, brush->name());
0078     image->setProperty("brushspacing", brush->spacing());
0079 
0080     KisImagePipeBrushSP pipeBrush = brush.dynamicCast<KisImagePipeBrush>();
0081     if (pipeBrush) {
0082         QVector<KisGbrBrushSP> brushes = pipeBrush->brushes();
0083         for(int i = brushes.size(); i > 0; i--) {
0084             KisGbrBrushSP subbrush = brushes.at(i - 1);
0085             const KoColorSpace *subColorSpace = 0;
0086             if (subbrush->isImageType()) {
0087                 subColorSpace = KoColorSpaceRegistry::instance()->rgb8();
0088                 subbrush->setBrushApplication(IMAGESTAMP);
0089             }
0090             else {
0091                 subColorSpace = KoColorSpaceRegistry::instance()->colorSpace(GrayAColorModelID.id(), Integer8BitsColorDepthID.id(), "");
0092             }
0093             KisPaintLayerSP layer = new KisPaintLayer(image, image->nextLayerName(), 255, subColorSpace);
0094             layer->paintDevice()->convertFromQImage(subbrush->brushTipImage(), 0, 0, 0);
0095             image->addNode(layer, image->rootLayer());
0096         }
0097         KisAnnotationSP ann = new KisAnimatedBrushAnnotation(pipeBrush->parasite());
0098         image->addAnnotation(ann);
0099     }
0100     else {
0101         KisPaintLayerSP layer = new KisPaintLayer(image, image->nextLayerName(), 255, colorSpace);
0102         layer->paintDevice()->convertFromQImage(brush->brushTipImage(), 0, 0, 0);
0103         image->addNode(layer, image->rootLayer(), 0);
0104     }
0105 
0106     document->setCurrentImage(image);
0107     return ImportExportCodes::OK;
0108 
0109 }
0110 #include "kis_brush_import.moc"