blob: e59c8f69d304dc641d46d2142b9545307c3c94a5 [file] [log] [blame]
// Copyright 2019 Google LLC.
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
#ifndef SkTimeKeeper_DEFINED
#define SkTimeKeeper_DEFINED
#include "include/core/SkTime.h"
#include <cmath>
class SkTimeKeeper {
private:
double fStartTime = 0; // used when running
float fAnimationMoment = 0; // when paused.
float fDuration = 0;
bool fPaused = false;
bool fStopAtEnd = false;
public:
void setStopAtEnd(bool s) { fStopAtEnd = s; }
float currentTime() {
if (0 == fDuration) {
return 0;
}
if (fPaused) {
return fAnimationMoment;
}
double time = 1e-9 * (SkTime::GetNSecs() - fStartTime);
if (fStopAtEnd && time >= fDuration) {
fPaused = true;
fAnimationMoment = fDuration;
return fAnimationMoment;
}
return std::fmod(time, fDuration);
}
void setDuration(float d) {
fDuration = d;
fStartTime = SkTime::GetNSecs();
fAnimationMoment = 0;
}
bool paused() const { return fPaused; }
float duration() const { return fDuration; }
void seek(float seconds) {
if (fPaused) {
fAnimationMoment = std::fmod(seconds, fDuration);
} else {
fStartTime = SkTime::GetNSecs() - 1e9 * seconds;
}
}
void togglePaused() {
if (fPaused) {
double offset = (fAnimationMoment >= fDuration) ? 0 : -1e9 * fAnimationMoment;
fStartTime = SkTime::GetNSecs() + offset;
fPaused = false;
} else {
fAnimationMoment = this->currentTime();
fPaused = true;
}
}
};
#endif // SkTimeKeeper_DEFINED