aboutsummaryrefslogtreecommitdiffhomepage
path: root/include/android/SkAnimatedImage.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/android/SkAnimatedImage.h')
-rw-r--r--include/android/SkAnimatedImage.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/include/android/SkAnimatedImage.h b/include/android/SkAnimatedImage.h
new file mode 100644
index 0000000000..1bd9291057
--- /dev/null
+++ b/include/android/SkAnimatedImage.h
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2018 Google Inc.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SkAnimatedImage_DEFINED
+#define SkAnimatedImage_DEFINED
+
+#include "SkBitmap.h"
+#include "SkCodecAnimation.h"
+#include "SkDrawable.h"
+
+class SkAndroidCodec;
+
+/**
+ * Thread unsafe drawable for drawing animated images (e.g. GIF).
+ */
+class SK_API SkAnimatedImage : public SkDrawable {
+public:
+ /**
+ * Create an SkAnimatedImage from the SkAndroidCodec.
+ *
+ * Returns null on failure to allocate pixels. On success, this will
+ * decode the first frame. It will not animate until start() is called.
+ */
+ static sk_sp<SkAnimatedImage> Make(std::unique_ptr<SkAndroidCodec>);
+
+ ~SkAnimatedImage() override;
+
+ /**
+ * Start or resume the animation. update() must be called to advance the
+ * time.
+ */
+ void start();
+
+ /**
+ * Stop the animation. update() has no effect while the animation is
+ * stopped.
+ */
+ void stop();
+
+ /**
+ * Reset the animation to the beginning.
+ */
+ void reset();
+
+ /**
+ * Update the current time. If the image is animating, this may decode
+ * a new frame.
+ *
+ * @return the time to show the next frame.
+ * Returns numeric_limits<double>::max() if there is no max frame to
+ * show, and -1.0 if the animation is not running.
+ */
+ double update(double msecs);
+
+protected:
+ SkRect onGetBounds() override;
+ void onDraw(SkCanvas*) override;
+
+private:
+ struct Frame {
+ SkBitmap fBitmap;
+ int fIndex;
+ SkCodecAnimation::DisposalMethod fDisposalMethod;
+
+ Frame();
+ bool copyTo(Frame*) const;
+ };
+
+ std::unique_ptr<SkAndroidCodec> fCodec;
+ bool fFinished;
+ bool fRunning;
+ double fNowMS;
+ double fRemainingMS;
+ Frame fActiveFrame;
+ Frame fRestoreFrame;
+
+ SkAnimatedImage(std::unique_ptr<SkAndroidCodec>);
+
+ typedef SkDrawable INHERITED;
+};
+
+#endif // SkAnimatedImage_DEFINED