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 =3D imageDev->exactBounds(); - } - - void cacheImage(KisPaintDeviceSP imageDev) - { - Q_ASSERT(!imageSize.isEmpty() && imageSize.isValid()); cs =3D imageDev->colorSpace(); nChannels =3D cs->channelCount(); - imageData.Init(imageDev, imageSize); + imageData.Init(imageDev, rect); + imageSize =3D rect; } = = - void cacheMask(KisPaintDeviceSP maskDev) + void cacheMask(KisPaintDeviceSP maskDev, QRect rect) { - Q_ASSERT(!imageSize.isEmpty() && imageSize.isValid()); Q_ASSERT(maskDev->colorSpace()->pixelSize() =3D=3D 1); csMask =3D 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 =3D &distance_impl; } = - MaskedImage(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev) + MaskedImage(KisPaintDeviceSP _imageDev, KisPaintDeviceSP _maskDev, QRe= ct _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, Q= Rect maskRect) { - initial =3D new MaskedImage(dev, devMask); + initial =3D new MaskedImage(dev, devMask, maskRect); radius =3D _radius; devCache =3D dev; } @@ -984,8 +976,7 @@ QRect getMaskBoundingBox(KisPaintDeviceSP maskDev) } = = -QRect patchImage(const KisPaintDeviceSP imageDev, const KisPaintDeviceSP m= askDev, int patchRadius, int accuracy, - KisPaintDeviceSP originalImageDev, KisPaintDeviceSP patch= edImageDev) +QRect patchImage(const KisPaintDeviceSP imageDev, const KisPaintDeviceSP m= askDev, int patchRadius, int accuracy) { QRect maskRect =3D getMaskBoundingBox(maskDev); QRect imageRect =3D imageDev->exactBounds(); @@ -996,20 +987,10 @@ QRect patchImage(const KisPaintDeviceSP imageDev, con= st KisPaintDeviceSP maskDev maskRect.adjust(-dx, -dy, dx, dy); maskRect =3D maskRect.intersected(imageRect); = - KisPaintDeviceSP tempImageDev =3D new KisPaintDevice(imageDev->colorSp= ace()); - KisPaintDeviceSP tempMaskDev =3D new KisPaintDevice(maskDev->colorSpac= e()); - - tempImageDev->makeCloneFrom(imageDev, maskRect); //needed for fast red= o 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 =3D 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/plug= ins/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 patch= edImageDev); +QRect patchImage(KisPaintDeviceSP imageDev, KisPaintDeviceSP maskDev, int = radius, int accuracy); = -class KisToolSmartPatch::InpaintCommand : public KUndo2Command { +class KisToolSmartPatch::InpaintCommand : public KisTransactionBasedComman= d { public: InpaintCommand( KisPaintDeviceSP maskDev, KisPaintDeviceSP imageDev, i= nt accuracy, int patchRadius ) : - m_maskDev(maskDev), m_imageDev(imageDev), m_patchedImageDev(nullpt= r), m_accuracy(accuracy), m_patchRadius(patchRadius) {} - - void redo() override { - if( m_patchedImageDev.isNull() ){ - m_originalImageDev =3D new KisPaintDevice(m_imageDev->colorSpa= ce()); - m_patchedImageDev =3D new KisPaintDevice(m_imageDev->colorSpa= ce()); - m_modifiedRect =3D patchImage(m_imageDev, m_maskDev, m_patchRa= dius, 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 =3D nullptr; KisPaintDeviceSP maskDev =3D nullptr; KisPainter maskDevPainter; float brushRadius =3D 50.; //initial default. actually read from ui. @@ -173,12 +163,10 @@ void KisToolSmartPatch::endPrimaryAction(KoPointerEve= nt *event) = QApplication::setOverrideCursor(KisCursor::waitCursor()); = - m_d->imageDev =3D currentNode()->paintDevice(); - int accuracy =3D 50; //default accuracy - middle value int patchRadius =3D 4; //default radius, which works well for most cas= es tested = - if (!m_d.isNull() && m_d->optionsWidget) { + if (m_d->optionsWidget) { accuracy =3D m_d->optionsWidget->getAccuracy(); patchRadius =3D 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::convertToAlph= aAsAlpha(m_d->maskDev), m_d->imageDev, accuracy, patchRadius ), + applicator.applyCommand( new InpaintCommand( KisPainter::convertToAlph= aAsAlpha(m_d->maskDev), currentNode()->paintDevice(), accuracy, patchRadius= ), KisStrokeJobData::BARRIER, KisStrokeJobData::= EXCLUSIVE ); = applicator.end();