[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