Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_merge_walker.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2009 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "kis_merge_walker.h"
9
10
11
12KisMergeWalker::KisMergeWalker(QRect cropRect, Flags flags)
13 : m_flags(flags)
14{
17}
18
22
27
28void KisMergeWalker::startTripImpl(KisProjectionLeafSP startLeaf, KisMergeWalker::Flags flags)
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}
42
43
48
49void KisMergeWalker::startTripWithMask(KisProjectionLeafSP filthyMask, KisMergeWalker::Flags flags)
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}
85
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}
100
102{
103 NodePosition position =
106
107 KisProjectionLeafSP prevLeaf = leaf->prevSibling();
108 if (prevLeaf)
109 visitLowerNode(prevLeaf);
110}
static NodePosition calculateNodePosition(KisProjectionLeafSP leaf)
void setClonesDontInvalidateFrames(bool value)
virtual void registerChangeRect(KisProjectionLeafSP leaf, NodePosition position)
virtual void adjustMasksChangeRect(KisProjectionLeafSP firstMask)
void setCropRect(QRect cropRect)
void registerNeedRect(KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags)
void startTripImpl(KisProjectionLeafSP startLeaf, Flags flags)
void visitLowerNode(KisProjectionLeafSP leaf)
const Flags m_flags
void startTrip(KisProjectionLeafSP startWith) override
~KisMergeWalker() override
void visitHigherNode(KisProjectionLeafSP leaf, NodePosition positionToFilthy)
UpdateType type() const override
void startTripWithMask(KisProjectionLeafSP filthyMask, KisMergeWalker::Flags flags)