Krita Source Code Documentation
Loading...
Searching...
No Matches
KisMergeWalker Class Reference

#include <kis_merge_walker.h>

+ Inheritance diagram for KisMergeWalker:

Public Types

enum  Flag { DEFAULT = 0 , NO_FILTHY = 0x1 , CLONES_DONT_INVALIDATE_FRAMES = 0x2 }
 
- Public Types inherited from KisBaseRectsWalker
typedef QVector< CloneNotificationCloneNotificationsVector
 
typedef QStack< JobItemLeafStack
 
typedef qint32 NodePosition
 
enum  NodePositionValues {
  N_NORMAL = 0x00 , N_TOPMOST = 0x01 , N_BOTTOMMOST = 0x02 , N_EXTRA = 0x04 ,
  N_ABOVE_FILTHY = 0x08 , N_FILTHY_ORIGINAL = 0x10 , N_FILTHY_PROJECTION = 0x20 , N_FILTHY = 0x40 ,
  N_BELOW_FILTHY = 0x80
}
 
enum  SubtreeVisitFlag { None = 0x0 , SkipNonRenderableNodes = 0x1 , NoFilthyMode = 0x2 , DontNotifyClones = 0x4 }
 
enum  UpdateType {
  UPDATE , UPDATE_NO_FILTHY , FULL_REFRESH , FULL_REFRESH_NO_FILTHY ,
  UNSUPPORTED
}
 

Public Member Functions

 KisMergeWalker (QRect cropRect, Flags flags=DEFAULT)
 
UpdateType type () const override
 
 ~KisMergeWalker () override
 
- Public Member Functions inherited from KisBaseRectsWalker
QRect accessRect () const
 
QRect changeRect () const
 
bool changeRectVaries () const
 
bool checksumValid ()
 
CloneNotificationsVectorcloneNotifications ()
 
bool clonesDontInvalidateFrames () const
 
void collectRects (KisNodeSP node, const QRect &requestedRect)
 
QRect cropRect () const
 
 KisBaseRectsWalker ()
 
LeafStackleafStack ()
 
int levelOfDetail () const
 
bool needRectVaries () const
 
 Q_DECLARE_FLAGS (SubtreeVisitFlags, SubtreeVisitFlag)
 
void recalculate (const QRect &requestedRect)
 
QRect requestedRect () const
 
void setClonesDontInvalidateFrames (bool value)
 
void setCropRect (QRect cropRect)
 
KisNodeSP startNode () const
 
QRect uncroppedChangeRect () const
 
virtual ~KisBaseRectsWalker ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Protected Member Functions

 KisMergeWalker ()
 
 KisMergeWalker (Flags flags)
 
void startTrip (KisProjectionLeafSP startWith) override
 
virtual void startTrip (KisProjectionLeafSP startWith)=0
 
void startTripWithMask (KisProjectionLeafSP filthyMask, KisMergeWalker::Flags flags)
 
- Protected Member Functions inherited from KisBaseRectsWalker
void addCloneSourceRegenerationJobs ()
 
virtual void adjustMasksChangeRect (KisProjectionLeafSP firstMask)
 
void clear ()
 
QRect cropThisRect (const QRect &rect, const QRect &cropRect)
 
bool isStartLeaf (KisProjectionLeafSP leaf) const
 
void pushJob (KisProjectionLeafSP leaf, NodePosition position, QRect applyRect, KisRenderPassFlags flags)
 
virtual void registerChangeRect (KisProjectionLeafSP leaf, NodePosition position)
 
void registerCloneNotification (KisNodeSP node, NodePosition position)
 
void registerNeedRect (KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags)
 
virtual void registerNeedRect (KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags, const QRect &cropRect)
 
void setExplicitChangeRect (const QRect &changeRect, bool changeRectVaries)
 
void visitSubtreeTopToBottom (KisProjectionLeafSP startWith, SubtreeVisitFlags flags, KisRenderPassFlags renderFlags, const QRect &cropRect)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Private Member Functions

void startTripImpl (KisProjectionLeafSP startLeaf, Flags flags)
 
void visitHigherNode (KisProjectionLeafSP leaf, NodePosition positionToFilthy)
 
void visitLowerNode (KisProjectionLeafSP leaf)
 

Private Attributes

const Flags m_flags
 

Additional Inherited Members

- Static Public Member Functions inherited from KisBaseRectsWalker
static KisNode::PositionToFilthy convertPositionToFilthy (NodePosition position)
 
- Static Protected Member Functions inherited from KisBaseRectsWalker
static qint32 calculateChecksum (KisProjectionLeafSP leaf, const QRect &requestedRect)
 
static NodePosition calculateNodePosition (KisProjectionLeafSP leaf)
 
static qint32 getGraphPosition (qint32 position)
 
static bool hasClones (KisNodeSP node)
 

Detailed Description

Definition at line 16 of file kis_merge_walker.h.

Member Enumeration Documentation

◆ Flag

NO_FILTHY flag notifies the walker that there should be no (!) filthy node in the update. It means that the projection() of the node is already guaranteed to be ready, we just need to update all the higher-level nodes. Used by KisTransformMask regeneration code.

Enumerator
DEFAULT 
NO_FILTHY 
CLONES_DONT_INVALIDATE_FRAMES 

Definition at line 27 of file kis_merge_walker.h.

Constructor & Destructor Documentation

◆ KisMergeWalker() [1/3]

KisMergeWalker::KisMergeWalker ( QRect cropRect,
Flags flags = DEFAULT )

◆ ~KisMergeWalker()

KisMergeWalker::~KisMergeWalker ( )
override

Definition at line 19 of file kis_merge_walker.cc.

20{
21}

◆ KisMergeWalker() [2/3]

KisMergeWalker::KisMergeWalker ( )
inlineprotected

Definition at line 42 of file kis_merge_walker.h.

42: m_flags(DEFAULT) {}

◆ KisMergeWalker() [3/3]

KisMergeWalker::KisMergeWalker ( Flags flags)
inlineprotected

Definition at line 43 of file kis_merge_walker.h.

43: m_flags(flags) {}

Member Function Documentation

◆ startTrip() [1/2]

void KisMergeWalker::startTrip ( KisProjectionLeafSP startWith)
overrideprotectedvirtual

Begins visiting nodes starting with startWith. First it climbs to the top of the graph, collecting changeRects (it calls registerChangeRect for every node). Then it goes down to the bottom collecting needRects for every branch.

Implements KisBaseRectsWalker.

Definition at line 44 of file kis_merge_walker.cc.

45{
46 startTripImpl(startLeaf, m_flags);
47}
void startTripImpl(KisProjectionLeafSP startLeaf, Flags flags)

References m_flags, and startTripImpl().

◆ startTrip() [2/2]

virtual void KisBaseRectsWalker::startTrip ( KisProjectionLeafSP startWith)
protectedvirtual

Initiates collecting of rects. Should be implemented in derived classes

Implements KisBaseRectsWalker.

◆ startTripImpl()

void KisMergeWalker::startTripImpl ( KisProjectionLeafSP startLeaf,
Flags flags )
private

Definition at line 28 of file kis_merge_walker.cc.

29{
30 if(startLeaf->isMask()) {
31 startTripWithMask(startLeaf, flags);
32 return;
33 }
34
35 visitHigherNode(startLeaf,
36 !flags.testFlag(NO_FILTHY) ? N_FILTHY : N_ABOVE_FILTHY);
37
38 KisProjectionLeafSP prevLeaf = startLeaf->prevSibling();
39 if(prevLeaf)
40 visitLowerNode(prevLeaf);
41}
void visitLowerNode(KisProjectionLeafSP leaf)
void visitHigherNode(KisProjectionLeafSP leaf, NodePosition positionToFilthy)
void startTripWithMask(KisProjectionLeafSP filthyMask, KisMergeWalker::Flags flags)

References KisBaseRectsWalker::N_ABOVE_FILTHY, KisBaseRectsWalker::N_FILTHY, NO_FILTHY, startTripWithMask(), visitHigherNode(), and visitLowerNode().

◆ startTripWithMask()

void KisMergeWalker::startTripWithMask ( KisProjectionLeafSP filthyMask,
KisMergeWalker::Flags flags )
protected

Under very rare circumstances it may happen that the update queue will contain a job pointing to a node that has already been deleted from the image (directly or by undo command). If it happens to a layer then the walker will handle it as usual by building a trivial graph pointing to nowhere, but when it happens to a mask... not. Because the mask is always expected to have a parent layer to process.

So just handle it here separately.

Definition at line 49 of file kis_merge_walker.cc.

50{
62 KisProjectionLeafSP parentLayer = filthyMask->parent();
63 if (!parentLayer) {
64 return;
65 }
66
67 adjustMasksChangeRect(filthyMask);
68
69 KisProjectionLeafSP nextLeaf = parentLayer->nextSibling();
70 KisProjectionLeafSP prevLeaf = parentLayer->prevSibling();
71
72 if (nextLeaf)
74 else if (parentLayer->parent())
75 startTripImpl(parentLayer->parent(), DEFAULT);
76
77 NodePosition positionToFilthy =
78 (!flags.testFlag(NO_FILTHY) ? N_FILTHY_PROJECTION : N_ABOVE_FILTHY) |
79 calculateNodePosition(parentLayer);
80 registerNeedRect(parentLayer, positionToFilthy, KisRenderPassFlag::None);
81
82 if(prevLeaf)
83 visitLowerNode(prevLeaf);
84}
static NodePosition calculateNodePosition(KisProjectionLeafSP leaf)
virtual void adjustMasksChangeRect(KisProjectionLeafSP firstMask)
void registerNeedRect(KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags)

References KisBaseRectsWalker::adjustMasksChangeRect(), KisBaseRectsWalker::calculateNodePosition(), DEFAULT, KisBaseRectsWalker::N_ABOVE_FILTHY, KisBaseRectsWalker::N_FILTHY_PROJECTION, NO_FILTHY, None, KisBaseRectsWalker::registerNeedRect(), startTripImpl(), visitHigherNode(), and visitLowerNode().

◆ type()

◆ visitHigherNode()

void KisMergeWalker::visitHigherNode ( KisProjectionLeafSP leaf,
NodePosition positionToFilthy )
private

Visits a node @leaf and goes on crawling towards the top of the graph, calling visitHigherNode() or startTrip() one more time. After the top is reached returns back to the @leaf.

Definition at line 86 of file kis_merge_walker.cc.

87{
88 positionToFilthy |= calculateNodePosition(leaf);
89
90 registerChangeRect(leaf, positionToFilthy);
91
92 KisProjectionLeafSP nextLeaf = leaf->nextSibling();
93 if (nextLeaf)
95 else if (leaf->parent())
96 startTripImpl(leaf->parent(), DEFAULT);
97
98 registerNeedRect(leaf, positionToFilthy, KisRenderPassFlag::None);
99}
virtual void registerChangeRect(KisProjectionLeafSP leaf, NodePosition position)

References KisBaseRectsWalker::calculateNodePosition(), DEFAULT, KisBaseRectsWalker::N_ABOVE_FILTHY, None, KisBaseRectsWalker::registerChangeRect(), KisBaseRectsWalker::registerNeedRect(), startTripImpl(), and visitHigherNode().

◆ visitLowerNode()

void KisMergeWalker::visitLowerNode ( KisProjectionLeafSP leaf)
private

Visits a node @leaf and goes on crawling towards the bottom of the graph, calling visitLowerNode() or startTrip() one more time.

Definition at line 101 of file kis_merge_walker.cc.

102{
103 NodePosition position =
106
107 KisProjectionLeafSP prevLeaf = leaf->prevSibling();
108 if (prevLeaf)
109 visitLowerNode(prevLeaf);
110}

References KisBaseRectsWalker::calculateNodePosition(), KisBaseRectsWalker::N_BELOW_FILTHY, None, KisBaseRectsWalker::registerNeedRect(), and visitLowerNode().

Member Data Documentation

◆ m_flags

const Flags KisMergeWalker::m_flags
private

Definition at line 78 of file kis_merge_walker.h.


The documentation for this class was generated from the following files: