/*
 * 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

