[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [krita/eingerman/T3589-healbrush] /: Removed unused include files. Code cleanup.
From: Eugene Ingerman <null () kde ! org>
Date: 2017-04-28 7:42:03
Message-ID: E1d40XT-00017P-AB () code ! kde ! org
[Download RAW message or body]
Git commit 6ac411594c1367b9dbe2b7535954e3eadd641b66 by Eugene Ingerman.
Committed on 28/04/2017 at 07:41.
Pushed by eingerman into branch 'eingerman/T3589-healbrush'.
Removed unused include files. Code cleanup.
M +3 -3 libs/ui/tool/kis_tool.h
M +2 -2 plugins/tools/tool_smart_patch/kis_inpaint.cpp
M +2 -30 plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
https://commits.kde.org/krita/6ac411594c1367b9dbe2b7535954e3eadd641b66
diff --cc plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
index 128e34031db,d65329bd732..3fc05d2690d
--- a/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
+++ b/plugins/tools/tool_smart_patch/kis_tool_smart_patch.cpp
@@@ -19,80 -19,44 +19,66 @@@
#include "kis_tool_smart_patch.h"
#include "QApplication"
+#include "QPainterPath"
#include <klocalizedstring.h>
--#include <KoCanvasBase.h>
-
+#include <KoColor.h>
#include <KisViewManager.h>
#include "kis_canvas2.h"
#include "kis_cursor.h"
--#include "kis_config.h"
+#include "kis_painter.h"
+#include "kis_paintop_preset.h"
+
#include "kundo2magicstring.h"
++#include "kundo2stack.h"
+#include "kis_processing_applicator.h"
+#include "kis_datamanager.h"
--#include "KoProperties.h"
#include "KoColorSpaceRegistry.h"
--#include "KoShapeController.h"
--#include "KoDocumentResourceManager.h"
- //#include "kis_node_manager.h"
-#include "kis_node_manager.h"
--#include "kis_cursor.h"
#include "kis_tool_smart_patch_options_widget.h"
#include "libs/image/kis_paint_device_debug_utils.h"
--#include "kis_resources_snapshot.h"
--#include "kis_layer.h"
--#include "kis_transaction.h"
#include "kis_paint_layer.h"
- #include "kis_paint_information.h"
- #include "kis_distance_information.h"
-#include "kis_inpaint_mask.h"
+QRect patchImage(KisPaintDeviceSP imageDev, KisPaintDeviceSP maskDev, int radius, \
int accuracy, + KisPaintDeviceSP originalImageDev, KisPaintDeviceSP \
patchedImageDev); +
+class KisToolSmartPatch::InpaintCommand : public KUndo2Command {
+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); + }
+
+ void undo() override {
+ Q_ASSERT(!m_originalImageDev.isNull());
+ m_imageDev->dataManager()->bitBlt( m_originalImageDev->dataManager(), \
m_modifiedRect); + }
-QRect patchImage(KisPaintDeviceSP imageDev, KisPaintDeviceSP maskDev, int radius, \
int accuracy); +private:
+ KisPaintDeviceSP m_maskDev, m_imageDev;
+ KisPaintDeviceSP m_originalImageDev;
+ KisPaintDeviceSP m_patchedImageDev;
+ QRect m_modifiedRect;
+ int m_accuracy, m_patchRadius;
+};
struct KisToolSmartPatch::Private {
- KisMaskSP mask = nullptr;
- KisNodeSP maskNode = nullptr;
- KisNodeSP paintNode = nullptr;
KisPaintDeviceSP imageDev = nullptr;
KisPaintDeviceSP maskDev = nullptr;
- KisResourcesSnapshotSP resources = nullptr;
- KoColor currentFgColor;
+ KisPainter maskDevPainter;
- KisResourcesSnapshotSP resources = nullptr;
- KoColor currentFgColor;
- float brushRadius = 22.;
++ float brushRadius = 50.; //initial default. actually read from ui.
KisToolSmartPatchOptionsWidget *optionsWidget = nullptr;
- QRectF brushRect;
+ QRectF oldOutlineRect;
+ QPainterPath brushOutline;
};
@@@ -128,25 -86,31 +114,13 @@@ void KisToolSmartPatch::deactivate(
void KisToolSmartPatch::resetCursorStyle()
{
- KisToolFreehand::resetCursorStyle();
-}
-
-
-bool KisToolSmartPatch::canCreateInpaintMask() const
-{
- KisNodeSP node = currentNode();
- return node && node->inherits("KisPaintLayer");
-}
-
-QRect KisToolSmartPatch::inpaintImage(KisPaintDeviceSP maskDev, KisPaintDeviceSP \
imageDev)
-{
- 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) {
- accuracy = m_d->optionsWidget->getAccuracy();
- patchRadius = m_d->optionsWidget->getPatchRadius();
- }
- return patchImage(imageDev, maskDev, patchRadius, accuracy);
+ KisToolPaint::resetCursorStyle();
}
- //QRect KisToolSmartPatch::inpaintImage(KisPaintDeviceSP maskDev, KisPaintDeviceSP \
imageDev)
- //{
- // 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) {
- // accuracy = m_d->optionsWidget->getAccuracy();
- // patchRadius = m_d->optionsWidget->getPatchRadius();
- // }
- // return patchImage(imageDev, maskDev, patchRadius, accuracy);
- //}
-
void KisToolSmartPatch::activatePrimaryAction()
{
- KisToolFreehand::activatePrimaryAction();
+ setOutlineEnabled(true);
+ KisToolPaint::activatePrimaryAction();
}
void KisToolSmartPatch::deactivatePrimaryAction()
@@@ -192,111 -182,46 +166,109 @@@ void KisToolSmartPatch::continuePrimary
void KisToolSmartPatch::endPrimaryAction(KoPointerEvent *event)
{
- if (mode() != KisTool::PAINT_MODE)
- return;
+ CHECK_MODE_SANITY_OR_RETURN(KisTool::PAINT_MODE);
+ addMaskPath(event);
+ KisToolPaint::endPrimaryAction(event);
+ setMode(KisTool::HOVER_MODE);
- if (m_d->mask.isNull())
- return;
+ QApplication::setOverrideCursor(KisCursor::waitCursor());
- KisToolFreehand::endPrimaryAction(event);
+ m_d->imageDev = currentNode()->paintDevice();
+
- //KIS_DUMP_DEVICE_2(m_d->maskDev, m_d->imageDev->exactBounds(), "maskDev", \
"/home/eugening/Projects/Mask");
-
+ int accuracy = 50; //default accuracy - middle value
+ int patchRadius = 4; //default radius, which works well for most cases tested
- //Next line is important. We need to wait for the paint operation to finish \
otherwise
- //mask will be incomplete.
+ if (!m_d.isNull() && m_d->optionsWidget) {
+ accuracy = m_d->optionsWidget->getAccuracy();
+ patchRadius = m_d->optionsWidget->getPatchRadius();
+ }
+
+ KisProcessingApplicator applicator( image(), currentNode(), \
KisProcessingApplicator::NONE, KisImageSignalVector() << ModifiedSignal, + \
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 \
), + KisStrokeJobData::BARRIER, \
KisStrokeJobData::EXCLUSIVE ); +
+ applicator.end();
image()->waitForDone();
- //User drew a mask on the temporary inpaint mask layer. Get this mask to pass \
to the inpaint algorithm
- m_d->maskDev = new KisPaintDevice(KoColorSpaceRegistry::instance()->alpha8());
+ QApplication::restoreOverrideCursor();
+ m_d->maskDev->clear();
+}
- if (!m_d->mask.isNull()) {
- m_d->maskDev->makeCloneFrom(m_d->mask->paintDevice(), \
m_d->mask->paintDevice()->extent()); +QPainterPath KisToolSmartPatch::brushOutline( \
void ) +{
+ const qreal diameter = m_d->brushRadius;
+ QPainterPath outline;
+ outline.addEllipse(QPointF(0,0), -0.5 * diameter, -0.5 * diameter );
+ return outline;
+}
- //Once we get the mask we delete the temporary layer on which user painted \
it
- deleteInpaintMask();
+QPainterPath KisToolSmartPatch::getBrushOutlinePath(const QPointF &documentPos,
+ const KoPointerEvent *event)
+{
+ Q_UNUSED(event);
- image()->waitForDone();
- m_d->imageDev = currentNode()->paintDevice();
+ QPointF imagePos = currentImage()->documentToPixel(documentPos);
+ QPainterPath path = brushOutline();
- KisTransaction inpaintTransaction(kundo2_i18n("Inpaint Operation"), \
m_d->imageDev); + return path.translated( imagePos.rx(), imagePos.ry() );
+}
- QApplication::setOverrideCursor(KisCursor::waitCursor());
+void KisToolSmartPatch::requestUpdateOutline(const QPointF &outlineDocPoint, const \
KoPointerEvent *event) +{
+ static QPointF lastDocPoint = QPointF(0,0);
+ if( event )
+ lastDocPoint=outlineDocPoint;
+
+ m_d->brushRadius = currentPaintOpPreset()->settings()->paintOpSize();
+ m_d->brushOutline = getBrushOutlinePath(lastDocPoint, event);
+
+ QRectF outlinePixelRect = m_d->brushOutline.boundingRect();
+ QRectF outlineDocRect = currentImage()->pixelToDocument(outlinePixelRect);
+
+ // This adjusted call is needed as we paint with a 3 pixel wide brush and the \
pen is outside the bounds of the path + // Pen uses view coordinates so we have \
to zoom the document value to match 2 pixel in view coordiates + // See BUG \
275829 + qreal zoomX;
+ qreal zoomY;
+ canvas()->viewConverter()->zoom(&zoomX, &zoomY);
+ qreal xoffset = 2.0/zoomX;
+ qreal yoffset = 2.0/zoomY;
+
+ if (!outlineDocRect.isEmpty()) {
+ outlineDocRect.adjust(-xoffset,-yoffset,xoffset,yoffset);
+ }
- //actual inpaint operation. filling in areas masked by user
- QRect changedRect = inpaintImage(m_d->maskDev, m_d->imageDev);
- currentNode()->setDirty(changedRect);
- inpaintTransaction.commit(image()->undoAdapter());
+ if (!m_d->oldOutlineRect.isEmpty()) {
+ canvas()->updateCanvas(m_d->oldOutlineRect);
+ }
- //Matching endmacro for inpaint operation
- canvas()->shapeController()->resourceManager()->undoStack()->endMacro();
+ if (!outlineDocRect.isEmpty()) {
+ canvas()->updateCanvas(outlineDocRect);
+ }
- QApplication::restoreOverrideCursor();
+ m_d->oldOutlineRect = outlineDocRect;
+}
- canvas()->resourceManager()->setForegroundColor(m_d->currentFgColor);
+void KisToolSmartPatch::paint(QPainter &painter, const KoViewConverter &converter)
+{
+ Q_UNUSED(converter);
+
+ painter.save();
+ painter.setCompositionMode(QPainter::RasterOp_SourceXorDestination);
+ painter.setPen(QColor(128, 255, 128));
+ painter.drawPath(pixelToView(m_d->brushOutline));
+ painter.restore();
+
+ painter.save();
+ painter.setBrush(Qt::magenta);
+ QImage img = m_d->maskDev->convertToQImage(0);
+ if( !img.size().isEmpty() ){
+ painter.drawImage(pixelToView(m_d->maskDev->exactBounds()), img);
}
+ painter.restore();
}
QWidget * KisToolSmartPatch::createOptionWidget()
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic