diff options
author | Leon Scroggins III <scroggo@google.com> | 2018-01-29 19:35:55 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-01-30 18:46:35 +0000 |
commit | 495e0f079ced1d2d23368de263f50232eca1ab4a (patch) | |
tree | d9aaf4b24c48c71e4a71b94cc0ecbaacc8a52772 /samplecode/SampleAnimatedImage.cpp | |
parent | 4e95956f117f8c188b565e7baefc252085b02653 (diff) |
Simplify SkAnimatedImage
Bug: b/63908092
Rather than keeping track of the time and whether the animation is
running, leave that up to the client. Offer a single method to decode
the next frame, allowing the client to stay one frame ahead.
Change-Id: I546013e32e3a0874181b0dce1349bbec07aaadd4
Reviewed-on: https://skia-review.googlesource.com/101544
Reviewed-by: Derek Sollenberger <djsollen@google.com>
Commit-Queue: Leon Scroggins <scroggo@google.com>
Diffstat (limited to 'samplecode/SampleAnimatedImage.cpp')
-rw-r--r-- | samplecode/SampleAnimatedImage.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/samplecode/SampleAnimatedImage.cpp b/samplecode/SampleAnimatedImage.cpp index 5c02d29bbe..bea601860c 100644 --- a/samplecode/SampleAnimatedImage.cpp +++ b/samplecode/SampleAnimatedImage.cpp @@ -62,7 +62,19 @@ protected: return false; } - fImage->update(animTimer.msec()); + const double lastWallTime = fLastWallTime; + fLastWallTime = animTimer.msec(); + + if (fRunning) { + fCurrentTime += fLastWallTime - lastWallTime; + if (fCurrentTime > fTimeToShowNextFrame) { + fTimeToShowNextFrame += fImage->decodeNextFrame(); + if (fImage->isFinished()) { + fRunning = false; + } + } + } + return true; } @@ -78,6 +90,7 @@ protected: return; } + fTimeToShowNextFrame = fImage->currentFrameDuration(); SkPictureRecorder recorder; auto canvas = recorder.beginRecording(fImage->getBounds()); canvas->drawDrawable(fImage.get()); @@ -94,14 +107,16 @@ protected: if (fImage && SampleCode::CharQ(*evt, &uni)) { switch (uni) { case kPauseKey: - if (fImage->isRunning()) { - fImage->stop(); + fRunning = !fRunning; + if (fImage->isFinished()) { + // fall through } else { - fImage->start(); + return true; } - return true; case kResetKey: fImage->reset(); + fCurrentTime = fLastWallTime; + fTimeToShowNextFrame = fCurrentTime + fImage->currentFrameDuration(); return true; default: break; @@ -114,6 +129,10 @@ private: sk_sp<SkAnimatedImage> fImage; sk_sp<SkDrawable> fDrawable; SkScalar fYOffset; + bool fRunning = false; + double fCurrentTime = 0.0; + double fLastWallTime = 0.0; + double fTimeToShowNextFrame = 0.0; typedef SampleView INHERITED; }; |