/* * 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 SkAnimCodecPlayer_DEFINED #define SkAnimCodecPlayer_DEFINED #include "SkCodec.h" class SkImage; class SkAnimCodecPlayer { public: SkAnimCodecPlayer(std::unique_ptr<SkCodec> codec); ~SkAnimCodecPlayer(); /** * Returns the current frame of the animation. This defaults to the first frame for * animated codecs (i.e. msec = 0). Calling this multiple times (without calling seek()) * will always return the same image object (or null if there was an error). */ sk_sp<SkImage> getFrame(); /** * Return the size of the image(s) that will be returned by getFrame(). */ SkISize dimensions(); /** * Returns the total duration of the animation in milliseconds. Returns 0 for a single-frame * image. */ uint32_t duration() { return fTotalDuration; } /** * Finds the closest frame associated with the time code (in milliseconds) and sets that * to be the current frame (call getFrame() to retrieve that image). * Returns true iff this call to seek() changed the "current frame" for the animation. * Thus if seek() returns false, then getFrame() will return the same image as it did * before this call to seek(). */ bool seek(uint32_t msec); private: std::unique_ptr<SkCodec> fCodec; SkImageInfo fImageInfo; std::vector<SkCodec::FrameInfo> fFrameInfos; std::vector<sk_sp<SkImage> > fImages; int fCurrIndex = 0; uint32_t fTotalDuration; sk_sp<SkImage> getFrameAt(int index); }; #endif