diff --git a/krita/plugins/extensions/gmic/kis_gmic_applicator.cpp b/krita/plugins/extensions/gmic/kis_gmic_applicator.cpp index b853e74da7b..9ec7588b1c4 100644 --- a/krita/plugins/extensions/gmic/kis_gmic_applicator.cpp +++ b/krita/plugins/extensions/gmic/kis_gmic_applicator.cpp @@ -1,162 +1,166 @@ /* * Copyright (c) 2013 Lukáš Tvrdý #include #include #include #include "kis_gmic_command.h" #include "kis_import_gmic_processing_visitor.h" #include "kis_image.h" #include #include #include #include "kis_gmic_synchronize_layers_command.h" #include "kis_export_gmic_processing_visitor.h" #include "kis_gmic_synchronize_image_size_command.h" KisGmicApplicator::KisGmicApplicator():m_applicator(0),m_applicatorStrokeEnded(false) { } KisGmicApplicator::~KisGmicApplicator() { dbgPlugins << "Destructor: " << m_applicator; delete m_applicator; } void KisGmicApplicator::setProperties(KisImageWSP image, KisNodeSP node, const KUndo2MagicString &actionName, KisNodeListSP kritaNodes, const QString &gmicCommand, const QByteArray customCommands) { m_image = image; m_node = node; m_actionName = actionName; m_kritaNodes = kritaNodes; m_gmicCommand = gmicCommand; m_customCommands = customCommands; } void KisGmicApplicator::preview() { // cancel previous preview if there is one dbgPlugins << "Request for preview, cancelling any previous possible on-canvas preview"; cancel(); KisImageSignalVector emitSignals; emitSignals << ComplexSizeChangedSignal() << ModifiedSignal; m_applicator = new KisProcessingApplicator(m_image, m_node, KisProcessingApplicator::RECURSIVE | KisProcessingApplicator::NO_UI_UPDATES, emitSignals, m_actionName); dbgPlugins << "Created applicator " << m_applicator; QSharedPointer< gmic_list > gmicLayers(new gmic_list); gmicLayers->assign(m_kritaNodes->size()); m_gmicData = KisGmicDataSP(new KisGmicData()); QRect layerSize; KisSelectionSP selection = m_image->globalSelection(); if (selection) { layerSize = selection->selectedExactRect(); } else { layerSize = QRect(0,0,m_image->width(), m_image->height()); } // convert krita layers to gmic layers KisProcessingVisitorSP exportVisitor = new KisExportGmicProcessingVisitor(m_kritaNodes, gmicLayers, layerSize); m_applicator->applyVisitor(exportVisitor, KisStrokeJobData::CONCURRENT); // apply gmic filters to provided layers KisGmicCommand * gmicCommand = new KisGmicCommand(m_gmicCommand, gmicLayers, m_gmicData, m_customCommands); connect(gmicCommand, SIGNAL(gmicFinished(bool, int, QString)), this, SIGNAL(gmicFinished(bool,int,QString))); m_applicator->applyCommand(gmicCommand); - // synchronize Krita image size with biggest gmic layer size - m_applicator->applyCommand(new KisGmicSynchronizeImageSizeCommand(gmicLayers, m_image)); + + if (!selection) + { + // synchronize Krita image size with biggest gmic layer size + m_applicator->applyCommand(new KisGmicSynchronizeImageSizeCommand(gmicLayers, m_image)); + } // synchronize layer count m_applicator->applyCommand(new KisGmicSynchronizeLayersCommand(m_kritaNodes, gmicLayers, m_image, layerSize, selection), KisStrokeJobData::SEQUENTIAL, KisStrokeJobData::EXCLUSIVE); KisProcessingVisitorSP importVisitor = new KisImportGmicProcessingVisitor(m_kritaNodes, gmicLayers, layerSize, selection); m_applicator->applyVisitor(importVisitor, KisStrokeJobData::SEQUENTIAL); // undo information is stored in this visitor m_applicator->explicitlyEmitFinalSignals(); } void KisGmicApplicator::cancel() { if (m_gmicData) { dbgPlugins << "Cancel gmic script"; m_gmicData->setCancel(true); } if (m_applicator) { if (!m_applicatorStrokeEnded) { dbgPlugins << "Cancelling applicator: Yes!"; m_applicator->cancel(); } else { dbgPlugins << "Cancelling applicator: No! Reason: Already finished!"; } dbgPlugins << "deleting applicator: " << m_applicator; delete m_applicator; m_applicator = 0; m_applicatorStrokeEnded = false; dbgPlugins << ppVar(m_applicatorStrokeEnded); } else { dbgPlugins << "Cancelling applicator: No! Reason: Null applicator!"; } } void KisGmicApplicator::finish() { dbgPlugins << "aplicator " << m_applicator << " finished"; if (m_applicator) { m_applicator->end(); m_applicatorStrokeEnded = true; } dbgPlugins << ppVar(m_applicatorStrokeEnded); } float KisGmicApplicator::getProgress() const { if (m_gmicData) { m_gmicData->progress(); } return KisGmicData::INVALID_PROGRESS_VALUE; }