blob: 09a8946ac9033bcad7b24151c51a314f7f11f70e [file] [log] [blame]
jvanverth9f372462016-04-06 06:08:59 -07001/*
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
jvanverth34524262016-05-04 13:49:13 -07008#ifndef Viewer_DEFINED
9#define Viewer_DEFINED
jvanverth9f372462016-04-06 06:08:59 -070010
jvanvertha8d0d6c2016-05-05 12:32:03 -070011#include "sk_app/Application.h"
brianosman622c8d52016-05-10 06:50:49 -070012#include "sk_app/CommandSet.h"
jvanvertha8d0d6c2016-05-05 12:32:03 -070013#include "sk_app/Window.h"
jvanverth9f372462016-04-06 06:08:59 -070014#include "gm.h"
jvanverthc265a922016-04-08 12:51:45 -070015#include "SkAnimTimer.h"
djsollen9207cae2016-06-10 07:50:00 -070016#include "SkTouchGesture.h"
jvanverth2bb3b6d2016-04-08 07:24:09 -070017#include "Slide.h"
jvanverth9f372462016-04-06 06:08:59 -070018
19class SkCanvas;
20
jvanverth34524262016-05-04 13:49:13 -070021class Viewer : public sk_app::Application {
jvanverth9f372462016-04-06 06:08:59 -070022public:
jvanverth34524262016-05-04 13:49:13 -070023 Viewer(int argc, char** argv, void* platformData);
24 ~Viewer() override;
jvanverth9f372462016-04-06 06:08:59 -070025
Christopher Dalton443ec1b2017-02-24 13:22:53 -070026 void onBackendCreated();
jvanverth9f372462016-04-06 06:08:59 -070027 void onPaint(SkCanvas* canvas);
liyuqian2edb0f42016-07-06 14:11:32 -070028 void onIdle() override;
jvanverth814e38d2016-06-06 08:48:47 -070029 bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y);
Jim Van Verthe7705782017-05-04 14:00:59 -040030 bool onMouse(float x, float y, sk_app::Window::InputState state, uint32_t modifiers);
liyuqiane5a6cd92016-05-27 08:52:52 -070031 void onUIStateChanged(const SkString& stateName, const SkString& stateValue);
Brian Osman79086b92017-02-10 13:36:16 -050032 bool onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers);
33 bool onChar(SkUnichar c, uint32_t modifiers);
jvanverth9f372462016-04-06 06:08:59 -070034
35private:
Brian Osman92004802017-03-06 11:47:26 -050036 enum class ColorMode {
37 kLegacy, // N32, no color management
38 kColorManagedSRGB8888_NonLinearBlending, // N32, sRGB transfer function, nonlinear blending
39 kColorManagedSRGB8888, // N32, sRGB transfer function, linear blending
40 kColorManagedLinearF16, // F16, linear transfer function, linear blending
41 };
42
jvanverth2bb3b6d2016-04-08 07:24:09 -070043 void initSlides();
brianosman05de2162016-05-06 13:28:57 -070044 void updateTitle();
Brian Osman621491e2017-02-28 15:45:01 -050045 void setBackend(sk_app::Window::BackendType);
Brian Osman92004802017-03-06 11:47:26 -050046 void setColorMode(ColorMode);
Jim Van Verth6f449692017-02-14 15:16:46 -050047 void setStartupSlide();
jvanverthc265a922016-04-08 12:51:45 -070048 void setupCurrentSlide(int previousSlide);
Jim Van Verth6f449692017-02-14 15:16:46 -050049 void listNames();
jvanverth2bb3b6d2016-04-08 07:24:09 -070050
liyuqiane5a6cd92016-05-27 08:52:52 -070051 void updateUIState();
52
Brian Osmanf750fbc2017-02-08 10:47:28 -050053 void drawSlide(SkCanvas* canvs);
jvanverth3d6ed3a2016-04-07 11:09:51 -070054 void drawStats(SkCanvas* canvas);
Brian Osman79086b92017-02-10 13:36:16 -050055 void drawImGui(SkCanvas* canvas);
jvanverth3d6ed3a2016-04-07 11:09:51 -070056
jvanverthc265a922016-04-08 12:51:45 -070057 void changeZoomLevel(float delta);
liyuqiand3cdbca2016-05-17 12:44:20 -070058 SkMatrix computeMatrix();
jvanverthc265a922016-04-08 12:51:45 -070059
jvanverth34524262016-05-04 13:49:13 -070060 sk_app::Window* fWindow;
jvanverth9f372462016-04-06 06:08:59 -070061
jvanverth3d6ed3a2016-04-07 11:09:51 -070062 static const int kMeasurementCount = 64; // should be power of 2 for fast mod
Brian Osman1df161a2017-02-09 12:10:20 -050063 double fPaintTimes[kMeasurementCount];
64 double fFlushTimes[kMeasurementCount];
65 double fAnimateTimes[kMeasurementCount];
jvanverth3d6ed3a2016-04-07 11:09:51 -070066 int fCurrentMeasurement;
67
jvanverthc265a922016-04-08 12:51:45 -070068 SkAnimTimer fAnimTimer;
jvanverth2bb3b6d2016-04-08 07:24:09 -070069 SkTArray<sk_sp<Slide>> fSlides;
70 int fCurrentSlide;
jvanverthc265a922016-04-08 12:51:45 -070071
72 bool fDisplayStats;
liyuqian2edb0f42016-07-06 14:11:32 -070073 bool fRefresh; // whether to continuously refresh for measuring render time
jvanverthc265a922016-04-08 12:51:45 -070074
Brian Osmanf6877092017-02-13 09:39:57 -050075 SkPaint fImGuiFontPaint;
Brian Osmana109e392017-02-24 09:49:14 -050076 SkPaint fImGuiGamutPaint;
Brian Osman79086b92017-02-10 13:36:16 -050077 bool fShowImGuiDebugWindow;
78 bool fShowImGuiTestWindow;
79
Brian Osmanf6877092017-02-13 09:39:57 -050080 bool fShowZoomWindow;
81 sk_sp<SkImage> fLastImage;
82
jvanverthaf236b52016-05-20 06:01:06 -070083 sk_app::Window::BackendType fBackendType;
84
Brian Osmanf750fbc2017-02-08 10:47:28 -050085 // Color properties for slide rendering
Brian Osman92004802017-03-06 11:47:26 -050086 ColorMode fColorMode;
Brian Osmana109e392017-02-24 09:49:14 -050087 SkColorSpacePrimaries fColorSpacePrimaries;
Brian Osmanf750fbc2017-02-08 10:47:28 -050088
jvanverthc265a922016-04-08 12:51:45 -070089 // transform data
jvanverthc265a922016-04-08 12:51:45 -070090 SkScalar fZoomCenterX;
91 SkScalar fZoomCenterY;
92 SkScalar fZoomLevel;
93 SkScalar fZoomScale;
94
brianosman622c8d52016-05-10 06:50:49 -070095 sk_app::CommandSet fCommands;
liyuqiand3cdbca2016-05-17 12:44:20 -070096
97 SkTouchGesture fGesture;
liyuqiane46e4f02016-05-20 07:32:19 -070098
99 // identity unless the window initially scales the content to fit the screen.
100 SkMatrix fDefaultMatrix;
101 SkMatrix fDefaultMatrixInv;
liyuqian1f508fd2016-06-07 06:57:40 -0700102
Brian Osmanfd8f4d52017-02-24 11:57:23 -0500103 SkTArray<std::function<void(void)>> fDeferredActions;
104
liyuqian1f508fd2016-06-07 06:57:40 -0700105 Json::Value fAllSlideNames; // cache all slide names for fast updateUIState
jvanverth9f372462016-04-06 06:08:59 -0700106};
107
108
109#endif