[graphics/krita/krita/4.3] libs: Fill Layers: create layer without additional update jobs

L. E. Segovia null at kde.org
Wed Aug 19 00:04:39 BST 2020


Git commit 8c3a4c8dc9268bf434007e4ce07b2a8821cec405 by L. E. Segovia.
Committed on 18/08/2020 at 22:51.
Pushed by lsegovia into branch 'krita/4.3'.

Fill Layers: create layer without additional update jobs

This still preserves a last setFilter which fixes in-place the
configuration, as the updates are throttled via the dialog's signal
compressor.

CCMAIL: kimageshop at kde.org

M  +21   -4    libs/image/generator/kis_generator_layer.cpp
M  +13   -1    libs/image/generator/kis_generator_layer.h
M  +3    -3    libs/image/generator/kis_generator_stroke_strategy.cpp
M  +3    -2    libs/ui/dialogs/kis_dlg_generator_layer.cpp

https://invent.kde.org/graphics/krita/commit/8c3a4c8dc9268bf434007e4ce07b2a8821cec405

diff --git a/libs/image/generator/kis_generator_layer.cpp b/libs/image/generator/kis_generator_layer.cpp
index cd973972e7..a79a0006a4 100644
--- a/libs/image/generator/kis_generator_layer.cpp
+++ b/libs/image/generator/kis_generator_layer.cpp
@@ -78,13 +78,18 @@ KisGeneratorLayer::~KisGeneratorLayer()
 }
 
 void KisGeneratorLayer::setFilter(KisFilterConfigurationSP filterConfig)
+{
+    setFilterWithoutUpdate(filterConfig);
+    m_d->updateSignalCompressor.start();
+}
+
+void KisGeneratorLayer::setFilterWithoutUpdate(KisFilterConfigurationSP filterConfig)
 {
     KisSelectionBasedLayer::setFilter(filterConfig);
     {
         QMutexLocker(&m_d->mutex);
         m_d->preparedRect = QRect();
     }
-    m_d->updateSignalCompressor.start();
 }
 
 void KisGeneratorLayer::slotDelayedStaticUpdate()
@@ -116,7 +121,7 @@ void KisGeneratorLayer::requestUpdateJobsWithStroke(KisStrokeId strokeId, KisFil
 
     if (filterConfig != m_d->preparedForFilter) {
         locker.unlock();
-        resetCache();
+        resetCacheWithoutUpdate();
         locker.relock();
     }
 
@@ -144,8 +149,9 @@ void KisGeneratorLayer::requestUpdateJobsWithStroke(KisStrokeId strokeId, KisFil
     m_d->preparedForFilter = filterConfig;
 }
 
-void KisGeneratorLayer::previewWithStroke(const KisStrokeId strokeId, const KisFilterConfigurationSP filterConfig)
+void KisGeneratorLayer::previewWithStroke(const KisStrokeId strokeId)
 {
+    KisFilterConfigurationSP filterConfig = filter();
     KIS_SAFE_ASSERT_RECOVER_RETURN(filterConfig);
 
     requestUpdateJobsWithStroke(strokeId, filterConfig);
@@ -215,6 +221,12 @@ void KisGeneratorLayer::setY(qint32 y)
 }
 
 void KisGeneratorLayer::resetCache()
+{
+    resetCacheWithoutUpdate();
+    m_d->updateSignalCompressor.start();
+}
+
+void KisGeneratorLayer::resetCacheWithoutUpdate()
 {
     KisSelectionBasedLayer::resetCache();
     {
@@ -225,6 +237,11 @@ void KisGeneratorLayer::resetCache()
 
 void KisGeneratorLayer::setDirty(const QVector<QRect> &rects)
 {
-    KisSelectionBasedLayer::setDirty(rects);
+    setDirtyWithoutUpdate(rects);
+    m_d->updateSignalCompressor.start();
 }
 
+void KisGeneratorLayer::setDirtyWithoutUpdate(const QVector<QRect> &rects)
+{
+    KisSelectionBasedLayer::setDirty(rects);
+}
diff --git a/libs/image/generator/kis_generator_layer.h b/libs/image/generator/kis_generator_layer.h
index ad8f1171b9..9ab60cc22d 100644
--- a/libs/image/generator/kis_generator_layer.h
+++ b/libs/image/generator/kis_generator_layer.h
@@ -54,6 +54,10 @@ public:
     }
 
     void setFilter(KisFilterConfigurationSP filterConfig) override;
+    /**
+     * Changes the filter configuration without triggering an update.
+     */
+    void setFilterWithoutUpdate(KisFilterConfigurationSP filterConfig);
 
     bool accept(KisNodeVisitor &) override;
     void accept(KisProcessingVisitor &visitor, KisUndoAdapter *undoAdapter) override;
@@ -70,10 +74,14 @@ public:
      * re-runs the generator with the specified configuration.
      * Used for previewing the layer inside the stroke.
      */
-    void previewWithStroke(const KisStrokeId stroke, const KisFilterConfigurationSP configuration);
+    void previewWithStroke(const KisStrokeId stroke);
 
     using KisSelectionBasedLayer::setDirty;
     void setDirty(const QVector<QRect> &rects) override;
+    /**
+     * Updates the selected tiles without triggering the update job.
+     */
+    void setDirtyWithoutUpdate(const QVector<QRect> &rects);
     void setX(qint32 x) override;
     void setY(qint32 y) override;
 
@@ -87,6 +95,10 @@ private:
      * Injects render jobs into the given stroke.
      */
     void requestUpdateJobsWithStroke(const KisStrokeId stroke, const KisFilterConfigurationSP configuration);
+    /**
+     * Resets the projection cache without triggering the update job.
+     */
+    void resetCacheWithoutUpdate();
 
 public:
     // KisIndirectPaintingSupport
diff --git a/libs/image/generator/kis_generator_stroke_strategy.cpp b/libs/image/generator/kis_generator_stroke_strategy.cpp
index 8a41803f3b..68060e3d80 100644
--- a/libs/image/generator/kis_generator_stroke_strategy.cpp
+++ b/libs/image/generator/kis_generator_stroke_strategy.cpp
@@ -28,7 +28,7 @@
 #include "kis_generator_stroke_strategy.h"
 
 KisGeneratorStrokeStrategy::KisGeneratorStrokeStrategy()
-    : KisRunnableBasedStrokeStrategy(QLatin1String("KisGenerator"), kundo2_noi18n("KisGenerator"))
+    : KisRunnableBasedStrokeStrategy(QLatin1String("KisGenerator"), kundo2_i18n("Fill Layer Render"))
 {
     enableJob(KisSimpleStrokeStrategy::JOB_INIT, true, KisStrokeJobData::BARRIER, KisStrokeJobData::EXCLUSIVE);
     enableJob(KisSimpleStrokeStrategy::JOB_DOSTROKE);
@@ -62,7 +62,7 @@ QVector<KisStrokeJobData *>KisGeneratorStrokeStrategy::createJobsData(const KisG
 
                     // HACK ALERT!!!
                     // this avoids cyclic loop with KisRecalculateGeneratorLayerJob::run()
-                    const_cast<KisGeneratorLayerSP &>(layer)->setDirty({tile});
+                    const_cast<KisGeneratorLayerSP &>(layer)->setDirtyWithoutUpdate({tile});
                 });
             }
         } else {
@@ -75,7 +75,7 @@ QVector<KisStrokeJobData *>KisGeneratorStrokeStrategy::createJobsData(const KisG
 
                 // HACK ALERT!!!
                 // this avoids cyclic loop with KisRecalculateGeneratorLayerJob::run()
-                const_cast<KisGeneratorLayerSP &>(layer)->setDirty({rc});
+                const_cast<KisGeneratorLayerSP &>(layer)->setDirtyWithoutUpdate({rc});
             });
         }
     }
diff --git a/libs/ui/dialogs/kis_dlg_generator_layer.cpp b/libs/ui/dialogs/kis_dlg_generator_layer.cpp
index caea203707..1998f33eb0 100644
--- a/libs/ui/dialogs/kis_dlg_generator_layer.cpp
+++ b/libs/ui/dialogs/kis_dlg_generator_layer.cpp
@@ -71,7 +71,7 @@ KisDlgGeneratorLayer::KisDlgGeneratorLayer(const QString & defaultName, KisViewM
     connect(&m_compressor, SIGNAL(timeout()), this, SLOT(slotDelayedPreviewGenerator()));
 
     if (layer && !isEditing) {
-        layer->setFilter(configuration());
+        slotDelayedPreviewGenerator();
     }
 }
 
@@ -125,7 +125,8 @@ void KisDlgGeneratorLayer::slotNameChanged(const QString & text)
 void KisDlgGeneratorLayer::slotDelayedPreviewGenerator()
 {
     if (!m_stroke.isNull()) {
-        layer->previewWithStroke(m_stroke, configuration());
+        layer->setFilterWithoutUpdate(configuration());
+        layer->previewWithStroke(m_stroke);
     }
 }
 



More information about the kimageshop mailing list