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