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();
319 if(!leaf->isLayer())
return;
320 if(!(position & N_FILTHY) && !leaf->visible())
return;
322 QRect currentChangeRect = leaf->projectionPlane()->changeRect(m_resultChangeRect,
323 convertPositionToFilthy(position));
324 currentChangeRect = cropThisRect(currentChangeRect, m_cropRect);
326 if(!m_changeRectVaries)
327 m_changeRectVaries = currentChangeRect != m_resultChangeRect;
329 m_resultChangeRect = currentChangeRect;
331 m_resultUncroppedChangeRect = leaf->projectionPlane()->changeRect(m_resultUncroppedChangeRect,
332 convertPositionToFilthy(position));
333 registerCloneNotification(leaf->node(), position);
359 KisRenderPassFlags flags,
const QRect &cropRect) {
361 if(!leaf->isLayer())
return;
363 if(m_mergeTask.isEmpty())
364 m_resultAccessRect = m_resultNeedRect = m_childNeedRect =
365 m_lastNeedRect = m_resultChangeRect;
367 if (leaf->parent() && position & N_TOPMOST) {
368 bool parentNeedRectFound =
false;
369 QRect parentNeedRect;
371 for (
auto it = std::make_reverse_iterator(m_mergeTask.end());
372 it != std::make_reverse_iterator(m_mergeTask.begin());
375 if (it->m_leaf == leaf->parent()) {
377 it->m_leaf->projectionPlane()->needRectForOriginal(it->m_applyRect);
378 parentNeedRectFound =
true;
386 if (parentNeedRectFound) {
387 m_lastNeedRect = parentNeedRect;
391 m_lastNeedRect = m_childNeedRect;
395 if (!leaf->shouldBeRendered()) {
396 if (!m_lastNeedRect.isEmpty()) {
398 pushJob(leaf, position, m_lastNeedRect, flags);
400 }
else if(position & (N_FILTHY | N_ABOVE_FILTHY | N_EXTRA)) {
401 if(!m_lastNeedRect.isEmpty())
402 pushJob(leaf, position, m_lastNeedRect, flags);
405 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
406 convertPositionToFilthy(position));
408 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
409 convertPositionToFilthy(position));
410 m_lastNeedRect = cropThisRect(m_lastNeedRect, cropRect);
411 m_childNeedRect = m_lastNeedRect;
413 else if(position & (N_BELOW_FILTHY | N_FILTHY_PROJECTION)) {
414 if(!m_lastNeedRect.isEmpty()) {
415 pushJob(leaf, position, m_lastNeedRect, flags);
417 m_resultAccessRect |= leaf->projectionPlane()->accessRect(m_lastNeedRect,
418 convertPositionToFilthy(position));
420 m_lastNeedRect = leaf->projectionPlane()->needRect(m_lastNeedRect,
421 convertPositionToFilthy(position));
422 m_lastNeedRect = cropThisRect(m_lastNeedRect, cropRect);
427 qFatal(
"KisBaseRectsWalker: node position(%d) is out of range", position);
430 if(!m_needRectVaries)
431 m_needRectVaries = m_resultNeedRect != m_lastNeedRect;
432 m_resultNeedRect |= m_lastNeedRect;
438 while (currentLeaf) {
444 currentLeaf = currentLeaf->nextSibling();
445 }
while (currentLeaf &&
446 (!currentLeaf->isMask() || !currentLeaf->visible()));
449 QRect changeRect = currentLeaf->projectionPlane()->changeRect(m_resultChangeRect);
450 m_changeRectVaries |= changeRect != m_resultChangeRect;
451 m_resultChangeRect = changeRect;
452 m_resultUncroppedChangeRect = changeRect;
459 registerCloneNotification(parentLayer->node(), N_FILTHY_PROJECTION);
467 tempRect = leaf->projectionPlane()->changeRect(requestedRect);
468 tempRect.getRect(&x, &y, &w, &h);
469 checksum += -x - y + w + h;
471 tempRect = leaf->projectionPlane()->needRect(requestedRect);
472 tempRect.getRect(&x, &y, &w, &h);
473 checksum += -x - y + w + h;