/*
 * Copyright 2017 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef Skottie_DEFINED
#define Skottie_DEFINED

#include "SkRefCnt.h"
#include "SkSize.h"
#include "SkString.h"
#include "SkTArray.h"
#include "SkTHash.h"
#include "SkTypes.h"

#include <memory>

class SkCanvas;
struct SkRect;
class SkStream;

namespace Json { class Value; }

namespace sksg { class Scene;  }

namespace skottie {

class ResourceProvider : public SkNoncopyable {
public:
    virtual ~ResourceProvider() = default;

    virtual std::unique_ptr<SkStream> openStream(const char resource[]) const = 0;
};

class Animation : public SkNoncopyable {
public:
    static std::unique_ptr<Animation> Make(SkStream*, const ResourceProvider&);
    static std::unique_ptr<Animation> MakeFromFile(const char path[],
                                                   const ResourceProvider* = nullptr);

    ~Animation();

    void render(SkCanvas*, const SkRect* dst = nullptr) const;

    void animationTick(SkMSec);

    const SkString& version() const { return fVersion;   }
    const SkSize&      size() const { return fSize;      }
         SkScalar frameRate() const { return fFrameRate; }
         SkScalar   inPoint() const { return fInPoint;   }
         SkScalar  outPoint() const { return fOutPoint;  }

    void setShowInval(bool show);

private:
    Animation(const ResourceProvider&,
              SkString ver, const SkSize& size, SkScalar fps,
              const Json::Value&);

    SkString                     fVersion;
    SkSize                       fSize;
    SkScalar                     fFrameRate,
                                 fInPoint,
                                 fOutPoint;

    std::unique_ptr<sksg::Scene> fScene;

    typedef SkNoncopyable INHERITED;
};

} // namespace skottie

#endif // Skottie_DEFINED
