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
 
bool isEmpty () 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 214 of file kis_base_rects_walker.h.

214 {
215 return m_resultAccessRect;
216 }

◆ addCloneSourceRegenerationJobs()

void KisBaseRectsWalker::addCloneSourceRegenerationJobs ( )
protected

Copy all suitable clone layers' jobs into a separate vector to make sure we don't have dangling 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 435 of file kis_base_rects_walker.h.

435 {
436 KisProjectionLeafSP currentLeaf = firstMask;
437
438 while (currentLeaf) {
443 do {
444 currentLeaf = currentLeaf->nextSibling();
445 } while (currentLeaf &&
446 (!currentLeaf->isMask() || !currentLeaf->visible()));
447
448 if(currentLeaf) {
449 QRect changeRect = currentLeaf->projectionPlane()->changeRect(m_resultChangeRect);
453 }
454 }
455
456 KisProjectionLeafSP parentLayer = firstMask->parent();
458
460 }
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 462 of file kis_base_rects_walker.h.

462 {
463 qint32 checksum = 0;
464 qint32 x, y, w, h;
465 QRect tempRect;
466
467 tempRect = leaf->projectionPlane()->changeRect(requestedRect);
468 tempRect.getRect(&x, &y, &w, &h);
469 checksum += -x - y + w + h;
470
471 tempRect = leaf->projectionPlane()->needRect(requestedRect);
472 tempRect.getRect(&x, &y, &w, &h);
473 checksum += -x - y + w + h;
474
475// errKrita << leaf << requestedRect << "-->" << checksum;
476
477 return checksum;
478 }

◆ calculateNodePosition()

static NodePosition KisBaseRectsWalker::calculateNodePosition ( KisProjectionLeafSP leaf)
inlinestaticprotected

Definition at line 267 of file kis_base_rects_walker.h.

267 {
268 KisProjectionLeafSP nextLeaf = leaf->nextSibling();
269 while(nextLeaf && !nextLeaf->isLayer()) nextLeaf = nextLeaf->nextSibling();
270 if (!nextLeaf) return N_TOPMOST;
271
272 KisProjectionLeafSP prevLeaf = leaf->prevSibling();
273 while(prevLeaf && !prevLeaf->isLayer()) prevLeaf = prevLeaf->prevSibling();
274 if (!prevLeaf) return N_BOTTOMMOST;
275
276 return N_NORMAL;
277 }

◆ changeRect()

QRect KisBaseRectsWalker::changeRect ( ) const
inline

Definition at line 218 of file kis_base_rects_walker.h.

218 {
219 return m_resultChangeRect;
220 }

◆ changeRectVaries()

bool KisBaseRectsWalker::changeRectVaries ( ) const
inline

Definition at line 230 of file kis_base_rects_walker.h.

230 {
231 return m_changeRectVaries;
232 }

◆ 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 283 of file kis_base_rects_walker.h.

283 {
284 m_resultAccessRect = m_resultNeedRect = /*m_resultChangeRect =*/
286
288 m_mergeTask.clear();
289 m_cloneNotifications.clear();
290
291 // Not needed really. Think over removing.
292 //m_startNode = 0;
293 //m_requestedRect = QRect();
294 }
CloneNotificationsVector m_cloneNotifications

◆ cloneNotifications()

CloneNotificationsVector & KisBaseRectsWalker::cloneNotifications ( )
inline

Definition at line 210 of file kis_base_rects_walker.h.

210 {
212 }

◆ 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 301 of file kis_base_rects_walker.h.

301 {
302 return cropRect.isValid() ? rect & cropRect : rect;
303 }

◆ getGraphPosition()

static qint32 KisBaseRectsWalker::getGraphPosition ( qint32 position)
inlinestaticprotected

Definition at line 258 of file kis_base_rects_walker.h.

258 {
259 return position & GRAPH_POSITION_MASK;
260 }
#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 484 of file kis_base_rects_walker.h.

484 {
485 while (leaf && !leaf->projection()) {
486 leaf = leaf->parent();
487 }
488
489 if (!leaf || !leaf->projection()) {
494 qWarning() << "WARNING: KisBaseRectsWalker::getNodeLevelOfDetail() "
495 "failed to fetch currentLevelOfDetail() from the node. "
496 "Perhaps the node was removed from the image in the meantime.";
497 return 0;
498 }
499
500 return leaf->projection()->defaultBounds()->currentLevelOfDetail();
501 }

◆ hasClones()

static bool KisBaseRectsWalker::hasClones ( KisNodeSP node)
inlinestaticprotected

Definition at line 262 of file kis_base_rects_walker.h.

262 {
263 KisLayer *layer = qobject_cast<KisLayer*>(node.data());
264 return layer && layer->hasClones();
265 }
bool hasClones() const
Definition kis_layer.cc:489

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

◆ isEmpty()

bool KisBaseRectsWalker::isEmpty ( ) const
inline

Returns false if the walker will not perform any useful work, which may happen, when, for example, the crop rect fully cropped the requested rect

Definition at line 205 of file kis_base_rects_walker.h.

205 {
206 return m_mergeTask.isEmpty() && m_cloneNotifications.isEmpty();
207 }

◆ isStartLeaf()

bool KisBaseRectsWalker::isStartLeaf ( KisProjectionLeafSP leaf) const
inlineprotected

Definition at line 279 of file kis_base_rects_walker.h.

279 {
280 return leaf->node() == m_startNode;
281 }

◆ 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 242 of file kis_base_rects_walker.h.

242 {
243 return m_levelOfDetail;
244 }

◆ needRectVaries()

bool KisBaseRectsWalker::needRectVaries ( ) const
inline

Definition at line 226 of file kis_base_rects_walker.h.

226 {
227 return m_needRectVaries;
228 }

◆ pushJob()

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

Definition at line 296 of file kis_base_rects_walker.h.

296 {
297 JobItem item = {leaf, position, applyRect, flags};
298 m_mergeTask.push(item);
299 }

◆ 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 317 of file kis_base_rects_walker.h.

317 {
318 // We do not work with masks here. It is KisLayer's job.
319 if(!leaf->isLayer()) return;
320 if(!(position & N_FILTHY) && !leaf->visible()) return;
321
322 QRect currentChangeRect = leaf->projectionPlane()->changeRect(m_resultChangeRect,
323 convertPositionToFilthy(position));
324 currentChangeRect = cropThisRect(currentChangeRect, m_cropRect);
325
327 m_changeRectVaries = currentChangeRect != m_resultChangeRect;
328
329 m_resultChangeRect = currentChangeRect;
330
331 m_resultUncroppedChangeRect = leaf->projectionPlane()->changeRect(m_resultUncroppedChangeRect,
332 convertPositionToFilthy(position));
333 registerCloneNotification(leaf->node(), position);
334 }
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 336 of file kis_base_rects_walker.h.

336 {
345 if(hasClones(node) && position & (N_FILTHY | N_FILTHY_PROJECTION | N_EXTRA)) {
348 }
349 }
static bool hasClones(KisNodeSP node)

◆ registerNeedRect() [1/2]

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

Definition at line 351 of file kis_base_rects_walker.h.

351 {
352 registerNeedRect(leaf, position, flags, m_cropRect);
353 }
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 358 of file kis_base_rects_walker.h.

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

◆ requestedRect()

QRect KisBaseRectsWalker::requestedRect ( ) const
inline

Definition at line 238 of file kis_base_rects_walker.h.

238 {
239 return m_requestedRect;
240 }

◆ 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 308 of file kis_base_rects_walker.h.

◆ startNode()

KisNodeSP KisBaseRectsWalker::startNode ( ) const
inline

Definition at line 234 of file kis_base_rects_walker.h.

234 {
235 return m_startNode;
236 }

◆ 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 222 of file kis_base_rects_walker.h.

222 {
224 }

◆ 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 514 of file kis_base_rects_walker.h.

514{false};

◆ m_childNeedRect

QRect KisBaseRectsWalker::m_childNeedRect
private

Definition at line 543 of file kis_base_rects_walker.h.

◆ m_cloneNotifications

CloneNotificationsVector KisBaseRectsWalker::m_cloneNotifications
private

Definition at line 516 of file kis_base_rects_walker.h.

◆ m_clonesDontInvalidateFrames

bool KisBaseRectsWalker::m_clonesDontInvalidateFrames {false}
private

Definition at line 548 of file kis_base_rects_walker.h.

548{false};

◆ m_cropRect

QRect KisBaseRectsWalker::m_cropRect
private

Temporary variables

Definition at line 541 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 536 of file kis_base_rects_walker.h.

536{0};

◆ m_lastNeedRect

QRect KisBaseRectsWalker::m_lastNeedRect
private

Definition at line 544 of file kis_base_rects_walker.h.

◆ m_levelOfDetail

int KisBaseRectsWalker::m_levelOfDetail {0}
private

Definition at line 546 of file kis_base_rects_walker.h.

546{0};

◆ m_mergeTask

LeafStack KisBaseRectsWalker::m_mergeTask
private

Definition at line 515 of file kis_base_rects_walker.h.

◆ m_needRectVaries

bool KisBaseRectsWalker::m_needRectVaries {false}
private

Definition at line 513 of file kis_base_rects_walker.h.

513{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 529 of file kis_base_rects_walker.h.

529{0};

◆ m_requestedRect

QRect KisBaseRectsWalker::m_requestedRect
private

Definition at line 522 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 509 of file kis_base_rects_walker.h.

◆ m_resultChangeRect

QRect KisBaseRectsWalker::m_resultChangeRect
private

Definition at line 511 of file kis_base_rects_walker.h.

◆ m_resultNeedRect

QRect KisBaseRectsWalker::m_resultNeedRect
private

Definition at line 510 of file kis_base_rects_walker.h.

◆ m_resultUncroppedChangeRect

QRect KisBaseRectsWalker::m_resultUncroppedChangeRect
private

Definition at line 512 of file kis_base_rects_walker.h.

◆ m_startNode

KisNodeSP KisBaseRectsWalker::m_startNode
private

Used by update optimization framework

Definition at line 521 of file kis_base_rects_walker.h.


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