[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [krita/eingerman/T3589-healbrush] plugins/tools/tool_smart_patch: Addressed code review comments.
From:       Eugene Ingerman <null () kde ! org>
Date:       2017-04-30 22:47:12
Message-ID: E1d4xcW-00023s-DX () code ! kde ! org
[Download RAW message or body]

Git commit 0841dc9e991e1de16ed53dd9bdad6ebbfd1410fe by Eugene Ingerman.
Committed on 30/04/2017 at 22:46.
Pushed by eingerman into branch 'eingerman/T3589-healbrush'.

Addressed code review comments.

M  +15   -34   plugins/tools/tool_smart_patch/kis_inpaint.cpp
M  +12   -24   plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp

https://commits.kde.org/krita/0841dc9e991e1de16ed53dd9bdad6ebbfd1410fe

diff --git a/plugins/tools/tool_smart_patch/kis_inpaint.cpp \
b/plugins/tools/tool_smart_patch/kis_inpaint.cpp index 631b4f96d4d..da6471a138b \
                100644
--- a/plugins/tools/tool_smart_patch/kis_inpaint.cpp
+++ b/plugins/tools/tool_smart_patch/kis_inpaint.cpp
@@ -223,26 +223,20 @@ private:
     ImageData imageData;
 
 
-    void cacheImageSize(KisPaintDeviceSP imageDev)
+    void cacheImage(KisPaintDeviceSP imageDev, QRect rect)
     {
-        imageSize = imageDev->exactBounds();
-    }
-
-    void cacheImage(KisPaintDeviceSP imageDev)
-    {
-        Q_ASSERT(!imageSize.isEmpty() && imageSize.isValid());
         cs = imageDev->colorSpace();
         nChannels = cs->channelCount();
-        imageData.Init(imageDev, imageSize);
+        imageData.Init(imageDev, rect);
+        imageSize = rect;
     }
 
 
-    void cacheMask(KisPaintDeviceSP maskDev)
+    void cacheMask(KisPaintDeviceSP maskDev, QRect rect)
     {
-        Q_ASSERT(!imageSize.isEmpty() && imageSize.isValid());
         Q_ASSERT(maskDev->colorSpace()->pixelSize() == 1);
         csMask = maskDev->colorSpace();
-        maskData.Init(maskDev, imageSize);
+        maskData.Init(maskDev, rect);
 
         //hard threshold for the initial mask
         //may be optional. needs testing
@@ -272,11 +266,10 @@ public:
         std::fill(maskData.data(), maskData.data() + maskData.num_bytes(), \
MASK_CLEAR);  }
 
-    void initialize(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev)
+    void initialize(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev, QRect \
_maskRect)  {
-        cacheImageSize(_imageDev);
-        cacheImage(_imageDev);
-        cacheMask(_maskDev);
+        cacheImage(_imageDev, _maskRect);
+        cacheMask(_maskDev, _maskRect);
 
         //distance function is the only that needs to know the type
         //For performance reasons we can't use functions provided by color space
@@ -298,10 +291,9 @@ public:
             distance = &distance_impl<KoRgbF64Traits::channels_type>;
     }
 
-    MaskedImage(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev)
+    MaskedImage(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev, QRect \
_maskRect)  {
-        initialize(_imageDev, _maskDev);
-//        DebugDump("Initialize");
+        initialize(_imageDev, _maskDev, _maskRect);
     }
 
     void downsample2x(void)
@@ -768,9 +760,9 @@ private:
 
 
 public:
-    Inpaint(KisPaintDeviceSP dev, KisPaintDeviceSP devMask, int _radius)
+    Inpaint(KisPaintDeviceSP dev, KisPaintDeviceSP devMask, int _radius, QRect \
maskRect)  {
-        initial = new MaskedImage(dev, devMask);
+        initial = new MaskedImage(dev, devMask, maskRect);
         radius = _radius;
         devCache = dev;
     }
@@ -984,8 +976,7 @@ QRect getMaskBoundingBox(KisPaintDeviceSP maskDev)
 }
 
 
-QRect patchImage(const KisPaintDeviceSP imageDev, const KisPaintDeviceSP maskDev, \
                int patchRadius, int accuracy,
-                 KisPaintDeviceSP originalImageDev, KisPaintDeviceSP \
patchedImageDev) +QRect patchImage(const KisPaintDeviceSP imageDev, const \
KisPaintDeviceSP maskDev, int patchRadius, int accuracy)  {
     QRect maskRect = getMaskBoundingBox(maskDev);
     QRect imageRect = imageDev->exactBounds();
@@ -996,20 +987,10 @@ QRect patchImage(const KisPaintDeviceSP imageDev, const \
KisPaintDeviceSP maskDev  maskRect.adjust(-dx, -dy, dx, dy);
     maskRect = maskRect.intersected(imageRect);
 
-    KisPaintDeviceSP tempImageDev = new KisPaintDevice(imageDev->colorSpace());
-    KisPaintDeviceSP tempMaskDev = new KisPaintDevice(maskDev->colorSpace());
-
-    tempImageDev->makeCloneFrom(imageDev, maskRect); //needed for fast redo \
                operation
-    originalImageDev->makeCloneFrom(imageDev, maskRect); //needed for undo operation
-
-    tempMaskDev->makeCloneFrom(maskDev, maskRect);
-
     if (!maskRect.isEmpty()) {
-        //Inpaint inpaint(tempImageDev, tempMaskDev, patchRadius);
-        Inpaint inpaint(imageDev, maskDev, patchRadius);
+        Inpaint inpaint(imageDev, maskDev, patchRadius, maskRect);
         MaskedImageSP output = inpaint.patch();
-
-        output->toPaintDevice(patchedImageDev, maskRect);
+        output->toPaintDevice(imageDev, maskRect);
     }
 
     return maskRect;
diff --git a/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp \
b/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp index \
                3fc05d2690d..8aae695636c 100644
--- a/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
+++ b/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
@@ -31,6 +31,9 @@
 
 #include "kundo2magicstring.h"
 #include "kundo2stack.h"
+#include "kis_transaction_based_command.h"
+#include "kis_transaction.h"
+
 #include "kis_processing_applicator.h"
 #include "kis_datamanager.h"
 
@@ -41,38 +44,25 @@
 
 #include "kis_paint_layer.h"
 
-QRect patchImage(KisPaintDeviceSP imageDev, KisPaintDeviceSP maskDev, int radius, \
                int accuracy,
-                 KisPaintDeviceSP originalImageDev, KisPaintDeviceSP \
patchedImageDev); +QRect patchImage(KisPaintDeviceSP imageDev, KisPaintDeviceSP \
maskDev, int radius, int accuracy);  
-class KisToolSmartPatch::InpaintCommand : public KUndo2Command {
+class KisToolSmartPatch::InpaintCommand : public KisTransactionBasedCommand {
 public:
     InpaintCommand( KisPaintDeviceSP maskDev, KisPaintDeviceSP imageDev, int \
                accuracy, int patchRadius ) :
-        m_maskDev(maskDev), m_imageDev(imageDev), m_patchedImageDev(nullptr), \
                m_accuracy(accuracy), m_patchRadius(patchRadius) {}
-
-    void redo() override {
-        if( m_patchedImageDev.isNull() ){
-            m_originalImageDev = new KisPaintDevice(m_imageDev->colorSpace());
-            m_patchedImageDev  = new KisPaintDevice(m_imageDev->colorSpace());
-            m_modifiedRect = patchImage(m_imageDev, m_maskDev, m_patchRadius, \
                m_accuracy, m_originalImageDev, m_patchedImageDev);
-        }
-        m_imageDev->dataManager()->bitBlt( m_patchedImageDev->dataManager(), \
                m_modifiedRect);
-    }
+        m_maskDev(maskDev), m_imageDev(imageDev), m_accuracy(accuracy), \
m_patchRadius(patchRadius) {}  
-    void undo() override {
-        Q_ASSERT(!m_originalImageDev.isNull());
-        m_imageDev->dataManager()->bitBlt( m_originalImageDev->dataManager(), \
m_modifiedRect); +    KUndo2Command* paint() override {
+        KisTransaction transaction(m_imageDev);
+        patchImage(m_imageDev, m_maskDev, m_patchRadius, m_accuracy);
+        return transaction.endAndTake();
     }
 
 private:
     KisPaintDeviceSP m_maskDev, m_imageDev;
-    KisPaintDeviceSP m_originalImageDev;
-    KisPaintDeviceSP m_patchedImageDev;
-    QRect m_modifiedRect;
     int m_accuracy, m_patchRadius;
 };
 
 struct KisToolSmartPatch::Private {
-    KisPaintDeviceSP imageDev = nullptr;
     KisPaintDeviceSP maskDev = nullptr;
     KisPainter maskDevPainter;
     float brushRadius = 50.; //initial default. actually read from ui.
@@ -173,12 +163,10 @@ void KisToolSmartPatch::endPrimaryAction(KoPointerEvent *event)
 
     QApplication::setOverrideCursor(KisCursor::waitCursor());
 
-    m_d->imageDev = currentNode()->paintDevice();
-
     int accuracy = 50; //default accuracy - middle value
     int patchRadius = 4; //default radius, which works well for most cases tested
 
-    if (!m_d.isNull() && m_d->optionsWidget) {
+    if (m_d->optionsWidget) {
         accuracy = m_d->optionsWidget->getAccuracy();
         patchRadius = m_d->optionsWidget->getPatchRadius();
     }
@@ -187,7 +175,7 @@ void KisToolSmartPatch::endPrimaryAction(KoPointerEvent *event)
                                         kundo2_i18n("Smart Patch"));
 
     //actual inpaint operation. filling in areas masked by user
-    applicator.applyCommand( new InpaintCommand( \
KisPainter::convertToAlphaAsAlpha(m_d->maskDev), m_d->imageDev, accuracy, patchRadius \
), +    applicator.applyCommand( new InpaintCommand( \
KisPainter::convertToAlphaAsAlpha(m_d->maskDev), currentNode()->paintDevice(), \
                accuracy, patchRadius ),
                              KisStrokeJobData::BARRIER, KisStrokeJobData::EXCLUSIVE \
);  
     applicator.end();


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic