From 495e0f079ced1d2d23368de263f50232eca1ab4a Mon Sep 17 00:00:00 2001 From: Leon Scroggins III Date: Mon, 29 Jan 2018 19:35:55 -0500 Subject: 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 Commit-Queue: Leon Scroggins --- samplecode/SampleAnimatedImage.cpp | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'samplecode/SampleAnimatedImage.cpp') 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 fImage; sk_sp fDrawable; SkScalar fYOffset; + bool fRunning = false; + double fCurrentTime = 0.0; + double fLastWallTime = 0.0; + double fTimeToShowNextFrame = 0.0; typedef SampleView INHERITED; }; -- cgit v1.2.3