blob: 47913ae660df6c32408c351c89293de073e4ed2f [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050011#include "gm/gm.h"
12#include "include/core/SkExecutor.h"
13#include "include/core/SkFont.h"
Brian Osmanf847f312020-06-18 14:18:27 -040014#include "include/gpu/GrContextOptions.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050015#include "src/core/SkScan.h"
16#include "src/sksl/SkSLString.h"
17#include "src/sksl/ir/SkSLProgram.h"
18#include "tools/gpu/MemoryCache.h"
19#include "tools/sk_app/Application.h"
20#include "tools/sk_app/CommandSet.h"
21#include "tools/sk_app/Window.h"
Hal Canary41248072019-07-11 16:32:53 -040022#include "tools/viewer/AnimTimer.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050023#include "tools/viewer/ImGuiLayer.h"
24#include "tools/viewer/Slide.h"
25#include "tools/viewer/StatsLayer.h"
26#include "tools/viewer/TouchGesture.h"
jvanverth9f372462016-04-06 06:08:59 -070027
28class SkCanvas;
Brian Osman0b8bb882019-04-12 11:47:19 -040029class SkData;
jvanverth9f372462016-04-06 06:08:59 -070030
Brian Osman80fc07e2017-12-08 16:45:43 -050031class Viewer : public sk_app::Application, sk_app::Window::Layer {
jvanverth9f372462016-04-06 06:08:59 -070032public:
jvanverth34524262016-05-04 13:49:13 -070033 Viewer(int argc, char** argv, void* platformData);
34 ~Viewer() override;
jvanverth9f372462016-04-06 06:08:59 -070035
liyuqian2edb0f42016-07-06 14:11:32 -070036 void onIdle() override;
Brian Osman80fc07e2017-12-08 16:45:43 -050037
38 void onBackendCreated() override;
Robert Phillips9882dae2019-03-04 11:00:10 -050039 void onPaint(SkSurface*) override;
Ben Wagnera1915972018-08-09 15:06:19 -040040 void onResize(int width, int height) override;
Hal Canaryb1f411a2019-08-29 10:39:22 -040041 bool onTouch(intptr_t owner, skui::InputState state, float x, float y) override;
42 bool onMouse(int x, int y, skui::InputState state, skui::ModifierKey modifiers) override;
Brian Osman80fc07e2017-12-08 16:45:43 -050043 void onUIStateChanged(const SkString& stateName, const SkString& stateValue) override;
Hal Canaryb1f411a2019-08-29 10:39:22 -040044 bool onKey(skui::Key key, skui::InputState state, skui::ModifierKey modifiers) override;
45 bool onChar(SkUnichar c, skui::ModifierKey modifiers) override;
Jim Van Verthd0cf5da2019-09-09 16:53:39 -040046 bool onPinch(skui::InputState state, float scale, float x, float y) override;
47 bool onFling(skui::InputState state) override;
jvanverth9f372462016-04-06 06:08:59 -070048
Brian Osmanf847f312020-06-18 14:18:27 -040049 static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler();
50
Mike Reed3ae47332019-01-04 10:11:46 -050051 struct SkFontFields {
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050052 bool fTypeface = false;
Ben Wagner15a8d572019-03-21 13:35:44 -040053 bool fSize = false;
54 SkScalar fSizeRange[2] = { 0, 20 };
55 bool fScaleX = false;
56 bool fSkewX = false;
Mike Reed3ae47332019-01-04 10:11:46 -050057 bool fHinting = false;
Mike Reede5f9cfa2019-01-10 13:55:35 -050058 bool fEdging = false;
59 bool fSubpixel = false;
Ben Wagner9613e452019-01-23 10:34:59 -050060 bool fForceAutoHinting = false;
61 bool fEmbeddedBitmaps = false;
62 bool fLinearMetrics = false;
63 bool fEmbolden = false;
Ben Wagnerc17de1d2019-08-26 16:59:09 -040064 bool fBaselineSnap = false;
Mike Reed3ae47332019-01-04 10:11:46 -050065 };
66 struct SkPaintFields {
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050067 bool fPathEffect = false;
68 bool fShader = false;
69 bool fMaskFilter = false;
70 bool fColorFilter = false;
71 bool fDrawLooper = false;
72 bool fImageFilter = false;
73
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050074 bool fColor = false;
75 bool fWidth = false;
76 bool fMiterLimit = false;
77 bool fBlendMode = false;
78
Ben Wagner9613e452019-01-23 10:34:59 -050079 bool fAntiAlias = false;
80 bool fDither = false;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050081 enum class AntiAliasState {
82 Alias,
83 Normal,
84 AnalyticAAEnabled,
85 AnalyticAAForced,
Ben Wagner9613e452019-01-23 10:34:59 -050086 } fAntiAliasState = AntiAliasState::Alias;
Ben Wagnera580fb32018-04-17 11:16:32 -040087 const bool fOriginalSkUseAnalyticAA = gSkUseAnalyticAA;
88 const bool fOriginalSkForceAnalyticAA = gSkForceAnalyticAA;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050089
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050090 bool fCapType = false;
91 bool fJoinType = false;
92 bool fStyle = false;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050093 bool fFilterQuality = false;
94 };
jvanverth9f372462016-04-06 06:08:59 -070095private:
Brian Osman92004802017-03-06 11:47:26 -050096 enum class ColorMode {
Brian Salomon8391bac2019-09-18 11:22:44 -040097 kLegacy, // 8888, no color management
98 kColorManaged8888, // 8888 with color management
99 kColorManagedF16, // F16 with color management
100 kColorManagedF16Norm, // Normalized F16 with color management
Brian Osman92004802017-03-06 11:47:26 -0500101 };
102
jvanverth2bb3b6d2016-04-08 07:24:09 -0700103 void initSlides();
brianosman05de2162016-05-06 13:28:57 -0700104 void updateTitle();
Brian Osman621491e2017-02-28 15:45:01 -0500105 void setBackend(sk_app::Window::BackendType);
Brian Osman92004802017-03-06 11:47:26 -0500106 void setColorMode(ColorMode);
Florin Malitaab99c342018-01-16 16:23:03 -0500107 int startupSlide() const;
108 void setCurrentSlide(int);
109 void setupCurrentSlide();
110 void listNames() const;
jvanverth2bb3b6d2016-04-08 07:24:09 -0700111
liyuqiane5a6cd92016-05-27 08:52:52 -0700112 void updateUIState();
113
Robert Phillips9882dae2019-03-04 11:00:10 -0500114 void drawSlide(SkSurface* surface);
Brian Osmand67e5182017-12-08 16:46:09 -0500115 void drawImGui();
jvanverth3d6ed3a2016-04-07 11:09:51 -0700116
jvanverthc265a922016-04-08 12:51:45 -0700117 void changeZoomLevel(float delta);
Ben Wagnerd02a74d2018-04-23 12:55:06 -0400118 void preTouchMatrixChanged();
Yuqian Li755778c2018-03-28 16:23:31 -0400119 SkMatrix computePreTouchMatrix();
Brian Osman805a7272018-05-02 15:40:20 -0400120 SkMatrix computePerspectiveMatrix();
liyuqiand3cdbca2016-05-17 12:44:20 -0700121 SkMatrix computeMatrix();
Florin Malitacefc1b92018-02-19 21:43:47 -0500122 SkPoint mapEvent(float x, float y);
jvanverthc265a922016-04-08 12:51:45 -0700123
jvanverth34524262016-05-04 13:49:13 -0700124 sk_app::Window* fWindow;
jvanverth9f372462016-04-06 06:08:59 -0700125
Brian Osman56a24812017-12-19 11:15:16 -0500126 StatsLayer fStatsLayer;
127 StatsLayer::Timer fPaintTimer;
128 StatsLayer::Timer fFlushTimer;
129 StatsLayer::Timer fAnimateTimer;
jvanverth3d6ed3a2016-04-07 11:09:51 -0700130
Mike Kleincd5104e2019-03-20 11:55:08 -0500131 AnimTimer fAnimTimer;
jvanverth2bb3b6d2016-04-08 07:24:09 -0700132 SkTArray<sk_sp<Slide>> fSlides;
133 int fCurrentSlide;
jvanverthc265a922016-04-08 12:51:45 -0700134
liyuqian2edb0f42016-07-06 14:11:32 -0700135 bool fRefresh; // whether to continuously refresh for measuring render time
jvanverthc265a922016-04-08 12:51:45 -0700136
Brian Osman3ac99cf2017-12-01 11:23:53 -0500137 bool fSaveToSKP;
Mike Reed376d8122019-03-14 11:39:02 -0400138 bool fShowSlideDimensions;
Brian Osman3ac99cf2017-12-01 11:23:53 -0500139
Brian Osmand67e5182017-12-08 16:46:09 -0500140 ImGuiLayer fImGuiLayer;
Brian Osmana109e392017-02-24 09:49:14 -0500141 SkPaint fImGuiGamutPaint;
Brian Osman79086b92017-02-10 13:36:16 -0500142 bool fShowImGuiDebugWindow;
Brian Osmanfce09c52017-11-14 15:32:20 -0500143 bool fShowSlidePicker;
Brian Osman79086b92017-02-10 13:36:16 -0500144 bool fShowImGuiTestWindow;
145
Brian Osmanf6877092017-02-13 09:39:57 -0500146 bool fShowZoomWindow;
Ben Wagner3627d2e2018-06-26 14:23:20 -0400147 bool fZoomWindowFixed;
148 SkPoint fZoomWindowLocation;
Brian Osmanf6877092017-02-13 09:39:57 -0500149 sk_sp<SkImage> fLastImage;
Brian Osmanb63f6002018-07-24 18:01:53 -0400150 bool fZoomUI;
Brian Osmanf6877092017-02-13 09:39:57 -0500151
jvanverthaf236b52016-05-20 06:01:06 -0700152 sk_app::Window::BackendType fBackendType;
153
Brian Osmanf750fbc2017-02-08 10:47:28 -0500154 // Color properties for slide rendering
Brian Osman92004802017-03-06 11:47:26 -0500155 ColorMode fColorMode;
Brian Osmana109e392017-02-24 09:49:14 -0500156 SkColorSpacePrimaries fColorSpacePrimaries;
Brian Osman82ebe042019-01-04 17:03:00 -0500157 skcms_TransferFunction fColorSpaceTransferFn;
Brian Osmanf750fbc2017-02-08 10:47:28 -0500158
jvanverthc265a922016-04-08 12:51:45 -0700159 // transform data
jvanverthc265a922016-04-08 12:51:45 -0700160 SkScalar fZoomLevel;
Ben Wagnerd02a74d2018-04-23 12:55:06 -0400161 SkScalar fRotation;
Ben Wagner3627d2e2018-06-26 14:23:20 -0400162 SkVector fOffset;
jvanverthc265a922016-04-08 12:51:45 -0700163
brianosman622c8d52016-05-10 06:50:49 -0700164 sk_app::CommandSet fCommands;
liyuqiand3cdbca2016-05-17 12:44:20 -0700165
Brian Osmanb53f48c2017-06-07 10:00:30 -0400166 enum class GestureDevice {
167 kNone,
168 kTouch,
169 kMouse,
170 };
171
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400172 TouchGesture fGesture;
Brian Osmanb53f48c2017-06-07 10:00:30 -0400173 GestureDevice fGestureDevice;
liyuqiane46e4f02016-05-20 07:32:19 -0700174
175 // identity unless the window initially scales the content to fit the screen.
176 SkMatrix fDefaultMatrix;
liyuqian1f508fd2016-06-07 06:57:40 -0700177
Brian Osmane9ed0f02018-11-26 14:50:05 -0500178 bool fTiled;
179 bool fDrawTileBoundaries;
180 SkSize fTileScale;
Mike Reed59295352020-03-12 13:56:34 -0400181 bool fDrawViaSerialize = false;
Brian Osmane9ed0f02018-11-26 14:50:05 -0500182
Brian Osman805a7272018-05-02 15:40:20 -0400183 enum PerspectiveMode {
184 kPerspective_Off,
185 kPerspective_Real,
186 kPerspective_Fake,
187 };
188 PerspectiveMode fPerspectiveMode;
Brian Osman9bb47cf2018-04-26 15:55:00 -0400189 SkPoint fPerspectivePoints[4];
190
Brian Osmanfd8f4d52017-02-24 11:57:23 -0500191 SkTArray<std::function<void(void)>> fDeferredActions;
192
Ben Wagnerabdcc5f2018-02-12 16:37:28 -0500193 SkPaint fPaint;
194 SkPaintFields fPaintOverrides;
Mike Reed3ae47332019-01-04 10:11:46 -0500195 SkFont fFont;
196 SkFontFields fFontOverrides;
Jim Van Verthbd0881c2020-10-05 16:20:30 +0000197 bool fPixelGeometryOverrides = false;
jvanverth9f372462016-04-06 06:08:59 -0700198
Brian Osmanc85f1fa2020-06-16 15:11:34 -0400199 struct CachedShader {
Brian Osman0b8bb882019-04-12 11:47:19 -0400200 bool fHovered = false;
201
202 sk_sp<const SkData> fKey;
203 SkString fKeyString;
204
Brian Osmana085a412019-04-25 09:44:43 -0400205 SkFourByteTag fShaderType;
206 SkSL::String fShader[kGrShaderTypeCount];
207 SkSL::Program::Inputs fInputs[kGrShaderTypeCount];
Brian Osman0b8bb882019-04-12 11:47:19 -0400208 };
209
210 sk_gpu_test::MemoryCache fPersistentCache;
Brian Osmanc85f1fa2020-06-16 15:11:34 -0400211 SkTArray<CachedShader> fCachedShaders;
Brian Osman0b8bb882019-04-12 11:47:19 -0400212};
jvanverth9f372462016-04-06 06:08:59 -0700213
214#endif