Krita Source Code Documentation
Loading...
Searching...
No Matches
KisBaseRectsWalker Class Referenceabstract

#include <kis_base_rects_walker.h>

+ Inheritance diagram for KisBaseRectsWalker:

Classes

struct  CloneNotification
 
struct  JobItem
 

Public Types

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

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
 
virtual UpdateType type () const =0
 
QRect uncroppedChangeRect () const
 
virtual ~KisBaseRectsWalker ()
 
- Public Member Functions inherited from KisShared
bool deref ()
 
bool ref ()
 
int refCount ()
 
QAtomicInt * sharedWeakReference ()
 

Static Public Member Functions

static KisNode::PositionToFilthy convertPositionToFilthy (NodePosition position)
 

Protected Member Functions

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)
 
virtual void startTrip (KisProjectionLeafSP startWith)=0
 
void visitSubtreeTopToBottom (KisProjectionLeafSP startWith, SubtreeVisitFlags flags, KisRenderPassFlags renderFlags, const QRect &cropRect)
 
- Protected Member Functions inherited from KisShared
 KisShared ()
 
 ~KisShared ()
 

Static Protected Member Functions

static qint32 calculateChecksum (KisProjectionLeafSP leaf, const QRect &requestedRect)
 
static NodePosition calculateNodePosition (KisProjectionLeafSP leaf)
 
static qint32 getGraphPosition (qint32 position)
 
static bool hasClones (KisNodeSP node)
 

Private Member Functions

int getNodeLevelOfDetail (KisProjectionLeafSP leaf)
 

Private Attributes

bool m_changeRectVaries {false}
 
QRect m_childNeedRect
 
CloneNotificationsVector m_cloneNotifications
 
bool m_clonesDontInvalidateFrames {false}
 
QRect m_cropRect
 
qint32 m_graphChecksum {0}
 
QRect m_lastNeedRect
 
int m_levelOfDetail {0}
 
LeafStack m_mergeTask
 
bool m_needRectVaries {false}
 
qint32 m_nodeChecksum {0}
 
QRect m_requestedRect
 
QRect m_resultAccessRect
 
QRect m_resultChangeRect
 
QRect m_resultNeedRect
 
QRect m_resultUncroppedChangeRect
 
KisNodeSP m_startNode
 

Detailed Description

Definition at line 21 of file kis_base_rects_walker.h.

Member Typedef Documentation

◆ CloneNotificationsVector

◆ LeafStack

◆ NodePosition

Definition at line 33 of file kis_base_rects_walker.h.

Member Enumeration Documentation

◆ NodePositionValues

Enumerator
N_NORMAL 

There are two different sets of values. The first describes the position of the node to the graph, the second shows the position to the filthy node

N_TOPMOST 
N_BOTTOMMOST 
N_EXTRA 
N_ABOVE_FILTHY 
N_FILTHY_ORIGINAL 
N_FILTHY_PROJECTION 
N_FILTHY 
N_BELOW_FILTHY 

Definition at line 34 of file kis_base_rects_walker.h.

◆ SubtreeVisitFlag

Enumerator
None 
SkipNonRenderableNodes 
NoFilthyMode 
DontNotifyClones 

Definition at line 109 of file kis_base_rects_walker.h.

◆ UpdateType

Enumerator
UPDATE 
UPDATE_NO_FILTHY 
FULL_REFRESH 
FULL_REFRESH_NO_FILTHY 
UNSUPPORTED 

Definition at line 24 of file kis_base_rects_walker.h.

Constructor & Destructor Documentation

◆ KisBaseRectsWalker()

KisBaseRectsWalker::KisBaseRectsWalker ( )
inline

Definition at line 119 of file kis_base_rects_walker.h.

120 : m_levelOfDetail(0)
121 {
122 }

◆ ~KisBaseRectsWalker()

virtual KisBaseRectsWalker::~KisBaseRectsWalker ( )
inlinevirtual

Definition at line 124 of file kis_base_rects_walker.h.

124 {
125 }

Member Function Documentation

◆ accessRect()

QRect KisBaseRectsWalker::accessRect ( ) const
inline

Definition at line 205 of file kis_base_rects_walker.h.

205 {
206 return m_resultAccessRect;
207 }

◆ addCloneSourceRegenerationJobs()

void KisBaseRectsWalker::addCloneSourceRegenerationJobs ( )
protected

Copy all suitable clone layers' jobs into a separate vector to make sure we don't have hangling iterators caused by calling to visitSubtreeTopToBottom() in the loop

If a clone has complicated masks, we should prepare additional source area to ensure the rect is prepared.

Definition at line 10 of file kis_base_rects_walker.cpp.

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}
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
void visitSubtreeTopToBottom(KisProjectionLeafSP startWith, SubtreeVisitFlags flags, KisRenderPassFlags renderFlags, const QRect &cropRect)
void pushJob(KisProjectionLeafSP leaf, NodePosition position, QRect applyRect, KisRenderPassFlags flags)
qint32 y() const override
qint32 x() const override
KisLayerSP copyFrom
QRect needRectOnSourceForMasks(const QRect &rc) const

References KisCloneLayer::copyFrom, DontNotifyClones, KisBaseRectsWalker::JobItem::m_applyRect, m_cropRect, KisBaseRectsWalker::JobItem::m_leaf, m_mergeTask, KisBaseRectsWalker::JobItem::m_position, N_ABOVE_FILTHY, N_EXTRA, N_FILTHY, KisCloneLayer::needRectOnSourceForMasks(), NoTransformMaskUpdates, pushJob(), SkipNonRenderableNodes, source(), visitSubtreeTopToBottom(), KisCloneLayer::x(), and KisCloneLayer::y().

◆ adjustMasksChangeRect()

virtual void KisBaseRectsWalker::adjustMasksChangeRect ( KisProjectionLeafSP firstMask)
inlineprotectedvirtual

ATTENTION: we miss the first mask

Reimplemented in KisFullRefreshWalker.

Definition at line 426 of file kis_base_rects_walker.h.

426 {
427 KisProjectionLeafSP currentLeaf = firstMask;
428
429 while (currentLeaf) {
434 do {
435 currentLeaf = currentLeaf->nextSibling();
436 } while (currentLeaf &&
437 (!currentLeaf->isMask() || !currentLeaf->visible()));
438
439 if(currentLeaf) {
440 QRect changeRect = currentLeaf->projectionPlane()->changeRect(m_resultChangeRect);
444 }
445 }
446
447 KisProjectionLeafSP parentLayer = firstMask->parent();
449
451 }
void registerCloneNotification(KisNodeSP node, NodePosition position)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128

References KIS_SAFE_ASSERT_RECOVER_RETURN.

◆ calculateChecksum()

static qint32 KisBaseRectsWalker::calculateChecksum ( KisProjectionLeafSP leaf,
const QRect & requestedRect )
inlinestaticprotected

Definition at line 453 of file kis_base_rects_walker.h.

453 {
454 qint32 checksum = 0;
455 qint32 x, y, w, h;
456 QRect tempRect;
457
458 tempRect = leaf->projectionPlane()->changeRect(requestedRect);
459 tempRect.getRect(&x, &y, &w, &h);
460 checksum += -x - y + w + h;
461
462 tempRect = leaf->projectionPlane()->needRect(requestedRect);
463 tempRect.getRect(&x, &y, &w, &h);
464 checksum += -x - y + w + h;
465
466// errKrita << leaf << requestedRect << "-->" << checksum;
467
468 return checksum;
469 }

◆ calculateNodePosition()

static NodePosition KisBaseRectsWalker::calculateNodePosition ( KisProjectionLeafSP leaf)
inlinestaticprotected

Definition at line 258 of file kis_base_rects_walker.h.

258 {
259 KisProjectionLeafSP nextLeaf = leaf->nextSibling();
260 while(nextLeaf && !nextLeaf->isLayer()) nextLeaf = nextLeaf->nextSibling();
261 if (!nextLeaf) return N_TOPMOST;
262
263 KisProjectionLeafSP prevLeaf = leaf->prevSibling();
264 while(prevLeaf && !prevLeaf->isLayer()) prevLeaf = prevLeaf->prevSibling();
265 if (!prevLeaf) return N_BOTTOMMOST;
266
267 return N_NORMAL;
268 }

◆ changeRect()

QRect KisBaseRectsWalker::changeRect ( ) const
inline

Definition at line 209 of file kis_base_rects_walker.h.

209 {
210 return m_resultChangeRect;
211 }

◆ changeRectVaries()

bool KisBaseRectsWalker::changeRectVaries ( ) const
inline

Definition at line 221 of file kis_base_rects_walker.h.

221 {
222 return m_changeRectVaries;
223 }

◆ checksumValid()

bool KisBaseRectsWalker::checksumValid ( )
inline

Definition at line 172 of file kis_base_rects_walker.h.

172 {
174 return
177 }
static qint32 calculateChecksum(KisProjectionLeafSP leaf, const QRect &requestedRect)
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
KisProjectionLeafSP projectionLeaf
Definition kis_node.cpp:93
int graphSequenceNumber() const
Definition kis_node.cpp:279

References KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE.

◆ clear()

void KisBaseRectsWalker::clear ( )
inlineprotected

Definition at line 274 of file kis_base_rects_walker.h.

274 {
275 m_resultAccessRect = m_resultNeedRect = /*m_resultChangeRect =*/
277
279 m_mergeTask.clear();
280 m_cloneNotifications.clear();
281
282 // Not needed really. Think over removing.
283 //m_startNode = 0;
284 //m_requestedRect = QRect();
285 }
CloneNotificationsVector m_cloneNotifications

◆ cloneNotifications()

CloneNotificationsVector & KisBaseRectsWalker::cloneNotifications ( )
inline

Definition at line 201 of file kis_base_rects_walker.h.

201 {
203 }

◆ clonesDontInvalidateFrames()

bool KisBaseRectsWalker::clonesDontInvalidateFrames ( ) const
inline

Definition at line 183 of file kis_base_rects_walker.h.

183 {
185 }

◆ collectRects()

void KisBaseRectsWalker::collectRects ( KisNodeSP node,
const QRect & requestedRect )
inline

Definition at line 127 of file kis_base_rects_walker.h.

127 {
128 clear();
129
130 KisProjectionLeafSP startLeaf = node->projectionLeaf();
131
137 m_startNode = node;
139 startTrip(startLeaf);
141 }
int getNodeLevelOfDetail(KisProjectionLeafSP leaf)
virtual void startTrip(KisProjectionLeafSP startWith)=0

References KisNode::graphSequenceNumber(), and KisNode::projectionLeaf.

◆ convertPositionToFilthy()

static KisNode::PositionToFilthy KisBaseRectsWalker::convertPositionToFilthy ( NodePosition position)
inlinestatic

Definition at line 55 of file kis_base_rects_walker.h.

55 {
56 static const int positionToFilthyMask =
59 N_FILTHY |
61
62 qint32 positionToFilthy = position & N_EXTRA ? N_FILTHY : position & positionToFilthyMask;
63 // We do not use N_FILTHY_ORIGINAL yet, so...
64 Q_ASSERT(positionToFilthy);
65
66 return static_cast<KisNode::PositionToFilthy>(positionToFilthy);
67 }
PositionToFilthy
Definition kis_node.h:58

◆ cropRect()

QRect KisBaseRectsWalker::cropRect ( ) const
inline

Definition at line 191 of file kis_base_rects_walker.h.

191 {
192 return m_cropRect;
193 }

◆ cropThisRect()

QRect KisBaseRectsWalker::cropThisRect ( const QRect & rect,
const QRect & cropRect )
inlineprotected

Definition at line 292 of file kis_base_rects_walker.h.

292 {
293 return cropRect.isValid() ? rect & cropRect : rect;
294 }

◆ getGraphPosition()

static qint32 KisBaseRectsWalker::getGraphPosition ( qint32 position)
inlinestaticprotected

Definition at line 249 of file kis_base_rects_walker.h.

249 {
250 return position & GRAPH_POSITION_MASK;
251 }
#define GRAPH_POSITION_MASK

References GRAPH_POSITION_MASK.

◆ getNodeLevelOfDetail()

int KisBaseRectsWalker::getNodeLevelOfDetail ( KisProjectionLeafSP leaf)
inlineprivate

Such errors may happen during undo or too quick node removal, they shouldn't cause any real problems in Krita work.

Definition at line 475 of file kis_base_rects_walker.h.

475 {
476 while (leaf && !leaf->projection()) {
477 leaf = leaf->parent();
478 }
479
480 if (!leaf || !leaf->projection()) {
485 qWarning() << "WARNING: KisBaseRectsWalker::getNodeLevelOfDetail() "
486 "failed to fetch currentLevelOfDetail() from the node. "
487 "Perhaps the node was removed from the image in the meantime.";
488 return 0;
489 }
490
491 return leaf->projection()->defaultBounds()->currentLevelOfDetail();
492 }

◆ hasClones()

static bool KisBaseRectsWalker::hasClones ( KisNodeSP node)
inlinestaticprotected

Definition at line 253 of file kis_base_rects_walker.h.

253 {
254 KisLayer *layer = qobject_cast<KisLayer*>(node.data());
255 return layer && layer->hasClones();
256 }
bool hasClones() const
Definition kis_layer.cc:483

References KisSharedPtr< T >::data(), and KisLayer::hasClones().

◆ isStartLeaf()

bool KisBaseRectsWalker::isStartLeaf ( KisProjectionLeafSP leaf) const
inlineprotected

Definition at line 270 of file kis_base_rects_walker.h.

270 {
271 return leaf->node() == m_startNode;
272 }

◆ leafStack()

LeafStack & KisBaseRectsWalker::leafStack ( )
inline

Definition at line 196 of file kis_base_rects_walker.h.

196 {
197 return m_mergeTask;
198 }

◆ levelOfDetail()

int KisBaseRectsWalker::levelOfDetail ( ) const
inline

Definition at line 233 of file kis_base_rects_walker.h.

233 {
234 return m_levelOfDetail;
235 }

◆ needRectVaries()

bool KisBaseRectsWalker::needRectVaries ( ) const
inline

Definition at line 217 of file kis_base_rects_walker.h.

217 {
218 return m_needRectVaries;
219 }

◆ pushJob()

void KisBaseRectsWalker::pushJob ( KisProjectionLeafSP leaf,
NodePosition position,
QRect applyRect,
KisRenderPassFlags flags )
inlineprotected

Definition at line 287 of file kis_base_rects_walker.h.

287 {
288 JobItem item = {leaf, position, applyRect, flags};
289 m_mergeTask.push(item);
290 }

◆ Q_DECLARE_FLAGS()

KisBaseRectsWalker::Q_DECLARE_FLAGS ( SubtreeVisitFlags ,
SubtreeVisitFlag  )

◆ recalculate()

void KisBaseRectsWalker::recalculate ( const QRect & requestedRect)
inline

Definition at line 143 of file kis_base_rects_walker.h.

143 {
145
147
148 int calculatedLevelOfDetail = getNodeLevelOfDetail(startLeaf);
149
150 if (m_levelOfDetail != calculatedLevelOfDetail) {
151 qWarning() << "WARNING: KisBaseRectsWalker::recalculate()"
152 << "The levelOfDetail has changes with time,"
153 << "which couldn't have happened!"
155 << ppVar(calculatedLevelOfDetail);
156
157 m_levelOfDetail = calculatedLevelOfDetail;
158 }
159
160 if(startLeaf->isStillInGraph()) {
162 }
163 else {
164 clear();
167 m_resultChangeRect = QRect();
169 }
170 }
void collectRects(KisNodeSP node, const QRect &requestedRect)
#define ppVar(var)
Definition kis_debug.h:155

References collectRects(), KIS_SAFE_ASSERT_RECOVER_RETURN, and ppVar.

◆ registerChangeRect()

virtual void KisBaseRectsWalker::registerChangeRect ( KisProjectionLeafSP leaf,
NodePosition position )
inlineprotectedvirtual

Called for every node we meet on a forward way of the trip.

Reimplemented in KisFullRefreshWalker.

Definition at line 308 of file kis_base_rects_walker.h.

308 {
309 // We do not work with masks here. It is KisLayer's job.
310 if(!leaf->isLayer()) return;
311 if(!(position & N_FILTHY) && !leaf->visible()) return;
312
313 QRect currentChangeRect = leaf->projectionPlane()->changeRect(m_resultChangeRect,
314 convertPositionToFilthy(position));
315 currentChangeRect = cropThisRect(currentChangeRect, m_cropRect);
316
318 m_changeRectVaries = currentChangeRect != m_resultChangeRect;
319
320 m_resultChangeRect = currentChangeRect;
321
322 m_resultUncroppedChangeRect = leaf->projectionPlane()->changeRect(m_resultUncroppedChangeRect,
323 convertPositionToFilthy(position));
324 registerCloneNotification(leaf->node(), position);
325 }
QRect cropThisRect(const QRect &rect, const QRect &cropRect)
static KisNode::PositionToFilthy convertPositionToFilthy(NodePosition position)

◆ registerCloneNotification()

void KisBaseRectsWalker::registerCloneNotification ( KisNodeSP node,
NodePosition position )
inlineprotected

Note, we do not check for (N_ABOVE_FILTHY && dependOnLowerNodes(node)) because it may lead to an infinite loop with filter layer. Activate it when it is guaranteed that it is not possible to create a filter layer above its own clone

Definition at line 327 of file kis_base_rects_walker.h.

327 {
336 if(hasClones(node) && position & (N_FILTHY | N_FILTHY_PROJECTION | N_EXTRA)) {
339 }
340 }
static bool hasClones(KisNodeSP node)

◆ registerNeedRect() [1/2]

void KisBaseRectsWalker::registerNeedRect ( KisProjectionLeafSP leaf,
NodePosition position,
KisRenderPassFlags flags )
inlineprotected

Definition at line 342 of file kis_base_rects_walker.h.

342 {
343 registerNeedRect(leaf, position, flags, m_cropRect);
344 }
void registerNeedRect(KisProjectionLeafSP leaf, NodePosition position, KisRenderPassFlags flags)

◆ registerNeedRect() [2/2]

virtual void KisBaseRectsWalker::registerNeedRect ( KisProjectionLeafSP leaf,
NodePosition position,
KisRenderPassFlags flags,
const QRect & cropRect )
inlineprotectedvirtual

Called for every node we meet on a backward way of the trip.

Reimplemented in KisFullRefreshWalker.

Definition at line 349 of file kis_base_rects_walker.h.

350 {
351 // We do not work with masks here. It is KisLayer's job.
352 if(!leaf->isLayer()) return;
353
354 if(m_mergeTask.isEmpty())
357
358 if (leaf->parent() && position & N_TOPMOST) {
359 bool parentNeedRectFound = false;
360 QRect parentNeedRect;
361
362 for (auto it = std::make_reverse_iterator(m_mergeTask.end());
363 it != std::make_reverse_iterator(m_mergeTask.begin());
364 ++it) {
365
366 if (it->m_leaf == leaf->parent()) {
367 parentNeedRect =
368 it->m_leaf->projectionPlane()->needRectForOriginal(it->m_applyRect);
369 parentNeedRectFound = true;
370 break;
371 }
372 }
373
374 // TODO: check if we can put this requirement
375 // KIS_SAFE_ASSERT_RECOVER_NOOP(parentNeedRectFound);
376
377 if (parentNeedRectFound) {
378 m_lastNeedRect = parentNeedRect;
379 } else {
380 // legacy way of fetching parent need rect, just
381 // takes need rect of the last visited filthy node
383 }
384 }
385
386 if (!leaf->shouldBeRendered()) {
387 if (!m_lastNeedRect.isEmpty()) {
388 // push a dumb job to fit state machine requirements
389 pushJob(leaf, position, m_lastNeedRect, flags);
390 }
391 } else if(position & (N_FILTHY | N_ABOVE_FILTHY | N_EXTRA)) {
392 if(!m_lastNeedRect.isEmpty())
393 pushJob(leaf, position, m_lastNeedRect, flags);
394 //else /* Why push empty rect? */;
395
396 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
397 convertPositionToFilthy(position));
398
399 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
400 convertPositionToFilthy(position));
403 }
404 else if(position & (N_BELOW_FILTHY | N_FILTHY_PROJECTION)) {
405 if(!m_lastNeedRect.isEmpty()) {
406 pushJob(leaf, position, m_lastNeedRect, flags);
407
408 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
409 convertPositionToFilthy(position));
410
411 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
412 convertPositionToFilthy(position));
414 }
415 }
416 else {
417 // N_FILTHY_ORIGINAL is not used so it goes there
418 qFatal("KisBaseRectsWalker: node position(%d) is out of range", position);
419 }
420
424 }

◆ requestedRect()

QRect KisBaseRectsWalker::requestedRect ( ) const
inline

Definition at line 229 of file kis_base_rects_walker.h.

229 {
230 return m_requestedRect;
231 }

◆ setClonesDontInvalidateFrames()

void KisBaseRectsWalker::setClonesDontInvalidateFrames ( bool value)
inline

Definition at line 179 of file kis_base_rects_walker.h.

179 {
181 }
float value(const T *src, size_t ch)

References value().

◆ setCropRect()

void KisBaseRectsWalker::setCropRect ( QRect cropRect)
inline

Definition at line 187 of file kis_base_rects_walker.h.

187 {
189 }

◆ setExplicitChangeRect()

void KisBaseRectsWalker::setExplicitChangeRect ( const QRect & changeRect,
bool changeRectVaries )
inlineprotected

Used by KisFullRefreshWalker as it has a special changeRect strategy

Definition at line 299 of file kis_base_rects_walker.h.

◆ startNode()

KisNodeSP KisBaseRectsWalker::startNode ( ) const
inline

Definition at line 225 of file kis_base_rects_walker.h.

225 {
226 return m_startNode;
227 }

◆ startTrip()

virtual void KisBaseRectsWalker::startTrip ( KisProjectionLeafSP startWith)
protectedpure virtual

Initiates collecting of rects. Should be implemented in derived classes

Implemented in KisFullRefreshWalker, KisMergeWalker, KisRefreshSubtreeWalker, and KisMergeWalker.

◆ type()

virtual UpdateType KisBaseRectsWalker::type ( ) const
pure virtual

◆ uncroppedChangeRect()

QRect KisBaseRectsWalker::uncroppedChangeRect ( ) const
inline

Definition at line 213 of file kis_base_rects_walker.h.

213 {
215 }

◆ visitSubtreeTopToBottom()

void KisBaseRectsWalker::visitSubtreeTopToBottom ( KisProjectionLeafSP startWith,
SubtreeVisitFlags flags,
KisRenderPassFlags renderFlags,
const QRect & cropRect )
protected

If the node is not renderable and we don't care about hidden groups, e.g. when generating animation frames, then just skip the entire group.

registerNeedRect() and registerCloneNotification() automatically skip non-layer leafs

we didn't have a change-rect pass, so we should add clone notifications manually

In no-filthy mode we just recompose the root layer without entering any subgroups

Definition at line 73 of file kis_base_rects_walker.cpp.

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}
static NodePosition calculateNodePosition(KisProjectionLeafSP leaf)

References calculateNodePosition(), cropRect(), DontNotifyClones, N_ABOVE_FILTHY, N_FILTHY, NoFilthyMode, registerCloneNotification(), registerNeedRect(), SkipNonRenderableNodes, and visitSubtreeTopToBottom().

Member Data Documentation

◆ m_changeRectVaries

bool KisBaseRectsWalker::m_changeRectVaries {false}
private

Definition at line 505 of file kis_base_rects_walker.h.

505{false};

◆ m_childNeedRect

QRect KisBaseRectsWalker::m_childNeedRect
private

Definition at line 534 of file kis_base_rects_walker.h.

◆ m_cloneNotifications

CloneNotificationsVector KisBaseRectsWalker::m_cloneNotifications
private

Definition at line 507 of file kis_base_rects_walker.h.

◆ m_clonesDontInvalidateFrames

bool KisBaseRectsWalker::m_clonesDontInvalidateFrames {false}
private

Definition at line 539 of file kis_base_rects_walker.h.

539{false};

◆ m_cropRect

QRect KisBaseRectsWalker::m_cropRect
private

Temporary variables

Definition at line 532 of file kis_base_rects_walker.h.

◆ m_graphChecksum

qint32 KisBaseRectsWalker::m_graphChecksum {0}
private

Used for getting know whether the structure of the graph has changed since the walker was calculated

Definition at line 527 of file kis_base_rects_walker.h.

527{0};

◆ m_lastNeedRect

QRect KisBaseRectsWalker::m_lastNeedRect
private

Definition at line 535 of file kis_base_rects_walker.h.

◆ m_levelOfDetail

int KisBaseRectsWalker::m_levelOfDetail {0}
private

Definition at line 537 of file kis_base_rects_walker.h.

537{0};

◆ m_mergeTask

LeafStack KisBaseRectsWalker::m_mergeTask
private

Definition at line 506 of file kis_base_rects_walker.h.

◆ m_needRectVaries

bool KisBaseRectsWalker::m_needRectVaries {false}
private

Definition at line 504 of file kis_base_rects_walker.h.

504{false};

◆ m_nodeChecksum

qint32 KisBaseRectsWalker::m_nodeChecksum {0}
private

Used for getting know whether the start node properties have changed since the walker was calculated

Definition at line 520 of file kis_base_rects_walker.h.

520{0};

◆ m_requestedRect

QRect KisBaseRectsWalker::m_requestedRect
private

Definition at line 513 of file kis_base_rects_walker.h.

◆ m_resultAccessRect

QRect KisBaseRectsWalker::m_resultAccessRect
private

The result variables. By the end of a recursion they will store a complete data for a successful merge operation.

Definition at line 500 of file kis_base_rects_walker.h.

◆ m_resultChangeRect

QRect KisBaseRectsWalker::m_resultChangeRect
private

Definition at line 502 of file kis_base_rects_walker.h.

◆ m_resultNeedRect

QRect KisBaseRectsWalker::m_resultNeedRect
private

Definition at line 501 of file kis_base_rects_walker.h.

◆ m_resultUncroppedChangeRect

QRect KisBaseRectsWalker::m_resultUncroppedChangeRect
private

Definition at line 503 of file kis_base_rects_walker.h.

◆ m_startNode

KisNodeSP KisBaseRectsWalker::m_startNode
private

Used by update optimization framework

Definition at line 512 of file kis_base_rects_walker.h.


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