aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SampleAnimatedImage.cpp
diff options
context:
space:
mode:
authorGravatar Leon Scroggins III <scroggo@google.com>2018-01-29 19:35:55 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-01-30 18:46:35 +0000
commit495e0f079ced1d2d23368de263f50232eca1ab4a (patch)
treed9aaf4b24c48c71e4a71b94cc0ecbaacc8a52772 /samplecode/SampleAnimatedImage.cpp
parent4e95956f117f8c188b565e7baefc252085b02653 (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.cpp29
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;
};