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

#ifndef SKPAnimationBench_DEFINED
#define SKPAnimationBench_DEFINED

#include "bench/SKPBench.h"
#include "include/utils/SkRandom.h"
#include "tools/timer/Timer.h"

/**
 * Runs an SkPicture as a benchmark by repeatedly drawing it, first centering the picture and
 * for each step it concats the passed in matrix
 */
class SKPAnimationBench : public SKPBench {
public:
    class Animation : public SkRefCnt {
    public:
        virtual const char* getTag() = 0;
        virtual void preConcatFrameMatrix(double animationTimeMs, const SkIRect& devBounds,
                                          SkMatrix* drawMatrix) = 0;
    };

    SKPAnimationBench(const char* name, const SkPicture*, const SkIRect& devClip, sk_sp<Animation>,
                      bool doLooping);

    static sk_sp<Animation> MakeZoomAnimation(SkScalar zoomMax, double zoomPeriodMs);

protected:
    const char* onGetUniqueName() override;
    void onPerCanvasPreDraw(SkCanvas* canvas) override;

    void drawMPDPicture() override {
        SK_ABORT("MPD not supported\n");
    }
    void drawPicture() override;

private:
    sk_sp<Animation> fAnimation;
    SkRandom         fAnimationTime;
    SkString         fUniqueName;
    SkIRect          fDevBounds;

    using INHERITED = SKPBench;
};

#endif
