blob: ec6a2d5da4c090be178a139706457affa0ef0cae [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"
Brian Osmand67e5182017-12-08 16:46:09 -050015#include "ImGuiLayer.h"
jvanverthc265a922016-04-08 12:51:45 -070016#include "SkAnimTimer.h"
Yuqian Lib2ba6642017-11-22 12:07:41 -050017#include "SkExecutor.h"
Ben Wagnera580fb32018-04-17 11:16:32 -040018#include "SkScan.h"
jvanverth2bb3b6d2016-04-08 07:24:09 -070019#include "Slide.h"
Brian Osman56a24812017-12-19 11:15:16 -050020#include "StatsLayer.h"
Ben Wagnerb2c4ea62018-08-08 11:36:17 -040021#include "TouchGesture.h"
jvanverth9f372462016-04-06 06:08:59 -070022
23class SkCanvas;
24
Brian Osman80fc07e2017-12-08 16:45:43 -050025class Viewer : public sk_app::Application, sk_app::Window::Layer {
jvanverth9f372462016-04-06 06:08:59 -070026public:
jvanverth34524262016-05-04 13:49:13 -070027 Viewer(int argc, char** argv, void* platformData);
28 ~Viewer() override;
jvanverth9f372462016-04-06 06:08:59 -070029
liyuqian2edb0f42016-07-06 14:11:32 -070030 void onIdle() override;
Brian Osman80fc07e2017-12-08 16:45:43 -050031
32 void onBackendCreated() override;
33 void onPaint(SkCanvas* canvas) override;
Ben Wagnera1915972018-08-09 15:06:19 -040034 void onResize(int width, int height) override;
Brian Osman80fc07e2017-12-08 16:45:43 -050035 bool onTouch(intptr_t owner, sk_app::Window::InputState state, float x, float y) override;
36 bool onMouse(int x, int y, sk_app::Window::InputState state, uint32_t modifiers) override;
Brian Osman80fc07e2017-12-08 16:45:43 -050037 void onUIStateChanged(const SkString& stateName, const SkString& stateValue) override;
38 bool onKey(sk_app::Window::Key key, sk_app::Window::InputState state, uint32_t modifiers) override;
39 bool onChar(SkUnichar c, uint32_t modifiers) override;
jvanverth9f372462016-04-06 06:08:59 -070040
Mike Reed3ae47332019-01-04 10:11:46 -050041 struct SkFontFields {
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050042 bool fTypeface = false;
Mike Reed3ae47332019-01-04 10:11:46 -050043 bool fTextSize = false;
44 SkScalar fTextSizeRange[2] = { 0, 20 };
45 bool fTextScaleX = false;
46 bool fTextSkewX = false;
47 bool fHinting = false;
Mike Reede5f9cfa2019-01-10 13:55:35 -050048 bool fEdging = false;
49 bool fSubpixel = false;
Ben Wagner9613e452019-01-23 10:34:59 -050050 bool fForceAutoHinting = false;
51 bool fEmbeddedBitmaps = false;
52 bool fLinearMetrics = false;
53 bool fEmbolden = false;
Mike Reed3ae47332019-01-04 10:11:46 -050054 };
55 struct SkPaintFields {
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050056 bool fPathEffect = false;
57 bool fShader = false;
58 bool fMaskFilter = false;
59 bool fColorFilter = false;
60 bool fDrawLooper = false;
61 bool fImageFilter = false;
62
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050063 bool fColor = false;
64 bool fWidth = false;
65 bool fMiterLimit = false;
66 bool fBlendMode = false;
67
Ben Wagner9613e452019-01-23 10:34:59 -050068 bool fAntiAlias = false;
69 bool fDither = false;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050070 enum class AntiAliasState {
71 Alias,
72 Normal,
73 AnalyticAAEnabled,
74 AnalyticAAForced,
75 DeltaAAEnabled,
76 DeltaAAForced,
Ben Wagner9613e452019-01-23 10:34:59 -050077 } fAntiAliasState = AntiAliasState::Alias;
Ben Wagnera580fb32018-04-17 11:16:32 -040078 const bool fOriginalSkUseAnalyticAA = gSkUseAnalyticAA;
79 const bool fOriginalSkForceAnalyticAA = gSkForceAnalyticAA;
80 const bool fOriginalSkUseDeltaAA = gSkUseDeltaAA;
81 const bool fOriginalSkForceDeltaAA = gSkForceDeltaAA;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050082
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050083 bool fCapType = false;
84 bool fJoinType = false;
85 bool fStyle = false;
Ben Wagnerabdcc5f2018-02-12 16:37:28 -050086 bool fFilterQuality = false;
87 };
jvanverth9f372462016-04-06 06:08:59 -070088private:
Brian Osman92004802017-03-06 11:47:26 -050089 enum class ColorMode {
Brian Osman03115dc2018-11-26 13:55:19 -050090 kLegacy, // 8888, no color management
91 kColorManaged8888, // 8888 with color management
92 kColorManagedF16, // F16 with color management
Brian Osman92004802017-03-06 11:47:26 -050093 };
94
jvanverth2bb3b6d2016-04-08 07:24:09 -070095 void initSlides();
brianosman05de2162016-05-06 13:28:57 -070096 void updateTitle();
Brian Osman621491e2017-02-28 15:45:01 -050097 void setBackend(sk_app::Window::BackendType);
Brian Osman92004802017-03-06 11:47:26 -050098 void setColorMode(ColorMode);
Florin Malitaab99c342018-01-16 16:23:03 -050099 int startupSlide() const;
100 void setCurrentSlide(int);
101 void setupCurrentSlide();
102 void listNames() const;
jvanverth2bb3b6d2016-04-08 07:24:09 -0700103
liyuqiane5a6cd92016-05-27 08:52:52 -0700104 void updateUIState();
105
Brian Osmanf750fbc2017-02-08 10:47:28 -0500106 void drawSlide(SkCanvas* canvs);
Brian Osmand67e5182017-12-08 16:46:09 -0500107 void drawImGui();
jvanverth3d6ed3a2016-04-07 11:09:51 -0700108
jvanverthc265a922016-04-08 12:51:45 -0700109 void changeZoomLevel(float delta);
Ben Wagnerd02a74d2018-04-23 12:55:06 -0400110 void preTouchMatrixChanged();
Yuqian Li755778c2018-03-28 16:23:31 -0400111 SkMatrix computePreTouchMatrix();
Brian Osman805a7272018-05-02 15:40:20 -0400112 SkMatrix computePerspectiveMatrix();
liyuqiand3cdbca2016-05-17 12:44:20 -0700113 SkMatrix computeMatrix();
Florin Malitacefc1b92018-02-19 21:43:47 -0500114 SkPoint mapEvent(float x, float y);
jvanverthc265a922016-04-08 12:51:45 -0700115
jvanverth34524262016-05-04 13:49:13 -0700116 sk_app::Window* fWindow;
jvanverth9f372462016-04-06 06:08:59 -0700117
Brian Osman56a24812017-12-19 11:15:16 -0500118 StatsLayer fStatsLayer;
119 StatsLayer::Timer fPaintTimer;
120 StatsLayer::Timer fFlushTimer;
121 StatsLayer::Timer fAnimateTimer;
jvanverth3d6ed3a2016-04-07 11:09:51 -0700122
jvanverthc265a922016-04-08 12:51:45 -0700123 SkAnimTimer fAnimTimer;
jvanverth2bb3b6d2016-04-08 07:24:09 -0700124 SkTArray<sk_sp<Slide>> fSlides;
125 int fCurrentSlide;
jvanverthc265a922016-04-08 12:51:45 -0700126
liyuqian2edb0f42016-07-06 14:11:32 -0700127 bool fRefresh; // whether to continuously refresh for measuring render time
jvanverthc265a922016-04-08 12:51:45 -0700128
Brian Osman3ac99cf2017-12-01 11:23:53 -0500129 bool fSaveToSKP;
130
Brian Osmand67e5182017-12-08 16:46:09 -0500131 ImGuiLayer fImGuiLayer;
Brian Osmana109e392017-02-24 09:49:14 -0500132 SkPaint fImGuiGamutPaint;
Brian Osman79086b92017-02-10 13:36:16 -0500133 bool fShowImGuiDebugWindow;
Brian Osmanfce09c52017-11-14 15:32:20 -0500134 bool fShowSlidePicker;
Brian Osman79086b92017-02-10 13:36:16 -0500135 bool fShowImGuiTestWindow;
136
Brian Osmanf6877092017-02-13 09:39:57 -0500137 bool fShowZoomWindow;
Ben Wagner3627d2e2018-06-26 14:23:20 -0400138 bool fZoomWindowFixed;
139 SkPoint fZoomWindowLocation;
Brian Osmanf6877092017-02-13 09:39:57 -0500140 sk_sp<SkImage> fLastImage;
Brian Osmanb63f6002018-07-24 18:01:53 -0400141 bool fZoomUI;
Brian Osmanf6877092017-02-13 09:39:57 -0500142
jvanverthaf236b52016-05-20 06:01:06 -0700143 sk_app::Window::BackendType fBackendType;
144
Brian Osmanf750fbc2017-02-08 10:47:28 -0500145 // Color properties for slide rendering
Brian Osman92004802017-03-06 11:47:26 -0500146 ColorMode fColorMode;
Brian Osmana109e392017-02-24 09:49:14 -0500147 SkColorSpacePrimaries fColorSpacePrimaries;
Brian Osman82ebe042019-01-04 17:03:00 -0500148 skcms_TransferFunction fColorSpaceTransferFn;
Brian Osmanf750fbc2017-02-08 10:47:28 -0500149
jvanverthc265a922016-04-08 12:51:45 -0700150 // transform data
jvanverthc265a922016-04-08 12:51:45 -0700151 SkScalar fZoomLevel;
Ben Wagnerd02a74d2018-04-23 12:55:06 -0400152 SkScalar fRotation;
Ben Wagner3627d2e2018-06-26 14:23:20 -0400153 SkVector fOffset;
jvanverthc265a922016-04-08 12:51:45 -0700154
brianosman622c8d52016-05-10 06:50:49 -0700155 sk_app::CommandSet fCommands;
liyuqiand3cdbca2016-05-17 12:44:20 -0700156
Brian Osmanb53f48c2017-06-07 10:00:30 -0400157 enum class GestureDevice {
158 kNone,
159 kTouch,
160 kMouse,
161 };
162
Ben Wagnerb2c4ea62018-08-08 11:36:17 -0400163 TouchGesture fGesture;
Brian Osmanb53f48c2017-06-07 10:00:30 -0400164 GestureDevice fGestureDevice;
liyuqiane46e4f02016-05-20 07:32:19 -0700165
166 // identity unless the window initially scales the content to fit the screen.
167 SkMatrix fDefaultMatrix;
liyuqian1f508fd2016-06-07 06:57:40 -0700168
Brian Osmane9ed0f02018-11-26 14:50:05 -0500169 bool fTiled;
170 bool fDrawTileBoundaries;
171 SkSize fTileScale;
172
Brian Osman805a7272018-05-02 15:40:20 -0400173 enum PerspectiveMode {
174 kPerspective_Off,
175 kPerspective_Real,
176 kPerspective_Fake,
177 };
178 PerspectiveMode fPerspectiveMode;
Brian Osman9bb47cf2018-04-26 15:55:00 -0400179 SkPoint fPerspectivePoints[4];
180
Brian Osmanfd8f4d52017-02-24 11:57:23 -0500181 SkTArray<std::function<void(void)>> fDeferredActions;
182
Ben Wagnerabdcc5f2018-02-12 16:37:28 -0500183 SkPaint fPaint;
184 SkPaintFields fPaintOverrides;
Mike Reed3ae47332019-01-04 10:11:46 -0500185 SkFont fFont;
186 SkFontFields fFontOverrides;
Ben Wagner37c54032018-04-13 14:30:23 -0400187 bool fPixelGeometryOverrides = false;
jvanverth9f372462016-04-06 06:08:59 -0700188};
189
190
191#endif