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