Fix onion skin rendering (fix #3739)

This commit is contained in:
Martín Capello 2023-03-15 15:20:53 -03:00
parent 6702844314
commit b1335c2c00
2 changed files with 14 additions and 4 deletions

View File

@ -232,6 +232,14 @@ bool Playback::handleExitFrame(const frame_t frameDelta)
m_playing.back()->invertForward();
return decrementRepeat(frameDelta);
}
else if (m_playMode == PlayInLoop && frameDelta < 0
&& m_frame == firstTagFrame(tag)) {
PLAY_TRACE(" Going to last frame=", lastTagFrame(tag),
" (PlayInLoop) frame=", m_frame, " forward=", forward);
m_frame = lastTagFrame(tag);
return false;
}
}
if (frameDelta > 0 && m_frame == m_sprite->lastFrame()) {
@ -486,7 +494,7 @@ frame_t Playback::firstTagFrame(const Tag* tag)
ASSERT(!m_playing.empty());
int forward = m_playing.back()->forward;
return (forward < 0 ? tag->toFrame():
tag->fromFrame());
tag->fromFrame());
}
frame_t Playback::lastTagFrame(const Tag* tag)

View File

@ -858,11 +858,13 @@ void Render::renderOnionskin(
m_sprite,
TagsList(), // TODO add an onionskin option to iterate subtags
frame,
Playback::PlayInLoop,
loop ? Playback::PlayInLoop : Playback::PlayAll,
loop);
play.nextFrame(-m_onionskin.prevFrames());
frame_t prevFrames = (loop ? m_onionskin.prevFrames():
std::min(frame, m_onionskin.prevFrames()));
play.nextFrame(-prevFrames);
for (frame_t frameOut = frame - m_onionskin.prevFrames();
for (frame_t frameOut = frame - prevFrames;
frameOut <= frame + m_onionskin.nextFrames();
++frameOut, play.nextFrame()) {
const frame_t frameIn = play.frame();