From 75591fa4916772b79fd10fb447a661a79b6701e5 Mon Sep 17 00:00:00 2001
From: David Capello <davidcapello@gmail.com>
Date: Sat, 26 Apr 2014 12:06:11 -0300
Subject: [PATCH] Fix animation playback in MiniEditor: now it handles frame
 duration correctly

---
 src/app/ui/mini_editor.cpp | 40 +++++++++++++++++++-------------------
 src/app/ui/mini_editor.h   |  2 +-
 2 files changed, 21 insertions(+), 21 deletions(-)

diff --git a/src/app/ui/mini_editor.cpp b/src/app/ui/mini_editor.cpp
index 6e31f57e6..a9f1f2823 100644
--- a/src/app/ui/mini_editor.cpp
+++ b/src/app/ui/mini_editor.cpp
@@ -170,7 +170,20 @@ void MiniEditorWindow::onClose(ui::CloseEvent& ev)
 
 void MiniEditorWindow::onPlayClicked()
 {
-  resetTimer();
+  if (m_playButton->isPlaying()) {
+    Editor* miniEditor = (m_docView ? m_docView->getEditor(): NULL);
+    if (miniEditor && miniEditor->getDocument() != NULL)
+      m_nextFrameTime = miniEditor->getSprite()->getFrameDuration(miniEditor->getFrame());
+    else
+      m_nextFrameTime = -1;
+
+    m_curFrameTick = ji_clock;
+
+    m_playTimer.start();
+  }
+  else {
+    m_playTimer.stop();
+  }
 }
 
 void MiniEditorWindow::updateUsingEditor(Editor* editor)
@@ -214,22 +227,6 @@ void MiniEditorWindow::hideWindow()
     closeWindow(NULL);
 }
 
-void MiniEditorWindow::resetTimer()
-{
-  if (m_playButton->isPlaying()) {
-    m_playTimer.start();
-
-    Editor* miniEditor = (m_docView ? m_docView->getEditor(): NULL);
-    if (miniEditor && miniEditor->getDocument() != NULL)
-      m_nextFrameTime = miniEditor->getSprite()->getFrameDuration(miniEditor->getFrame());
-    else
-      m_nextFrameTime = -1;
-  }
-  else {
-    m_playTimer.stop();
-  }
-}
-
 void MiniEditorWindow::onPlaybackTick()
 {
   Editor* miniEditor = (m_docView ? m_docView->getEditor(): NULL);
@@ -237,15 +234,18 @@ void MiniEditorWindow::onPlaybackTick()
     return;
 
   if (m_nextFrameTime >= 0) {
-    m_nextFrameTime -= 10;      // onPlaybackTick()
-    if (m_nextFrameTime <= 0) {
+    m_nextFrameTime -= (ji_clock - m_curFrameTick);
+
+    while (m_nextFrameTime <= 0) {
       FrameNumber frame = miniEditor->getFrame().next();
       if (frame > miniEditor->getSprite()->getLastFrame())
         frame = FrameNumber(0);
       miniEditor->setFrame(frame);
 
-      m_nextFrameTime = miniEditor->getSprite()->getFrameDuration(miniEditor->getFrame());
+      m_nextFrameTime += miniEditor->getSprite()->getFrameDuration(miniEditor->getFrame());
     }
+
+    m_curFrameTick = ji_clock;
   }
   invalidate();
 }
diff --git a/src/app/ui/mini_editor.h b/src/app/ui/mini_editor.h
index 3e4f25c9e..3585676e3 100644
--- a/src/app/ui/mini_editor.h
+++ b/src/app/ui/mini_editor.h
@@ -44,7 +44,6 @@ namespace app {
     void onPlayClicked();
     void onPlaybackTick();
     void hideWindow();
-    void resetTimer();
 
     bool m_isEnabled;
     DocumentView* m_docView;
@@ -54,6 +53,7 @@ namespace app {
     // Number of milliseconds to go to the next frame if m_playTimer
     // is activated.
     int m_nextFrameTime;
+    int m_curFrameTick;
   };
 
 } // namespace app