Home | History | Annotate | Download | only in viewer
      1 /*
      2 * Copyright 2016 Google Inc.
      3 *
      4 * Use of this source code is governed by a BSD-style license that can be
      5 * found in the LICENSE file.
      6 */
      7 
      8 #ifndef Viewer_DEFINED
      9 #define Viewer_DEFINED
     10 
     11 #include "sk_app/Application.h"
     12 #include "sk_app/CommandSet.h"
     13 #include "sk_app/Window.h"
     14 #include "gm.h"
     15 #include "SkAnimTimer.h"
     16 #include "SkTouchGesture.h"
     17 #include "Slide.h"
     18 
     19 class SkCanvas;
     20 
     21 class Viewer : public sk_app::Application {
     22 public:
     23     Viewer(int argc, char** argv, void* platformData);
     24     ~Viewer() override;
     25 
     26     void onBackendCreated();
     27     void onPaint(SkCanvas* canvas);
     28     void onIdle() override;
     29     bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y);
     30     void onUIStateChanged(const SkString& stateName, const SkString& stateValue);
     31     bool onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers);
     32     bool onChar(SkUnichar c, uint32_t modifiers);
     33 
     34 private:
     35     enum class ColorMode {
     36         kLegacy,                                 // N32, no color management
     37         kColorManagedSRGB8888_NonLinearBlending, // N32, sRGB transfer function, nonlinear blending
     38         kColorManagedSRGB8888,                   // N32, sRGB transfer function, linear blending
     39         kColorManagedLinearF16,                  // F16, linear transfer function, linear blending
     40     };
     41 
     42     void initSlides();
     43     void updateTitle();
     44     void setBackend(sk_app::Window::BackendType);
     45     void setColorMode(ColorMode);
     46     void setStartupSlide();
     47     void setupCurrentSlide(int previousSlide);
     48     void listNames();
     49 
     50     void updateUIState();
     51 
     52     void drawSlide(SkCanvas* canvs);
     53     void drawStats(SkCanvas* canvas);
     54     void drawImGui(SkCanvas* canvas);
     55 
     56     void changeZoomLevel(float delta);
     57     SkMatrix computeMatrix();
     58 
     59     sk_app::Window*        fWindow;
     60 
     61     static const int kMeasurementCount = 64;  // should be power of 2 for fast mod
     62     double fPaintTimes[kMeasurementCount];
     63     double fFlushTimes[kMeasurementCount];
     64     double fAnimateTimes[kMeasurementCount];
     65     int fCurrentMeasurement;
     66 
     67     SkAnimTimer            fAnimTimer;
     68     SkTArray<sk_sp<Slide>> fSlides;
     69     int                    fCurrentSlide;
     70 
     71     bool                   fDisplayStats;
     72     bool                   fRefresh; // whether to continuously refresh for measuring render time
     73 
     74     SkPaint                fImGuiFontPaint;
     75     SkPaint                fImGuiGamutPaint;
     76     bool                   fShowImGuiDebugWindow;
     77     bool                   fShowImGuiTestWindow;
     78 
     79     bool                   fShowZoomWindow;
     80     sk_sp<SkImage>         fLastImage;
     81 
     82     sk_app::Window::BackendType fBackendType;
     83 
     84     // Color properties for slide rendering
     85     ColorMode              fColorMode;
     86     SkColorSpacePrimaries  fColorSpacePrimaries;
     87 
     88     // transform data
     89     SkScalar               fZoomCenterX;
     90     SkScalar               fZoomCenterY;
     91     SkScalar               fZoomLevel;
     92     SkScalar               fZoomScale;
     93 
     94     sk_app::CommandSet     fCommands;
     95 
     96     SkTouchGesture         fGesture;
     97 
     98     // identity unless the window initially scales the content to fit the screen.
     99     SkMatrix               fDefaultMatrix;
    100     SkMatrix               fDefaultMatrixInv;
    101 
    102     SkTArray<std::function<void(void)>> fDeferredActions;
    103 
    104     Json::Value            fAllSlideNames; // cache all slide names for fast updateUIState
    105 };
    106 
    107 
    108 #endif
    109