Update Timeline::onPaint() with master branch

This commit is contained in:
David Capello 2020-06-25 20:10:30 -03:00
parent 49ace2b493
commit 1f0570c81c

View File

@ -1586,93 +1586,88 @@ void Timeline::onPaint(ui::PaintEvent& ev)
// Draw each visible layer. // Draw each visible layer.
DrawCelData data; DrawCelData data;
if (layer >= lastLayer && for (layer=lastLayer; layer>=firstLayer; --layer) {
layer >= firstLayer) { {
for (layer=lastLayer; layer>=firstLayer; --layer) { IntersectClip clip(g, getLayerHeadersBounds());
ASSERT(layer >= 0 && layer < int(m_rows.size())); if (clip)
drawLayer(g, layer);
}
{ IntersectClip clip(g, getCelsBounds());
IntersectClip clip(g, getLayerHeadersBounds()); if (!clip)
if (clip) continue;
drawLayer(g, layer);
Layer* layerPtr = m_rows[layer].layer();
if (!layerPtr->isImage()) {
// Draw empty cels
for (frame=firstFrame; frame<=lastFrame; ++frame) {
drawCel(g, layer, frame, nullptr, nullptr);
} }
continue;
}
IntersectClip clip(g, getCelsBounds()); // Get the first CelIterator to be drawn (it is the first cel with cel->frame >= first_frame)
if (!clip) LayerImage* layerImagePtr = static_cast<LayerImage*>(layerPtr);
continue; data.begin = layerImagePtr->getCelBegin();
data.end = layerImagePtr->getCelEnd();
data.it = layerImagePtr->findFirstCelIteratorAfter(firstFrame-1);
if (firstFrame > 0 && data.it != data.begin)
data.prevIt = data.it-1;
else
data.prevIt = data.end;
data.nextIt = (data.it != data.end ? data.it+1: data.end);
Layer* layerPtr = m_rows[layer].layer(); // Calculate link range for the active cel
if (!layerPtr->isImage()) { data.firstLink = data.end;
// Draw empty cels data.lastLink = data.end;
for (frame=firstFrame; frame<=lastFrame; ++frame) {
drawCel(g, layer, frame, nullptr, nullptr);
}
continue;
}
// Get the first CelIterator to be drawn (it is the first cel with cel->frame >= first_frame) if (layerPtr == m_layer) {
LayerImage* layerImagePtr = static_cast<LayerImage*>(layerPtr); data.activeIt = layerImagePtr->findCelIterator(m_frame);
data.begin = layerImagePtr->getCelBegin(); if (data.activeIt != data.end) {
data.end = layerImagePtr->getCelEnd(); data.firstLink = data.activeIt;
data.it = layerImagePtr->findFirstCelIteratorAfter(firstFrame-1); data.lastLink = data.activeIt;
if (firstFrame > 0 && data.it != data.begin)
data.prevIt = data.it-1;
else
data.prevIt = data.end;
data.nextIt = (data.it != data.end ? data.it+1: data.end);
// Calculate link range for the active cel ObjectId imageId = (*data.activeIt)->image()->id();
data.firstLink = data.end;
data.lastLink = data.end;
if (layerPtr == m_layer) { auto it2 = data.activeIt;
data.activeIt = layerImagePtr->findCelIterator(m_frame); if (it2 != data.begin) {
if (data.activeIt != data.end) { do {
data.firstLink = data.activeIt; --it2;
data.lastLink = data.activeIt;
ObjectId imageId = (*data.activeIt)->image()->id();
auto it2 = data.activeIt;
if (it2 != data.begin) {
do {
--it2;
if ((*it2)->image()->id() == imageId) {
data.firstLink = it2;
if ((*data.firstLink)->frame() < firstFrame)
break;
}
} while (it2 != data.begin);
}
it2 = data.activeIt;
while (it2 != data.end) {
if ((*it2)->image()->id() == imageId) { if ((*it2)->image()->id() == imageId) {
data.lastLink = it2; data.firstLink = it2;
if ((*data.lastLink)->frame() > lastFrame) if ((*data.firstLink)->frame() < firstFrame)
break; break;
} }
++it2; } while (it2 != data.begin);
}
it2 = data.activeIt;
while (it2 != data.end) {
if ((*it2)->image()->id() == imageId) {
data.lastLink = it2;
if ((*data.lastLink)->frame() > lastFrame)
break;
} }
++it2;
} }
} }
else }
data.activeIt = data.end; else
data.activeIt = data.end;
// Draw every visible cel for each layer. // Draw every visible cel for each layer.
for (frame=firstFrame; frame<=lastFrame; ++frame) { for (frame=firstFrame; frame<=lastFrame; ++frame) {
Cel* cel = Cel* cel =
(data.it != data.end && (data.it != data.end &&
(*data.it)->frame() == frame ? *data.it: nullptr); (*data.it)->frame() == frame ? *data.it: nullptr);
drawCel(g, layer, frame, cel, &data); drawCel(g, layer, frame, cel, &data);
if (cel) { if (cel) {
data.prevIt = data.it; data.prevIt = data.it;
data.it = data.nextIt; // Point to next cel data.it = data.nextIt; // Point to next cel
if (data.nextIt != data.end) if (data.nextIt != data.end)
++data.nextIt; ++data.nextIt;
}
} }
} }
} }