Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_base_rects_walker.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
8#include "kis_clone_layer.h"
9
11{
18 QVector<JobItem> cloneLayers;
19 std::copy_if(m_mergeTask.begin(), m_mergeTask.end(),
20 std::back_inserter(cloneLayers),
21 [] (const JobItem &item) {
22 return item.m_leaf->node()->inherits("KisCloneLayer") &&
23 (item.m_position & (N_FILTHY | N_ABOVE_FILTHY | N_EXTRA));
24 });
25
26 for (auto it = cloneLayers.begin(); it != cloneLayers.end(); ++it) {
27 KisCloneLayer *clone = dynamic_cast<KisCloneLayer*>(it->m_leaf->node().data());
28
29 KisNodeSP source = clone->copyFrom();
30 if (!source) continue;
31
32 QVector<QRect> preparedRects;
33
34 if (!m_cropRect.isEmpty()) {
35 preparedRects << m_cropRect;
36 }
37
38 Q_FOREACH (const JobItem &job, m_mergeTask) {
39 if (job.m_leaf->node() == source &&
40 ((job.m_position & (N_FILTHY | N_EXTRA)) ||
41 (job.m_leaf->dependsOnLowerNodes() && (job.m_position & N_ABOVE_FILTHY)))) {
42 preparedRects << job.m_applyRect;
43 }
44 }
45
46 const QRect srcRect = it->m_applyRect.translated(-clone->x(), -clone->y());
47
48 QRegion prepareRegion(srcRect);
49
54 const QRect needRectOnSource = clone->needRectOnSourceForMasks(srcRect);
55 if (!needRectOnSource.isEmpty()) {
56 prepareRegion += needRectOnSource;
57 }
58
59 Q_FOREACH (const QRect &rc, preparedRects) {
60 prepareRegion -= rc;
61 }
62
63 for (auto it = prepareRegion.begin(); it != prepareRegion.end(); ++it) {
65 visitSubtreeTopToBottom(source->projectionLeaf(),
68 QRect());
69 }
70 }
71}
72
74 KisRenderPassFlags renderFlags, const QRect &cropRect)
75{
80 if (flags & SkipNonRenderableNodes && !startWith->shouldBeRendered()) return;
81
82 KisProjectionLeafSP currentLeaf = startWith->lastChild();
83 while(currentLeaf) {
89 calculateNodePosition(currentLeaf);
90 registerNeedRect(currentLeaf, pos, renderFlags, cropRect);
91
92 if (!flags.testFlag(DontNotifyClones)) {
97 registerCloneNotification(currentLeaf->node(), pos);
98 }
99
100 currentLeaf = currentLeaf->prevSibling();
101 }
102
107 if (flags & NoFilthyMode) return;
108
109 currentLeaf = startWith->lastChild();
110 while(currentLeaf) {
111 if(currentLeaf->canHaveChildLayers()) {
112 visitSubtreeTopToBottom(currentLeaf, flags, renderFlags, cropRect);
113 }
114 currentLeaf = currentLeaf->prevSibling();
115 }
116}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
static NodePosition calculateNodePosition(KisProjectionLeafSP leaf)
void registerCloneNotification(KisNodeSP node, NodePosition position)
void visitSubtreeTopToBottom(KisProjectionLeafSP startWith, SubtreeVisitFlags flags, KisRenderPassFlags renderFlags, const QRect &cropRect)
void pushJob(KisProjectionLeafSP leaf, NodePosition position, QRect applyRect, KisRenderPassFlags flags)
void registerNeedRect(KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags)
qint32 y() const override
qint32 x() const override
KisLayerSP copyFrom
QRect needRectOnSourceForMasks(const QRect &rc) const