/*
 * 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 VisualStreamTimingModule_DEFINED
#define VisualStreamTimingModule_DEFINED

#include "VisualModule.h"

#include "TimingStateMachine.h"
#include "VisualBench.h"
#include "VisualBenchmarkStream.h"

class SkCanvas;

/*
 * VisualStreamTimingModule is the base class for modules which want to time a stream of Benchmarks.
 *
 * Subclasses should implement renderFrame, which is called for each frame, and timingFinished,
 * which is called when a sample has finished timing.
 */
class VisualStreamTimingModule : public VisualModule {
public:
    VisualStreamTimingModule(VisualBench* owner);
    void draw(SkCanvas* canvas) override;

private:
    virtual void renderFrame(SkCanvas*, Benchmark*, int loops)=0;

    // subclasses should return true to advance the stream
    virtual bool timingFinished(Benchmark*, int loops, double measurement)=0;

    inline void handleInitState(SkCanvas*);
    inline void handleTimingEvent(SkCanvas*, TimingStateMachine::ParentEvents);

    TimingStateMachine fTSM;
    SkAutoTDelete<VisualBenchmarkStream> fBenchmarkStream;
    enum InitState {
        kNone_InitState,
        kReset_InitState,
        kNewBenchmark_InitState,
    };
    InitState fInitState;

    // support framework
    VisualBench* fOwner;

    typedef VisualModule INHERITED;
};

#endif