xref: /third_party/skia/tools/viewer/Viewer.h (revision cb93a386)
1cb93a386Sopenharmony_ci/*
2cb93a386Sopenharmony_ci* Copyright 2016 Google Inc.
3cb93a386Sopenharmony_ci*
4cb93a386Sopenharmony_ci* Use of this source code is governed by a BSD-style license that can be
5cb93a386Sopenharmony_ci* found in the LICENSE file.
6cb93a386Sopenharmony_ci*/
7cb93a386Sopenharmony_ci
8cb93a386Sopenharmony_ci#ifndef Viewer_DEFINED
9cb93a386Sopenharmony_ci#define Viewer_DEFINED
10cb93a386Sopenharmony_ci
11cb93a386Sopenharmony_ci#include "gm/gm.h"
12cb93a386Sopenharmony_ci#include "include/core/SkExecutor.h"
13cb93a386Sopenharmony_ci#include "include/core/SkFont.h"
14cb93a386Sopenharmony_ci#include "include/gpu/GrContextOptions.h"
15cb93a386Sopenharmony_ci#include "include/private/SkSLString.h"
16cb93a386Sopenharmony_ci#include "src/core/SkScan.h"
17cb93a386Sopenharmony_ci#include "src/core/SkVMBlitter.h"
18cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLProgram.h"
19cb93a386Sopenharmony_ci#include "tools/gpu/MemoryCache.h"
20cb93a386Sopenharmony_ci#include "tools/sk_app/Application.h"
21cb93a386Sopenharmony_ci#include "tools/sk_app/CommandSet.h"
22cb93a386Sopenharmony_ci#include "tools/sk_app/Window.h"
23cb93a386Sopenharmony_ci#include "tools/viewer/AnimTimer.h"
24cb93a386Sopenharmony_ci#include "tools/viewer/ImGuiLayer.h"
25cb93a386Sopenharmony_ci#include "tools/viewer/Slide.h"
26cb93a386Sopenharmony_ci#include "tools/viewer/StatsLayer.h"
27cb93a386Sopenharmony_ci#include "tools/viewer/TouchGesture.h"
28cb93a386Sopenharmony_ci
29cb93a386Sopenharmony_ciclass SkCanvas;
30cb93a386Sopenharmony_ciclass SkData;
31cb93a386Sopenharmony_ci
32cb93a386Sopenharmony_ciclass Viewer : public sk_app::Application, sk_app::Window::Layer {
33cb93a386Sopenharmony_cipublic:
34cb93a386Sopenharmony_ci    Viewer(int argc, char** argv, void* platformData);
35cb93a386Sopenharmony_ci    ~Viewer() override;
36cb93a386Sopenharmony_ci
37cb93a386Sopenharmony_ci    void onIdle() override;
38cb93a386Sopenharmony_ci
39cb93a386Sopenharmony_ci    void onBackendCreated() override;
40cb93a386Sopenharmony_ci    void onPaint(SkSurface*) override;
41cb93a386Sopenharmony_ci    void onResize(int width, int height) override;
42cb93a386Sopenharmony_ci    bool onTouch(intptr_t owner, skui::InputState state, float x, float y) override;
43cb93a386Sopenharmony_ci    bool onMouse(int x, int y, skui::InputState state, skui::ModifierKey modifiers) override;
44cb93a386Sopenharmony_ci    void onUIStateChanged(const SkString& stateName, const SkString& stateValue) override;
45cb93a386Sopenharmony_ci    bool onKey(skui::Key key, skui::InputState state, skui::ModifierKey modifiers) override;
46cb93a386Sopenharmony_ci    bool onChar(SkUnichar c, skui::ModifierKey modifiers) override;
47cb93a386Sopenharmony_ci    bool onPinch(skui::InputState state, float scale, float x, float y) override;
48cb93a386Sopenharmony_ci    bool onFling(skui::InputState state) override;
49cb93a386Sopenharmony_ci
50cb93a386Sopenharmony_ci    static GrContextOptions::ShaderErrorHandler* ShaderErrorHandler();
51cb93a386Sopenharmony_ci
52cb93a386Sopenharmony_ci    struct SkFontFields {
53cb93a386Sopenharmony_ci        bool overridesSomething() const {
54cb93a386Sopenharmony_ci            return fTypeface ||
55cb93a386Sopenharmony_ci                   fSize ||
56cb93a386Sopenharmony_ci                   fScaleX ||
57cb93a386Sopenharmony_ci                   fSkewX ||
58cb93a386Sopenharmony_ci                   fHinting ||
59cb93a386Sopenharmony_ci                   fEdging ||
60cb93a386Sopenharmony_ci                   fSubpixel ||
61cb93a386Sopenharmony_ci                   fForceAutoHinting ||
62cb93a386Sopenharmony_ci                   fEmbeddedBitmaps ||
63cb93a386Sopenharmony_ci                   fLinearMetrics ||
64cb93a386Sopenharmony_ci                   fEmbolden ||
65cb93a386Sopenharmony_ci                   fBaselineSnap;
66cb93a386Sopenharmony_ci        }
67cb93a386Sopenharmony_ci
68cb93a386Sopenharmony_ci        bool fTypeface = false;
69cb93a386Sopenharmony_ci        bool fSize = false;
70cb93a386Sopenharmony_ci        SkScalar fSizeRange[2] = { 0, 20 };
71cb93a386Sopenharmony_ci        bool fScaleX = false;
72cb93a386Sopenharmony_ci        bool fSkewX = false;
73cb93a386Sopenharmony_ci        bool fHinting = false;
74cb93a386Sopenharmony_ci        bool fEdging = false;
75cb93a386Sopenharmony_ci        bool fSubpixel = false;
76cb93a386Sopenharmony_ci        bool fForceAutoHinting = false;
77cb93a386Sopenharmony_ci        bool fEmbeddedBitmaps = false;
78cb93a386Sopenharmony_ci        bool fLinearMetrics = false;
79cb93a386Sopenharmony_ci        bool fEmbolden = false;
80cb93a386Sopenharmony_ci        bool fBaselineSnap = false;
81cb93a386Sopenharmony_ci    };
82cb93a386Sopenharmony_ci    struct SkPaintFields {
83cb93a386Sopenharmony_ci        bool overridesSomething() const {
84cb93a386Sopenharmony_ci            return fPathEffect ||
85cb93a386Sopenharmony_ci                   fShader ||
86cb93a386Sopenharmony_ci                   fMaskFilter ||
87cb93a386Sopenharmony_ci                   fColorFilter ||
88cb93a386Sopenharmony_ci                   fImageFilter ||
89cb93a386Sopenharmony_ci                   fColor ||
90cb93a386Sopenharmony_ci                   fStrokeWidth ||
91cb93a386Sopenharmony_ci                   fMiterLimit ||
92cb93a386Sopenharmony_ci                   fBlendMode ||
93cb93a386Sopenharmony_ci                   fAntiAlias ||
94cb93a386Sopenharmony_ci                   fDither ||
95cb93a386Sopenharmony_ci                   fForceRuntimeBlend ||
96cb93a386Sopenharmony_ci                   fCapType ||
97cb93a386Sopenharmony_ci                   fJoinType ||
98cb93a386Sopenharmony_ci                   fStyle;
99cb93a386Sopenharmony_ci        }
100cb93a386Sopenharmony_ci
101cb93a386Sopenharmony_ci        bool fPathEffect = false;
102cb93a386Sopenharmony_ci        bool fShader = false;
103cb93a386Sopenharmony_ci        bool fMaskFilter = false;
104cb93a386Sopenharmony_ci        bool fColorFilter = false;
105cb93a386Sopenharmony_ci        bool fImageFilter = false;
106cb93a386Sopenharmony_ci
107cb93a386Sopenharmony_ci        bool fColor = false;
108cb93a386Sopenharmony_ci        bool fStrokeWidth = false;
109cb93a386Sopenharmony_ci        bool fMiterLimit = false;
110cb93a386Sopenharmony_ci        bool fBlendMode = false;
111cb93a386Sopenharmony_ci
112cb93a386Sopenharmony_ci        bool fAntiAlias = false;
113cb93a386Sopenharmony_ci        bool fDither = false;
114cb93a386Sopenharmony_ci        bool fForceRuntimeBlend = false;
115cb93a386Sopenharmony_ci        enum class AntiAliasState {
116cb93a386Sopenharmony_ci            Alias,
117cb93a386Sopenharmony_ci            Normal,
118cb93a386Sopenharmony_ci            AnalyticAAEnabled,
119cb93a386Sopenharmony_ci            AnalyticAAForced,
120cb93a386Sopenharmony_ci        } fAntiAliasState = AntiAliasState::Alias;
121cb93a386Sopenharmony_ci        const bool fOriginalSkUseAnalyticAA = gSkUseAnalyticAA;
122cb93a386Sopenharmony_ci        const bool fOriginalSkForceAnalyticAA = gSkForceAnalyticAA;
123cb93a386Sopenharmony_ci
124cb93a386Sopenharmony_ci        bool fCapType = false;
125cb93a386Sopenharmony_ci        bool fJoinType = false;
126cb93a386Sopenharmony_ci        bool fStyle = false;
127cb93a386Sopenharmony_ci    };
128cb93a386Sopenharmony_ci    struct SkSurfacePropsFields {
129cb93a386Sopenharmony_ci        bool fFlags = false;
130cb93a386Sopenharmony_ci        bool fPixelGeometry = false;
131cb93a386Sopenharmony_ci    };
132cb93a386Sopenharmony_ci    struct DisplayFields {
133cb93a386Sopenharmony_ci        bool fColorType = false;
134cb93a386Sopenharmony_ci        bool fColorSpace = false;
135cb93a386Sopenharmony_ci        bool fMSAASampleCount = false;
136cb93a386Sopenharmony_ci        bool fGrContextOptions = false;
137cb93a386Sopenharmony_ci        SkSurfacePropsFields fSurfaceProps;
138cb93a386Sopenharmony_ci        bool fDisableVsync = false;
139cb93a386Sopenharmony_ci    };
140cb93a386Sopenharmony_ciprivate:
141cb93a386Sopenharmony_ci    enum class ColorMode {
142cb93a386Sopenharmony_ci        kLegacy,                // 8888, no color management
143cb93a386Sopenharmony_ci        kColorManaged8888,      // 8888 with color management
144cb93a386Sopenharmony_ci        kColorManagedF16,       // F16 with color management
145cb93a386Sopenharmony_ci        kColorManagedF16Norm,   // Normalized F16 with color management
146cb93a386Sopenharmony_ci    };
147cb93a386Sopenharmony_ci
148cb93a386Sopenharmony_ci    void initSlides();
149cb93a386Sopenharmony_ci    void updateTitle();
150cb93a386Sopenharmony_ci    void setBackend(sk_app::Window::BackendType);
151cb93a386Sopenharmony_ci    void setColorMode(ColorMode);
152cb93a386Sopenharmony_ci    int startupSlide() const;
153cb93a386Sopenharmony_ci    void setCurrentSlide(int);
154cb93a386Sopenharmony_ci    void setupCurrentSlide();
155cb93a386Sopenharmony_ci    void listNames() const;
156cb93a386Sopenharmony_ci    void dumpShadersToResources();
157cb93a386Sopenharmony_ci
158cb93a386Sopenharmony_ci    void updateUIState();
159cb93a386Sopenharmony_ci
160cb93a386Sopenharmony_ci    void drawSlide(SkSurface* surface);
161cb93a386Sopenharmony_ci    void drawImGui();
162cb93a386Sopenharmony_ci
163cb93a386Sopenharmony_ci    void changeZoomLevel(float delta);
164cb93a386Sopenharmony_ci    void preTouchMatrixChanged();
165cb93a386Sopenharmony_ci    SkMatrix computePreTouchMatrix();
166cb93a386Sopenharmony_ci    SkMatrix computePerspectiveMatrix();
167cb93a386Sopenharmony_ci    SkMatrix computeMatrix();
168cb93a386Sopenharmony_ci    SkPoint mapEvent(float x, float y);
169cb93a386Sopenharmony_ci
170cb93a386Sopenharmony_ci    sk_app::Window*        fWindow;
171cb93a386Sopenharmony_ci
172cb93a386Sopenharmony_ci    StatsLayer             fStatsLayer;
173cb93a386Sopenharmony_ci    StatsLayer::Timer      fPaintTimer;
174cb93a386Sopenharmony_ci    StatsLayer::Timer      fFlushTimer;
175cb93a386Sopenharmony_ci    StatsLayer::Timer      fAnimateTimer;
176cb93a386Sopenharmony_ci
177cb93a386Sopenharmony_ci    AnimTimer              fAnimTimer;
178cb93a386Sopenharmony_ci    SkTArray<sk_sp<Slide>> fSlides;
179cb93a386Sopenharmony_ci    int                    fCurrentSlide;
180cb93a386Sopenharmony_ci
181cb93a386Sopenharmony_ci    bool                   fRefresh; // whether to continuously refresh for measuring render time
182cb93a386Sopenharmony_ci
183cb93a386Sopenharmony_ci    bool                   fSaveToSKP;
184cb93a386Sopenharmony_ci    bool                   fShowSlideDimensions;
185cb93a386Sopenharmony_ci
186cb93a386Sopenharmony_ci    ImGuiLayer             fImGuiLayer;
187cb93a386Sopenharmony_ci    SkPaint                fImGuiGamutPaint;
188cb93a386Sopenharmony_ci    bool                   fShowImGuiDebugWindow;
189cb93a386Sopenharmony_ci    bool                   fShowSlidePicker;
190cb93a386Sopenharmony_ci    bool                   fShowImGuiTestWindow;
191cb93a386Sopenharmony_ci
192cb93a386Sopenharmony_ci    bool                   fShowZoomWindow;
193cb93a386Sopenharmony_ci    bool                   fZoomWindowFixed;
194cb93a386Sopenharmony_ci    SkPoint                fZoomWindowLocation;
195cb93a386Sopenharmony_ci    sk_sp<SkImage>         fLastImage;
196cb93a386Sopenharmony_ci    bool                   fZoomUI;
197cb93a386Sopenharmony_ci
198cb93a386Sopenharmony_ci    sk_app::Window::BackendType fBackendType;
199cb93a386Sopenharmony_ci
200cb93a386Sopenharmony_ci    // Color properties for slide rendering
201cb93a386Sopenharmony_ci    ColorMode              fColorMode;
202cb93a386Sopenharmony_ci    SkColorSpacePrimaries  fColorSpacePrimaries;
203cb93a386Sopenharmony_ci    skcms_TransferFunction fColorSpaceTransferFn;
204cb93a386Sopenharmony_ci
205cb93a386Sopenharmony_ci    // transform data
206cb93a386Sopenharmony_ci    bool                   fApplyBackingScale;
207cb93a386Sopenharmony_ci    SkScalar               fZoomLevel;
208cb93a386Sopenharmony_ci    SkScalar               fRotation;
209cb93a386Sopenharmony_ci    SkVector               fOffset;
210cb93a386Sopenharmony_ci
211cb93a386Sopenharmony_ci    sk_app::CommandSet     fCommands;
212cb93a386Sopenharmony_ci
213cb93a386Sopenharmony_ci    enum class GestureDevice {
214cb93a386Sopenharmony_ci        kNone,
215cb93a386Sopenharmony_ci        kTouch,
216cb93a386Sopenharmony_ci        kMouse,
217cb93a386Sopenharmony_ci    };
218cb93a386Sopenharmony_ci
219cb93a386Sopenharmony_ci    TouchGesture           fGesture;
220cb93a386Sopenharmony_ci    GestureDevice          fGestureDevice;
221cb93a386Sopenharmony_ci
222cb93a386Sopenharmony_ci    // identity unless the window initially scales the content to fit the screen.
223cb93a386Sopenharmony_ci    SkMatrix               fDefaultMatrix;
224cb93a386Sopenharmony_ci
225cb93a386Sopenharmony_ci    bool                   fTiled;
226cb93a386Sopenharmony_ci    bool                   fDrawTileBoundaries;
227cb93a386Sopenharmony_ci    SkSize                 fTileScale;
228cb93a386Sopenharmony_ci    bool                   fDrawViaSerialize = false;
229cb93a386Sopenharmony_ci
230cb93a386Sopenharmony_ci    enum PerspectiveMode {
231cb93a386Sopenharmony_ci        kPerspective_Off,
232cb93a386Sopenharmony_ci        kPerspective_Real,
233cb93a386Sopenharmony_ci        kPerspective_Fake,
234cb93a386Sopenharmony_ci    };
235cb93a386Sopenharmony_ci    PerspectiveMode        fPerspectiveMode;
236cb93a386Sopenharmony_ci    SkPoint                fPerspectivePoints[4];
237cb93a386Sopenharmony_ci
238cb93a386Sopenharmony_ci    SkTArray<std::function<void()>> fDeferredActions;
239cb93a386Sopenharmony_ci
240cb93a386Sopenharmony_ci    // fPaint contains override values, fPaintOverrides controls if overrides are applied.
241cb93a386Sopenharmony_ci    SkPaint fPaint;
242cb93a386Sopenharmony_ci    SkPaintFields fPaintOverrides;
243cb93a386Sopenharmony_ci
244cb93a386Sopenharmony_ci    // fFont contains override values, fFontOverrides controls if overrides are applied.
245cb93a386Sopenharmony_ci    SkFont fFont;
246cb93a386Sopenharmony_ci    SkFontFields fFontOverrides;
247cb93a386Sopenharmony_ci
248cb93a386Sopenharmony_ci    // fDisplay contains default values (fWindow.fRequestedDisplayParams contains the overrides),
249cb93a386Sopenharmony_ci    // fDisplayOverrides controls if overrides are applied.
250cb93a386Sopenharmony_ci    sk_app::DisplayParams fDisplay;
251cb93a386Sopenharmony_ci    DisplayFields fDisplayOverrides;
252cb93a386Sopenharmony_ci
253cb93a386Sopenharmony_ci    struct CachedShader {
254cb93a386Sopenharmony_ci        bool                fHovered = false;
255cb93a386Sopenharmony_ci
256cb93a386Sopenharmony_ci        sk_sp<const SkData> fKey;
257cb93a386Sopenharmony_ci        SkString            fKeyString;
258cb93a386Sopenharmony_ci        SkString            fKeyDescription;
259cb93a386Sopenharmony_ci
260cb93a386Sopenharmony_ci        SkFourByteTag         fShaderType;
261cb93a386Sopenharmony_ci        SkSL::String          fShader[kGrShaderTypeCount];
262cb93a386Sopenharmony_ci        SkSL::Program::Inputs fInputs[kGrShaderTypeCount];
263cb93a386Sopenharmony_ci    };
264cb93a386Sopenharmony_ci
265cb93a386Sopenharmony_ci    sk_gpu_test::MemoryCache fPersistentCache;
266cb93a386Sopenharmony_ci    SkTArray<CachedShader>   fCachedShaders;
267cb93a386Sopenharmony_ci
268cb93a386Sopenharmony_ci    enum ShaderOptLevel : int {
269cb93a386Sopenharmony_ci        kShaderOptLevel_Source,
270cb93a386Sopenharmony_ci        kShaderOptLevel_Compile,
271cb93a386Sopenharmony_ci        kShaderOptLevel_Optimize,
272cb93a386Sopenharmony_ci        kShaderOptLevel_Inline,
273cb93a386Sopenharmony_ci    };
274cb93a386Sopenharmony_ci    ShaderOptLevel fOptLevel = kShaderOptLevel_Source;
275cb93a386Sopenharmony_ci
276cb93a386Sopenharmony_ci    SkVMBlitter::Key fHoveredKey;
277cb93a386Sopenharmony_ci    skvm::Program    fHoveredProgram;
278cb93a386Sopenharmony_ci
279cb93a386Sopenharmony_ci    SkTHashMap<SkVMBlitter::Key, std::string> fDisassemblyCache;
280cb93a386Sopenharmony_ci};
281cb93a386Sopenharmony_ci
282cb93a386Sopenharmony_ci#endif
283