132 m_nodeChecksum = calculateChecksum(startLeaf, requestedRect);
134 m_resultChangeRect = requestedRect;
135 m_resultUncroppedChangeRect = requestedRect;
136 m_requestedRect = requestedRect;
138 m_levelOfDetail = getNodeLevelOfDetail(startLeaf);
139 startTrip(startLeaf);
140 addCloneSourceRegenerationJobs();
148 int calculatedLevelOfDetail = getNodeLevelOfDetail(startLeaf);
150 if (m_levelOfDetail != calculatedLevelOfDetail) {
151 qWarning() <<
"WARNING: KisBaseRectsWalker::recalculate()"
152 <<
"The levelOfDetail has changes with time,"
153 <<
"which couldn't have happened!"
154 <<
ppVar(m_levelOfDetail)
155 <<
ppVar(calculatedLevelOfDetail);
157 m_levelOfDetail = calculatedLevelOfDetail;
160 if(startLeaf->isStillInGraph()) {
165 m_nodeChecksum = calculateChecksum(startLeaf, requestedRect);
166 m_graphChecksum = m_startNode->graphSequenceNumber();
167 m_resultChangeRect = QRect();
168 m_resultUncroppedChangeRect = QRect();
310 if(!leaf->isLayer())
return;
311 if(!(position & N_FILTHY) && !leaf->visible())
return;
313 QRect currentChangeRect = leaf->projectionPlane()->changeRect(m_resultChangeRect,
314 convertPositionToFilthy(position));
315 currentChangeRect = cropThisRect(currentChangeRect, m_cropRect);
317 if(!m_changeRectVaries)
318 m_changeRectVaries = currentChangeRect != m_resultChangeRect;
320 m_resultChangeRect = currentChangeRect;
322 m_resultUncroppedChangeRect = leaf->projectionPlane()->changeRect(m_resultUncroppedChangeRect,
323 convertPositionToFilthy(position));
324 registerCloneNotification(leaf->node(), position);
350 KisRenderPassFlags flags,
const QRect &cropRect) {
352 if(!leaf->isLayer())
return;
354 if(m_mergeTask.isEmpty())
355 m_resultAccessRect = m_resultNeedRect = m_childNeedRect =
356 m_lastNeedRect = m_resultChangeRect;
358 if (leaf->parent() && position & N_TOPMOST) {
359 bool parentNeedRectFound =
false;
360 QRect parentNeedRect;
362 for (
auto it = std::make_reverse_iterator(m_mergeTask.end());
363 it != std::make_reverse_iterator(m_mergeTask.begin());
366 if (it->m_leaf == leaf->parent()) {
368 it->m_leaf->projectionPlane()->needRectForOriginal(it->m_applyRect);
369 parentNeedRectFound =
true;
377 if (parentNeedRectFound) {
378 m_lastNeedRect = parentNeedRect;
382 m_lastNeedRect = m_childNeedRect;
386 if (!leaf->shouldBeRendered()) {
387 if (!m_lastNeedRect.isEmpty()) {
389 pushJob(leaf, position, m_lastNeedRect, flags);
391 }
else if(position & (N_FILTHY | N_ABOVE_FILTHY | N_EXTRA)) {
392 if(!m_lastNeedRect.isEmpty())
393 pushJob(leaf, position, m_lastNeedRect, flags);
396 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
397 convertPositionToFilthy(position));
399 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
400 convertPositionToFilthy(position));
401 m_lastNeedRect = cropThisRect(m_lastNeedRect, cropRect);
402 m_childNeedRect = m_lastNeedRect;
404 else if(position & (N_BELOW_FILTHY | N_FILTHY_PROJECTION)) {
405 if(!m_lastNeedRect.isEmpty()) {
406 pushJob(leaf, position, m_lastNeedRect, flags);
408 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
409 convertPositionToFilthy(position));
411 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
412 convertPositionToFilthy(position));
413 m_lastNeedRect = cropThisRect(m_lastNeedRect, cropRect);
418 qFatal(
"KisBaseRectsWalker: node position(%d) is out of range", position);
421 if(!m_needRectVaries)
422 m_needRectVaries = m_resultNeedRect != m_lastNeedRect;
423 m_resultNeedRect |= m_lastNeedRect;
429 while (currentLeaf) {
435 currentLeaf = currentLeaf->nextSibling();
436 }
while (currentLeaf &&
437 (!currentLeaf->isMask() || !currentLeaf->visible()));
440 QRect changeRect = currentLeaf->projectionPlane()->changeRect(m_resultChangeRect);
441 m_changeRectVaries |= changeRect != m_resultChangeRect;
442 m_resultChangeRect = changeRect;
443 m_resultUncroppedChangeRect = changeRect;
450 registerCloneNotification(parentLayer->node(), N_FILTHY_PROJECTION);
458 tempRect = leaf->projectionPlane()->changeRect(requestedRect);
459 tempRect.getRect(&x, &y, &w, &h);
460 checksum += -x - y + w + h;
462 tempRect = leaf->projectionPlane()->needRect(requestedRect);
463 tempRect.getRect(&x, &y, &w, &h);
464 checksum += -x - y + w + h;