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

#ifndef StatsLayer_DEFINED
#define StatsLayer_DEFINED

#include "include/core/SkColor.h"
#include "include/core/SkString.h"
#include "include/private/SkTArray.h"
#include "tools/sk_app/Window.h"

class SkSurface;

class StatsLayer : public sk_app::Window::Layer {
public:
    StatsLayer();
    void resetMeasurements();

    typedef int Timer;

    Timer addTimer(const char* label, SkColor color, SkColor labelColor = 0);
    void beginTiming(Timer);
    void endTiming(Timer);

    void enableGpuTimer(SkColor color);
    void disableGpuTimer();
    bool isGpuTimerEnabled() const { return fGpuTimerEnabled; }
    std::function<void(uint64_t ns)> issueGpuTimer();

    void onPrePaint() override;
    void onPaint(SkSurface*) override;

    void setDisplayScale(float scale) { fDisplayScale = scale; }

private:
    static const int kMeasurementCount = 1 << 6;  // should be power of 2 for fast mod
    struct TimerData {
        double fTimes[kMeasurementCount];
        SkString fLabel;
        SkColor fColor;
        SkColor fLabelColor;
    };
    skia_private::TArray<TimerData> fTimers;
    double fTotalTimes[kMeasurementCount];

    TimerData fGpuTimer;
    bool fGpuTimerEnabled = false;

    int fCurrentMeasurement;
    double fLastTotalBegin;
    double fCumulativeMeasurementTime;
    int fCumulativeMeasurementCount;
    float fDisplayScale;
};

#endif
