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 Window_DEFINED 9*c8dee2aaSAndroid Build Coastguard Worker #define Window_DEFINED 10*c8dee2aaSAndroid Build Coastguard Worker 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTDArray.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "tools/skui/InputState.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "tools/skui/Key.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "tools/skui/ModifierKey.h" 17*c8dee2aaSAndroid Build Coastguard Worker 18*c8dee2aaSAndroid Build Coastguard Worker #include <functional> 19*c8dee2aaSAndroid Build Coastguard Worker #include <memory> 20*c8dee2aaSAndroid Build Coastguard Worker 21*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext; 22*c8dee2aaSAndroid Build Coastguard Worker class SkCanvas; 23*c8dee2aaSAndroid Build Coastguard Worker class SkSurface; 24*c8dee2aaSAndroid Build Coastguard Worker class SkSurfaceProps; 25*c8dee2aaSAndroid Build Coastguard Worker class SkString; 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite { 28*c8dee2aaSAndroid Build Coastguard Worker class Context; 29*c8dee2aaSAndroid Build Coastguard Worker class Recorder; 30*c8dee2aaSAndroid Build Coastguard Worker } 31*c8dee2aaSAndroid Build Coastguard Worker 32*c8dee2aaSAndroid Build Coastguard Worker namespace skwindow { 33*c8dee2aaSAndroid Build Coastguard Worker class DisplayParams; 34*c8dee2aaSAndroid Build Coastguard Worker class WindowContext; 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker namespace sk_app { 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker class Window { 40*c8dee2aaSAndroid Build Coastguard Worker public: 41*c8dee2aaSAndroid Build Coastguard Worker virtual ~Window(); 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker virtual void setTitle(const char*) = 0; 44*c8dee2aaSAndroid Build Coastguard Worker virtual void show() = 0; 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker // JSON-formatted UI state for Android. Do nothing by default setUIState(const char *)47*c8dee2aaSAndroid Build Coastguard Worker virtual void setUIState(const char*) {} 48*c8dee2aaSAndroid Build Coastguard Worker 49*c8dee2aaSAndroid Build Coastguard Worker // Interface to the system clipboard. Only implemented on UNIX. getClipboardText()50*c8dee2aaSAndroid Build Coastguard Worker virtual const char* getClipboardText() { return nullptr; } setClipboardText(const char *)51*c8dee2aaSAndroid Build Coastguard Worker virtual void setClipboardText(const char*) {} 52*c8dee2aaSAndroid Build Coastguard Worker 53*c8dee2aaSAndroid Build Coastguard Worker // Schedules an invalidation event for window if one is not currently pending. 54*c8dee2aaSAndroid Build Coastguard Worker // Make sure that either onPaint or markInvalReceived is called when the client window consumes 55*c8dee2aaSAndroid Build Coastguard Worker // the the inval event. They unset fIsContentInvalided which allow future onInval. 56*c8dee2aaSAndroid Build Coastguard Worker void inval(); 57*c8dee2aaSAndroid Build Coastguard Worker scaleContentToFit()58*c8dee2aaSAndroid Build Coastguard Worker virtual bool scaleContentToFit() const { return false; } 59*c8dee2aaSAndroid Build Coastguard Worker 60*c8dee2aaSAndroid Build Coastguard Worker enum BackendType { 61*c8dee2aaSAndroid Build Coastguard Worker kNativeGL_BackendType, 62*c8dee2aaSAndroid Build Coastguard Worker kANGLE_BackendType, 63*c8dee2aaSAndroid Build Coastguard Worker kGraphiteDawn_BackendType, 64*c8dee2aaSAndroid Build Coastguard Worker kVulkan_BackendType, 65*c8dee2aaSAndroid Build Coastguard Worker kGraphiteVulkan_BackendType, 66*c8dee2aaSAndroid Build Coastguard Worker kMetal_BackendType, 67*c8dee2aaSAndroid Build Coastguard Worker kGraphiteMetal_BackendType, 68*c8dee2aaSAndroid Build Coastguard Worker kDirect3D_BackendType, 69*c8dee2aaSAndroid Build Coastguard Worker kRaster_BackendType, 70*c8dee2aaSAndroid Build Coastguard Worker }; 71*c8dee2aaSAndroid Build Coastguard Worker 72*c8dee2aaSAndroid Build Coastguard Worker virtual bool attach(BackendType) = 0; 73*c8dee2aaSAndroid Build Coastguard Worker void detach(); 74*c8dee2aaSAndroid Build Coastguard Worker 75*c8dee2aaSAndroid Build Coastguard Worker // input handling 76*c8dee2aaSAndroid Build Coastguard Worker 77*c8dee2aaSAndroid Build Coastguard Worker class Layer { 78*c8dee2aaSAndroid Build Coastguard Worker public: Layer()79*c8dee2aaSAndroid Build Coastguard Worker Layer() : fActive(true) {} 80*c8dee2aaSAndroid Build Coastguard Worker virtual ~Layer() = default; 81*c8dee2aaSAndroid Build Coastguard Worker getActive()82*c8dee2aaSAndroid Build Coastguard Worker bool getActive() { return fActive; } setActive(bool active)83*c8dee2aaSAndroid Build Coastguard Worker void setActive(bool active) { fActive = active; } 84*c8dee2aaSAndroid Build Coastguard Worker 85*c8dee2aaSAndroid Build Coastguard Worker // return value of 'true' means 'I have handled this event' onBackendCreated()86*c8dee2aaSAndroid Build Coastguard Worker virtual void onBackendCreated() {} onAttach(Window * window)87*c8dee2aaSAndroid Build Coastguard Worker virtual void onAttach(Window* window) {} onChar(SkUnichar c,skui::ModifierKey)88*c8dee2aaSAndroid Build Coastguard Worker virtual bool onChar(SkUnichar c, skui::ModifierKey) { return false; } onKey(skui::Key,skui::InputState,skui::ModifierKey)89*c8dee2aaSAndroid Build Coastguard Worker virtual bool onKey(skui::Key, skui::InputState, skui::ModifierKey) { return false; } onMouse(int x,int y,skui::InputState,skui::ModifierKey)90*c8dee2aaSAndroid Build Coastguard Worker virtual bool onMouse(int x, int y, skui::InputState, skui::ModifierKey) { return false; } onMouseWheel(float delta,int x,int y,skui::ModifierKey)91*c8dee2aaSAndroid Build Coastguard Worker virtual bool onMouseWheel(float delta, int x, int y, skui::ModifierKey) { return false; } onTouch(intptr_t owner,skui::InputState,float x,float y)92*c8dee2aaSAndroid Build Coastguard Worker virtual bool onTouch(intptr_t owner, skui::InputState, float x, float y) { return false; } 93*c8dee2aaSAndroid Build Coastguard Worker // Platform-detected gesture events onFling(skui::InputState state)94*c8dee2aaSAndroid Build Coastguard Worker virtual bool onFling(skui::InputState state) { return false; } onPinch(skui::InputState state,float scale,float x,float y)95*c8dee2aaSAndroid Build Coastguard Worker virtual bool onPinch(skui::InputState state, float scale, float x, float y) { return false; } onUIStateChanged(const SkString & stateName,const SkString & stateValue)96*c8dee2aaSAndroid Build Coastguard Worker virtual void onUIStateChanged(const SkString& stateName, const SkString& stateValue) {} onPrePaint()97*c8dee2aaSAndroid Build Coastguard Worker virtual void onPrePaint() {} onPaint(SkSurface *)98*c8dee2aaSAndroid Build Coastguard Worker virtual void onPaint(SkSurface*) {} onResize(int width,int height)99*c8dee2aaSAndroid Build Coastguard Worker virtual void onResize(int width, int height) {} 100*c8dee2aaSAndroid Build Coastguard Worker 101*c8dee2aaSAndroid Build Coastguard Worker private: 102*c8dee2aaSAndroid Build Coastguard Worker friend class Window; 103*c8dee2aaSAndroid Build Coastguard Worker bool fActive; 104*c8dee2aaSAndroid Build Coastguard Worker }; 105*c8dee2aaSAndroid Build Coastguard Worker pushLayer(Layer * layer)106*c8dee2aaSAndroid Build Coastguard Worker void pushLayer(Layer* layer) { 107*c8dee2aaSAndroid Build Coastguard Worker layer->onAttach(this); 108*c8dee2aaSAndroid Build Coastguard Worker fLayers.push_back(layer); 109*c8dee2aaSAndroid Build Coastguard Worker } 110*c8dee2aaSAndroid Build Coastguard Worker 111*c8dee2aaSAndroid Build Coastguard Worker void onBackendCreated(); 112*c8dee2aaSAndroid Build Coastguard Worker bool onChar(SkUnichar c, skui::ModifierKey modifiers); 113*c8dee2aaSAndroid Build Coastguard Worker bool onKey(skui::Key key, skui::InputState state, skui::ModifierKey modifiers); 114*c8dee2aaSAndroid Build Coastguard Worker bool onMouse(int x, int y, skui::InputState state, skui::ModifierKey modifiers); 115*c8dee2aaSAndroid Build Coastguard Worker bool onMouseWheel(float delta, int x, int y, skui::ModifierKey modifiers); 116*c8dee2aaSAndroid Build Coastguard Worker bool onTouch(intptr_t owner, skui::InputState state, float x, float y); // multi-owner = multi-touch 117*c8dee2aaSAndroid Build Coastguard Worker // Platform-detected gesture events 118*c8dee2aaSAndroid Build Coastguard Worker bool onFling(skui::InputState state); 119*c8dee2aaSAndroid Build Coastguard Worker bool onPinch(skui::InputState state, float scale, float x, float y); 120*c8dee2aaSAndroid Build Coastguard Worker void onUIStateChanged(const SkString& stateName, const SkString& stateValue); 121*c8dee2aaSAndroid Build Coastguard Worker void onPaint(); 122*c8dee2aaSAndroid Build Coastguard Worker void onResize(int width, int height); 123*c8dee2aaSAndroid Build Coastguard Worker void onActivate(bool isActive); 124*c8dee2aaSAndroid Build Coastguard Worker 125*c8dee2aaSAndroid Build Coastguard Worker int width() const; 126*c8dee2aaSAndroid Build Coastguard Worker int height() const; scaleFactor()127*c8dee2aaSAndroid Build Coastguard Worker virtual float scaleFactor() const { return 1.0f; } 128*c8dee2aaSAndroid Build Coastguard Worker getRequestedDisplayParams()129*c8dee2aaSAndroid Build Coastguard Worker const skwindow::DisplayParams* getRequestedDisplayParams() { 130*c8dee2aaSAndroid Build Coastguard Worker return fRequestedDisplayParams.get(); 131*c8dee2aaSAndroid Build Coastguard Worker } 132*c8dee2aaSAndroid Build Coastguard Worker virtual void setRequestedDisplayParams(std::unique_ptr<const skwindow::DisplayParams>, 133*c8dee2aaSAndroid Build Coastguard Worker bool allowReattach = true); 134*c8dee2aaSAndroid Build Coastguard Worker 135*c8dee2aaSAndroid Build Coastguard Worker // Actual parameters in effect, obtained from the native window. 136*c8dee2aaSAndroid Build Coastguard Worker int sampleCount() const; 137*c8dee2aaSAndroid Build Coastguard Worker int stencilBits() const; 138*c8dee2aaSAndroid Build Coastguard Worker 139*c8dee2aaSAndroid Build Coastguard Worker // Returns null if there is not a GPU backend or if the backend is not yet created. 140*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext* directContext() const; 141*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::Context* graphiteContext() const; 142*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::Recorder* graphiteRecorder() const; 143*c8dee2aaSAndroid Build Coastguard Worker 144*c8dee2aaSAndroid Build Coastguard Worker using GpuTimerCallback = std::function<void(uint64_t ns)>; 145*c8dee2aaSAndroid Build Coastguard Worker 146*c8dee2aaSAndroid Build Coastguard Worker // Does the backend of this window support GPU timers (for use with submitToGpu)? 147*c8dee2aaSAndroid Build Coastguard Worker bool supportsGpuTimer() const; 148*c8dee2aaSAndroid Build Coastguard Worker 149*c8dee2aaSAndroid Build Coastguard Worker // Will snap a Recording and submit to the Context if using Graphite or flush and submit 150*c8dee2aaSAndroid Build Coastguard Worker // if using Ganesh. 151*c8dee2aaSAndroid Build Coastguard Worker void submitToGpu(GpuTimerCallback = {}); 152*c8dee2aaSAndroid Build Coastguard Worker 153*c8dee2aaSAndroid Build Coastguard Worker protected: 154*c8dee2aaSAndroid Build Coastguard Worker Window(); 155*c8dee2aaSAndroid Build Coastguard Worker 156*c8dee2aaSAndroid Build Coastguard Worker SkTDArray<Layer*> fLayers; 157*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<const skwindow::DisplayParams> fRequestedDisplayParams; 158*c8dee2aaSAndroid Build Coastguard Worker bool fIsActive = true; 159*c8dee2aaSAndroid Build Coastguard Worker 160*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skwindow::WindowContext> fWindowContext; 161*c8dee2aaSAndroid Build Coastguard Worker 162*c8dee2aaSAndroid Build Coastguard Worker virtual void onInval() = 0; 163*c8dee2aaSAndroid Build Coastguard Worker 164*c8dee2aaSAndroid Build Coastguard Worker // Uncheck fIsContentInvalided to allow future inval/onInval. 165*c8dee2aaSAndroid Build Coastguard Worker void markInvalProcessed(); 166*c8dee2aaSAndroid Build Coastguard Worker 167*c8dee2aaSAndroid Build Coastguard Worker bool fIsContentInvalidated = false; // use this to avoid duplicate invalidate events 168*c8dee2aaSAndroid Build Coastguard Worker 169*c8dee2aaSAndroid Build Coastguard Worker void visitLayers(const std::function<void(Layer*)>& visitor); 170*c8dee2aaSAndroid Build Coastguard Worker bool signalLayers(const std::function<bool(Layer*)>& visitor); 171*c8dee2aaSAndroid Build Coastguard Worker }; 172*c8dee2aaSAndroid Build Coastguard Worker 173*c8dee2aaSAndroid Build Coastguard Worker namespace Windows { 174*c8dee2aaSAndroid Build Coastguard Worker Window* CreateNativeWindow(void* platformData); 175*c8dee2aaSAndroid Build Coastguard Worker } 176*c8dee2aaSAndroid Build Coastguard Worker 177*c8dee2aaSAndroid Build Coastguard Worker } // namespace sk_app 178*c8dee2aaSAndroid Build Coastguard Worker #endif 179