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

#ifndef Viewer_DEFINED
#define Viewer_DEFINED

#include "sk_app/Application.h"
#include "sk_app/CommandSet.h"
#include "sk_app/Window.h"
#include "gm.h"
#include "SkAnimTimer.h"
#include "SkTouchGesture.h"
#include "Slide.h"

class SkCanvas;

class Viewer : public sk_app::Application {
public:
    Viewer(int argc, char** argv, void* platformData);
    ~Viewer() override;

    void onPaint(SkCanvas* canvas);
    void onIdle() override;
    bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y);
    void onUIStateChanged(const SkString& stateName, const SkString& stateValue);

private:
    void initSlides();
    void updateTitle();
    void setupCurrentSlide(int previousSlide);

    void updateUIState();

    void drawSlide(SkCanvas* canvs, bool inSplitScreen);
    void drawStats(SkCanvas* canvas);

    void changeZoomLevel(float delta);
    SkMatrix computeMatrix();

    sk_app::Window*        fWindow;

    static const int kMeasurementCount = 64;  // should be power of 2 for fast mod
    double fMeasurements[kMeasurementCount];
    int fCurrentMeasurement;

    SkAnimTimer            fAnimTimer;
    SkTArray<sk_sp<Slide>> fSlides;
    int                    fCurrentSlide;

    bool                   fDisplayStats;
    bool                   fRefresh; // whether to continuously refresh for measuring render time

    // whether to split the screen and draw two copies of the slide, one with sRGB and one without
    bool                   fSplitScreen;

    sk_app::Window::BackendType fBackendType;

    // transform data
    SkScalar               fZoomCenterX;
    SkScalar               fZoomCenterY;
    SkScalar               fZoomLevel;
    SkScalar               fZoomScale;

    sk_app::CommandSet     fCommands;

    SkTouchGesture         fGesture;

    // identity unless the window initially scales the content to fit the screen.
    SkMatrix               fDefaultMatrix;
    SkMatrix               fDefaultMatrixInv;

    Json::Value            fAllSlideNames; // cache all slide names for fast updateUIState
};


#endif
