[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