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

#ifndef PictureBenchmark_DEFINED
#define PictureBenchmark_DEFINED

#include "SkTypes.h"
#include "PictureRenderer.h"
#include "TimerData.h"

class BenchTimer;
class SkBenchLogger;
class SkPicture;
class SkString;

namespace sk_tools {

class PictureBenchmark {
public:
    PictureBenchmark();

    ~PictureBenchmark();

    /**
     * Draw the provided SkPicture fRepeats times while collecting timing data, and log the output
     * via fLogger.
     */
    void run(SkPicture* pict);

    void setRepeats(int repeats) {
        fRepeats = repeats;
    }

    /**
     * If true, tells run to log separate timing data for each individual tile. Each tile will be
     * drawn fRepeats times. Requires the PictureRenderer set by setRenderer to be a
     * TiledPictureRenderer.
     */
    void setTimeIndividualTiles(bool indiv) { fTimeIndividualTiles = indiv; }
    bool timeIndividualTiles() const { return fTimeIndividualTiles; }

    void setPurgeDecodedTex(bool purgeDecodedTex) { fPurgeDecodedTex = purgeDecodedTex; }
    bool purgeDecodedText() const { return fPurgeDecodedTex; }

    PictureRenderer* setRenderer(PictureRenderer*);

    void setTimerResultType(TimerData::Result resultType) { fTimerResult = resultType; }

    void setTimersToShow(bool wall, bool truncatedWall, bool cpu, bool truncatedCpu, bool gpu);

    void setLogger(SkBenchLogger* logger) { fLogger = logger; }

private:
    int               fRepeats;
    SkBenchLogger*    fLogger;
    PictureRenderer*  fRenderer;
    TimerData::Result fTimerResult;
    uint32_t          fTimerTypes; // bitfield of TimerData::TimerFlags values
    bool              fTimeIndividualTiles;
    bool              fPurgeDecodedTex;

    void logProgress(const char msg[]);

    BenchTimer* setupTimer(bool useGLTimer = true);
};

}

#endif  // PictureBenchmark_DEFINED
