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

List:       kde-commits
Subject:    [krita/tantsevov/T6224-watercolor] /: Added an update of the system in between the strokes. Added bu
From:       Grigory Tantsevov <null () kde ! org>
Date:       2017-08-09 15:35:21
Message-ID: E1dfT0z-0003P9-1o () code ! kde ! org
[Download RAW message or body]

Git commit 085308f1dc79a1fe5ab5494c892471b21b89e6de by Grigory Tantsevov.
Committed on 09/08/2017 at 15:33.
Pushed by tantsevov into branch 'tantsevov/T6224-watercolor'.

Added an update of the system in between the strokes. Added bugs with jobs

M  +5    -0    libs/image/brushengine/kis_paintop.h
M  +5    -0    libs/image/kis_painter.cc
M  +1    -0    libs/image/kis_painter.h
M  +14   -1    libs/ui/tool/kis_tool_freehand.cc
M  +4    -0    libs/ui/tool/kis_tool_freehand.h
M  +6    -0    libs/ui/tool/kis_tool_freehand_helper.cpp
M  +1    -0    libs/ui/tool/kis_tool_freehand_helper.h
M  +3    -0    libs/ui/tool/strokes/freehand_stroke.cpp
M  +7    -1    libs/ui/tool/strokes/freehand_stroke.h
M  +11   -11   plugins/paintops/watercolor/kis_base_splats_plane.cpp
M  +1    -1    plugins/paintops/watercolor/kis_base_splats_plane.h
M  +3    -3    plugins/paintops/watercolor/kis_fixed_splats_plane.cpp
M  +19   -39   plugins/paintops/watercolor/kis_watercolor_paintop.cpp
M  +4    -0    plugins/paintops/watercolor/kis_watercolor_paintop.h

https://commits.kde.org/krita/085308f1dc79a1fe5ab5494c892471b21b89e6de

diff --git a/libs/image/brushengine/kis_paintop.h \
b/libs/image/brushengine/kis_paintop.h index e97639249be..6a554f60011 100644
--- a/libs/image/brushengine/kis_paintop.h
+++ b/libs/image/brushengine/kis_paintop.h
@@ -111,6 +111,11 @@ public:
      */
     static void splitCoordinate(qreal coordinate, qint32 *whole, qreal *fraction);
 
+    /**
+     * Updating system in dynamic paintops, such as watercolor
+     */
+    virtual void updateSystem(){}
+
 protected:
     friend class KisPaintInformation;
     /**
diff --git a/libs/image/kis_painter.cc b/libs/image/kis_painter.cc
index 5ade111ff69..06ce3b915b9 100644
--- a/libs/image/kis_painter.cc
+++ b/libs/image/kis_painter.cc
@@ -2741,6 +2741,11 @@ void \
KisPainter::setColorConversionFlags(KoColorConversionTransformation::Conver  \
d->conversionFlags = conversionFlags;  }
 
+void KisPainter::updateSystem()
+{
+    d->paintOp->updateSystem();
+}
+
 void KisPainter::renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, bool \
preserveDab)  {
     if (!d->mirrorHorizontally && !d->mirrorVertically) return;
diff --git a/libs/image/kis_painter.h b/libs/image/kis_painter.h
index 353afb1a281..b6512bb1e08 100644
--- a/libs/image/kis_painter.h
+++ b/libs/image/kis_painter.h
@@ -764,6 +764,7 @@ public:
      */
     void setColorConversionFlags(KoColorConversionTransformation::ConversionFlags \
conversionFlags);  
+    void updateSystem();
 protected:
     /// Initialize, set everything to '0' or defaults
     void init();
diff --git a/libs/ui/tool/kis_tool_freehand.cc b/libs/ui/tool/kis_tool_freehand.cc
index 2443a3ec5ef..2b6000b422b 100644
--- a/libs/ui/tool/kis_tool_freehand.cc
+++ b/libs/ui/tool/kis_tool_freehand.cc
@@ -84,6 +84,9 @@ KisToolFreehand::KisToolFreehand(KoCanvasBase * canvas, const \
QCursor & cursor,  
     m_needEndContinuedStroke = false;
     m_lastID = KoID("newId-hehe");
+
+    connect(&m_updateTimer, SIGNAL(timeout()),
+            SLOT(slotUpdateSystem()));
 }
 
 KisToolFreehand::~KisToolFreehand()
@@ -190,13 +193,15 @@ void KisToolFreehand::initStroke(KoPointerEvent *event)
                                              canvas()->resourceManager(),
                                              image(),
                                              currentNode());
-    } else
+        m_updateTimer.stop();
+    } else {
         m_helper->initPaint(event,
                             convertToPixelCoord(event),
                             canvas()->resourceManager(),
                             image(),
                             currentNode(),
                             image().data());
+    }
 }
 
 void KisToolFreehand::doStroke(KoPointerEvent *event)
@@ -215,6 +220,7 @@ void KisToolFreehand::endStroke()
     if (currentPaintOpPreset()->settings()->needsContinuedStroke() && \
                !m_needEndContinuedStroke) {
             qDebug() << "Finished part of continued stroke\n" << \
ppVar(m_needEndContinuedStroke);  m_helper->endPaintInContinuedStroke();
+            m_updateTimer.start(50);
     } else {
         qDebug() << "Stroke finished finaly\n" << ppVar(m_needEndContinuedStroke);
         m_helper->endPaint();
@@ -352,6 +358,8 @@ void KisToolFreehand::deactivateAlternateAction(AlternateAction \
action)  
 void KisToolFreehand::beginAlternateAction(KoPointerEvent *event, AlternateAction \
action)  {
+    if (m_updateTimer.isActive())
+        m_updateTimer.stop();
     if (currentPaintOpPreset()->settings()->needsContinuedStroke()) {
         m_needEndContinuedStroke = true;
         endStroke();
@@ -462,6 +470,11 @@ void KisToolFreehand::slotDoResizeBrush(qreal newSize)
 
 }
 
+void KisToolFreehand::slotUpdateSystem()
+{
+    m_helper->updateContinuedSystem();
+}
+
 QPointF KisToolFreehand::adjustPosition(const QPointF& point, const QPointF& \
strokeBegin)  {
     if (m_assistant && \
                static_cast<KisCanvas2*>(canvas())->paintingAssistantsDecoration()) {
diff --git a/libs/ui/tool/kis_tool_freehand.h b/libs/ui/tool/kis_tool_freehand.h
index 4c0311fd08c..f09b1c270a9 100644
--- a/libs/ui/tool/kis_tool_freehand.h
+++ b/libs/ui/tool/kis_tool_freehand.h
@@ -94,6 +94,8 @@ protected Q_SLOTS:
     void setOnlyOneAssistantSnap(bool assistant);
     void slotDoResizeBrush(qreal newSize);
 
+    void slotUpdateSystem();
+
 private:
     friend class KisToolFreehandPaintingInformationBuilder;
 
@@ -133,6 +135,8 @@ private:
 
     bool m_needEndContinuedStroke;
     KoID m_lastID;
+
+    QTimer m_updateTimer;
 };
 
 
diff --git a/libs/ui/tool/kis_tool_freehand_helper.cpp \
b/libs/ui/tool/kis_tool_freehand_helper.cpp index 6fd00340b92..b215f59420d 100644
--- a/libs/ui/tool/kis_tool_freehand_helper.cpp
+++ b/libs/ui/tool/kis_tool_freehand_helper.cpp
@@ -673,6 +673,12 @@ void KisToolFreehandHelper::endPaintInContinuedStroke()
     }
 }
 
+void KisToolFreehandHelper::updateContinuedSystem()
+{
+    m_d->strokesFacade->addJob(m_d->strokeId,
+                               new \
FreehandStrokeStrategy::Data(m_d->resources->currentNode(), 0)); +}
+
 void KisToolFreehandHelper::cancelPaint()
 {
     if (!m_d->strokeId) return;
diff --git a/libs/ui/tool/kis_tool_freehand_helper.h \
b/libs/ui/tool/kis_tool_freehand_helper.h index 1c541792c4d..c575c86735f 100644
--- a/libs/ui/tool/kis_tool_freehand_helper.h
+++ b/libs/ui/tool/kis_tool_freehand_helper.h
@@ -79,6 +79,7 @@ public:
                                     KoCanvasResourceManager *resourceManager,
                                     KisImageWSP image, KisNodeSP currentNode, \
KisDefaultBoundsBaseSP bounds = 0);  void endPaintInContinuedStroke();
+    void updateContinuedSystem();
 
     const KisPaintOp* currentPaintOp() const;
     QPainterPath paintOpOutline(const QPointF &savedCursorPos,
diff --git a/libs/ui/tool/strokes/freehand_stroke.cpp \
b/libs/ui/tool/strokes/freehand_stroke.cpp index 165f53da2a4..661c68311e0 100644
--- a/libs/ui/tool/strokes/freehand_stroke.cpp
+++ b/libs/ui/tool/strokes/freehand_stroke.cpp
@@ -131,6 +131,9 @@ void FreehandStrokeStrategy::doStrokeCallback(KisStrokeJobData \
*data)  case Data::UPDATE_RESOURCES:
         info->painter->setPaintColor(d->customColor);
         break;
+    case Data::UPDATE_SYSTEM:
+        info->painter->updateSystem();
+        break;
     case Data::QPAINTER_PATH_FILL: {
         info->painter->setBackgroundColor(d->customColor);
         info->painter->fillPainterPath(d->path);}
diff --git a/libs/ui/tool/strokes/freehand_stroke.h \
b/libs/ui/tool/strokes/freehand_stroke.h index 49c422da855..8427ac58e03 100644
--- a/libs/ui/tool/strokes/freehand_stroke.h
+++ b/libs/ui/tool/strokes/freehand_stroke.h
@@ -46,7 +46,8 @@ public:
             PAINTER_PATH,
             QPAINTER_PATH,
             QPAINTER_PATH_FILL,
-            UPDATE_RESOURCES
+            UPDATE_RESOURCES,
+            UPDATE_SYSTEM
         };
 
         Data(KisNodeSP _node, int _painterInfoId,
@@ -108,6 +109,11 @@ public:
               type(UPDATE_RESOURCES), customColor(_customColor)
         {}
 
+        Data(KisNodeSP _node, int _painterInfoId)
+            : node(_node), painterInfoId(_painterInfoId),
+              type(UPDATE_SYSTEM)
+        {}
+
         KisStrokeJobData* createLodClone(int levelOfDetail) override {
             return new Data(*this, levelOfDetail);
         }
diff --git a/plugins/paintops/watercolor/kis_base_splats_plane.cpp \
b/plugins/paintops/watercolor/kis_base_splats_plane.cpp index \
                2da6e458cff..06fec254de8 100644
--- a/plugins/paintops/watercolor/kis_base_splats_plane.cpp
+++ b/plugins/paintops/watercolor/kis_base_splats_plane.cpp
@@ -48,21 +48,20 @@ void KisBaseSplatsPlane::paint(KisPainter *gc, QRect rect)
 {
     if (m_useCaching) {
 
-        if (m_isDirty) {
+        if (!m_dirtyRect.isNull()) {
             if (!m_cachedPD) {
                 m_cachedPD = new KisPaintDevice(gc->device()->colorSpace());
             } else {
-                m_cachedPD->clear();
+                m_cachedPD->clear(m_dirtyRect);
             }
 
             KisPainter *painter = new KisPainter(m_cachedPD);
             Q_FOREACH (KisSplat *splat, m_splats) {
-                splat->doPaint(painter);
+                if (m_dirtyRect.contains(splat->boundingRect().toAlignedRect()))
+                    splat->doPaint(painter);
             }
-            m_isDirty = false;
+//            m_isDirty = false;
         }
-
-
         gc->bitBlt(rect.topLeft(),
                    m_cachedPD,
                    rect);
@@ -75,11 +74,11 @@ void KisBaseSplatsPlane::paint(KisPainter *gc, QRect rect)
 
 QRect KisBaseSplatsPlane::update(KisWetMap *wetMap)
 {
-    QRect dirtyRect;
+//    QRect dirtyRect;
 
     for (auto it = m_splats.begin(); it != m_splats.end();) {
         KisSplat *splat = *it;
-
+        setDirty( splat->boundingRect().toAlignedRect());
         if (splat->update(wetMap) == KisSplat::Fixed) {
             m_lowLvlPlane->add(splat);
             {
@@ -88,17 +87,18 @@ QRect KisBaseSplatsPlane::update(KisWetMap *wetMap)
                 setDirty(splat->boundingRect().toAlignedRect());
 
             }
-            dirtyRect |= splat->boundingRect().toAlignedRect();
+//            setDirty(splat->boundingRect().toAlignedRect());
         } else {
+            setDirty(splat->boundingRect().toAlignedRect());
             ++it;
         }
     }
 
-    return dirtyRect;
+    return m_dirtyRect;
 }
 
 void KisBaseSplatsPlane::setDirty(const QRect &rc)
 {
     m_dirtyRect |= rc;
-    m_isDirty = true;
+//    m_isDirty = true;
 }
diff --git a/plugins/paintops/watercolor/kis_base_splats_plane.h \
b/plugins/paintops/watercolor/kis_base_splats_plane.h index 5df7b2c0e01..af7d87ddeb6 \
                100644
--- a/plugins/paintops/watercolor/kis_base_splats_plane.h
+++ b/plugins/paintops/watercolor/kis_base_splats_plane.h
@@ -79,12 +79,12 @@ protected:
 
 protected:
     void setDirty(const QRect &rc);
+    QRect m_dirtyRect;
 
 private:
     KisPaintDeviceSP m_cachedPD;
     bool m_isDirty;
     bool m_useCaching;
-    QRect m_dirtyRect;
 };
 
 #endif // KIS_ABSTRACT_SPLATS_PLANE_H
diff --git a/plugins/paintops/watercolor/kis_fixed_splats_plane.cpp \
b/plugins/paintops/watercolor/kis_fixed_splats_plane.cpp index \
                676d077ff0d..ca2e73f088e 100644
--- a/plugins/paintops/watercolor/kis_fixed_splats_plane.cpp
+++ b/plugins/paintops/watercolor/kis_fixed_splats_plane.cpp
@@ -25,7 +25,7 @@ KisFixedSplatsPlane::KisFixedSplatsPlane(KisBaseSplatsPlane \
*driedPlane)  
 QRect KisFixedSplatsPlane::update(KisWetMap *wetMap)
 {
-    QRect dirtyRect;
+//    QRect dirtyRect;
 
     for (auto it = m_splats.begin(); it != m_splats.end();) {
         KisSplat *splat = *it;
@@ -37,12 +37,12 @@ QRect KisFixedSplatsPlane::update(KisWetMap *wetMap)
                 it = m_splats.erase(it);
                 setDirty(splat->boundingRect().toAlignedRect());
             }
-            dirtyRect |= splat->boundingRect().toAlignedRect();
+//            dirtyRect |= splat->boundingRect().toAlignedRect();
         } else {
             ++it;
         }
     }
 
-    return dirtyRect;
+    return m_dirtyRect;
 }
 
diff --git a/plugins/paintops/watercolor/kis_watercolor_paintop.cpp \
b/plugins/paintops/watercolor/kis_watercolor_paintop.cpp index \
                4e7088a084c..c8b9a1bb77a 100644
--- a/plugins/paintops/watercolor/kis_watercolor_paintop.cpp
+++ b/plugins/paintops/watercolor/kis_watercolor_paintop.cpp
@@ -41,6 +41,7 @@ KisWatercolorPaintOp::KisWatercolorPaintOp(const \
KisPaintOpSettingsSP settings,  m_watercolorOption.readOptionSetting(settings);
     m_lastTime = 0;
     m_timer.start();
+    m_oldPD = new KisPaintDevice(*painter->device().constData());
 }
 
 KisWatercolorPaintOp::~KisWatercolorPaintOp()
@@ -52,10 +53,6 @@ KisSpacingInformation KisWatercolorPaintOp::paintAt(const \
KisPaintInformation &i  {
     QRect dirtyRect;
 
-    // Painting new stroke
-    qint16 time = m_timer.elapsed();
-    qint16 timeGone = time - m_lastTime;
-
     KisSplatGeneratorStrategy *strategy;
     switch (m_watercolorOption.type) {
     case 0:
@@ -86,52 +83,35 @@ KisSpacingInformation KisWatercolorPaintOp::paintAt(const \
KisPaintInformation &i  
     foreach (KisSplat *splat, newSplats) {
         m_flowingPlane.add(splat);
-        dirtyRect |= splat->boundingRect().toAlignedRect();
+        splat->doPaint(painter());
     }
 
+    return updateSpacingImpl(info);
+}
+
+void KisWatercolorPaintOp::updateSystem()
+{
+    // Painting new stroke
+    qint16 time = m_timer.elapsed();
+    qint16 timeGone = time - m_lastTime;
+    QRect dirtyRect;
     // Updating system
-    for (int i = 0; i < timeGone / 33; i++) {
-//        foreach (KisSplat *splat, m_flowing) {
-//            // todo: check if tree should be updated when splat is changed
-
-//            if (splat->update(m_wetMap) == KisSplat::Fixed) {
-//                m_fixed.push_back(splat);
-//                m_fixedTree.insert(splat->boundingRect(), splat);
-//                m_fixedPlane.add(splat);
-//                fixedRect |= splat->boundingRect().toRect();
-
-//                m_flowing.removeOne(splat);
-//                m_flowingPlane.remove(splat);
-//                flowingRect |= splat->boundingRect().toRect();
-//            }
-//        }
-
-//        fixedRect |= m_fixedPlane.update(wetMap);
-
-//        /*foreach (KisSplat *splat, m_fixed) {
-//            if (splat->update(m_wetMap) == KisSplat::Dried) {
-//                m_dried.push_back(splat);
-//                m_driedPlane.add(splat);
-//                driedRect |= splat->boundingRect().toRect();
-
-//                m_fixed.removeOne(splat);
-//                m_fixedTree.remove(splat);
-//                m_fixedPlane.remove(splat);
-//                fixedRect |= splat->boundingRect().toRect();
-//            }
-//        }*/
-        dirtyRect |= m_fixedPlane.update(m_wetMap) |
-        m_flowingPlane.update(m_wetMap);
+//    for (int i = 0; i < timeGone / 33; i++) {
+        dirtyRect |= m_fixedPlane.update(m_wetMap);
+        dirtyRect |= m_flowingPlane.update(m_wetMap);
 
         m_wetMap->update();
-    }
+//    }
 
     m_lastTime = time - time % 33;
     source()->clear();
+    painter()->bitBlt(m_oldPD->exactBounds().topLeft(),
+                      m_oldPD, m_oldPD->exactBounds());
     m_driedPlane.paint(painter(), dirtyRect);
     m_fixedPlane.paint(painter(), dirtyRect);
     m_flowingPlane.paint(painter(), dirtyRect);
-    return updateSpacingImpl(info);
+
+
 }
 
 KisSpacingInformation KisWatercolorPaintOp::updateSpacingImpl(const \
                KisPaintInformation &info) const
diff --git a/plugins/paintops/watercolor/kis_watercolor_paintop.h \
b/plugins/paintops/watercolor/kis_watercolor_paintop.h index a7edda18c14..a6a2e4f7157 \
                100644
--- a/plugins/paintops/watercolor/kis_watercolor_paintop.h
+++ b/plugins/paintops/watercolor/kis_watercolor_paintop.h
@@ -49,6 +49,8 @@ public:
 
     KisSpacingInformation paintAt(const KisPaintInformation& info) override;
 
+    void updateSystem() override;
+
 protected:
 
     KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const \
override; @@ -68,6 +70,8 @@ private:
     KisBaseSplatsPlane m_driedPlane;
     KisFixedSplatsPlane m_fixedPlane;
     KisBaseSplatsPlane m_flowingPlane;
+
+    KisPaintDeviceSP m_oldPD;
 };
 
 #endif // KIS_EXPERIMENT_PAINTOP_H_


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

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