1 /* 2 * Copyright 2011 Skia 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 8 #ifndef SampleApp_DEFINED 9 #define SampleApp_DEFINED 10 11 #include "SkOSMenu.h" 12 #include "SkPath.h" 13 #include "SkPicture.h" 14 #include "SkPictureRecorder.h" 15 #include "SkScalar.h" 16 #include "SkTDArray.h" 17 #include "SkTouchGesture.h" 18 #include "SkWindow.h" 19 #include "timer/Timer.h" 20 21 class GrContext; 22 class GrRenderTarget; 23 24 class SkCanvas; 25 class SkData; 26 class SkDocument; 27 class SkEvent; 28 class SkTypeface; 29 class SkViewFactory; 30 31 class SampleWindow : public SkOSWindow { 32 SkTDArray<const SkViewFactory*> fSamples; 33 public: 34 enum DeviceType { 35 kRaster_DeviceType, 36 #if SK_SUPPORT_GPU 37 kGPU_DeviceType, 38 #if SK_ANGLE 39 kANGLE_DeviceType, 40 #endif // SK_ANGLE 41 #if SK_COMMAND_BUFFER 42 kCommandBufferES2_DeviceType, 43 #endif // SK_COMMAND_BUFFER 44 #endif // SK_SUPPORT_GPU 45 kDeviceTypeCnt 46 }; 47 IsGpuDeviceType(DeviceType devType)48 static bool IsGpuDeviceType(DeviceType devType) { 49 #if SK_SUPPORT_GPU 50 switch (devType) { 51 case kGPU_DeviceType: 52 #if SK_ANGLE 53 case kANGLE_DeviceType: 54 #endif // SK_ANGLE 55 #if SK_COMMAND_BUFFER 56 case kCommandBufferES2_DeviceType: 57 #endif // SK_COMMAND_BUFFER 58 return true; 59 default: 60 return false; 61 } 62 #endif // SK_SUPPORT_GPU 63 return false; 64 } 65 66 /** 67 * SampleApp ports can subclass this manager class if they want to: 68 * * filter the types of devices supported 69 * * customize plugging of SkBaseDevice objects into an SkCanvas 70 * * customize publishing the results of draw to the OS window 71 * * manage GrContext / GrRenderTarget lifetimes 72 */ 73 class DeviceManager : public SkRefCnt { 74 public: 75 76 77 virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) = 0; 78 79 virtual void tearDownBackend(SampleWindow* win) = 0; 80 81 // called before drawing. should install correct device 82 // type on the canvas. Will skip drawing if returns false. 83 virtual SkSurface* createSurface(DeviceType dType, SampleWindow* win) = 0; 84 85 // called after drawing, should get the results onto the 86 // screen. 87 virtual void publishCanvas(DeviceType dType, 88 SkCanvas* canvas, 89 SampleWindow* win) = 0; 90 91 // called when window changes size, guaranteed to be called 92 // at least once before first draw (after init) 93 virtual void windowSizeChanged(SampleWindow* win) = 0; 94 95 // return the GrContext backing gpu devices (nullptr if not built with GPU support) 96 virtual GrContext* getGrContext() = 0; 97 98 // return the GrRenderTarget backing gpu devices (nullptr if not built with GPU support) 99 virtual GrRenderTarget* getGrRenderTarget() = 0; 100 private: 101 typedef SkRefCnt INHERITED; 102 }; 103 104 SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*); 105 virtual ~SampleWindow(); 106 createSurface()107 SkSurface* createSurface() override { 108 SkSurface* surface = nullptr; 109 if (fDevManager) { 110 surface = fDevManager->createSurface(fDeviceType, this); 111 } 112 if (nullptr == surface) { 113 surface = this->INHERITED::createSurface(); 114 } 115 return surface; 116 } 117 118 void draw(SkCanvas*) override; 119 120 void setDeviceType(DeviceType type); 121 void setDeviceColorType(SkColorType, SkColorProfileType); 122 void toggleRendering(); 123 void toggleSlideshow(); 124 void toggleFPS(); 125 void showOverview(); 126 void toggleDistanceFieldFonts(); 127 getGrContext()128 GrContext* getGrContext() const { return fDevManager->getGrContext(); } 129 130 void setZoomCenter(float x, float y); 131 void changeZoomLevel(float delta); 132 bool nextSample(); 133 bool previousSample(); 134 bool goToSample(int i); 135 SkString getSampleTitle(int i); 136 int sampleCount(); 137 bool handleTouch(int ownerId, float x, float y, 138 SkView::Click::State state); 139 void saveToPdf(); 140 void postInvalDelay(); 141 getDeviceType()142 DeviceType getDeviceType() const { return fDeviceType; } 143 144 protected: 145 void onDraw(SkCanvas* canvas) override; 146 bool onHandleKey(SkKey key) override; 147 bool onHandleChar(SkUnichar) override; 148 void onSizeChange() override; 149 150 SkCanvas* beforeChildren(SkCanvas*) override; 151 void afterChildren(SkCanvas*) override; 152 void beforeChild(SkView* child, SkCanvas* canvas) override; 153 154 bool onEvent(const SkEvent& evt) override; 155 bool onQuery(SkEvent* evt) override; 156 157 virtual bool onDispatchClick(int x, int y, Click::State, void* owner, 158 unsigned modi) override; 159 bool onClick(Click* click) override; 160 virtual Click* onFindClickHandler(SkScalar x, SkScalar y, 161 unsigned modi) override; 162 163 private: 164 class DefaultDeviceManager; 165 166 int fCurrIndex; 167 168 SkPictureRecorder fRecorder; 169 SkAutoTDelete<SkCanvas> fFlagsFilterCanvas; 170 SkPath fClipPath; 171 172 SkTouchGesture fGesture; 173 SkScalar fZoomLevel; 174 SkScalar fZoomScale; 175 176 DeviceType fDeviceType; 177 DeviceManager* fDevManager; 178 179 bool fSaveToPdf; 180 bool fSaveToSKP; 181 SkAutoTUnref<SkDocument> fPDFDocument; 182 183 bool fUseClip; 184 bool fUsePicture; 185 bool fAnimating; 186 bool fRotate; 187 bool fPerspAnim; 188 bool fRequestGrabImage; 189 bool fMeasureFPS; 190 WallTimer fTimer; 191 double fMeasureFPS_Time; 192 bool fMagnify; 193 int fTilingMode; 194 195 // The following are for the 'fatbits' drawing 196 // Latest position of the mouse. 197 int fMouseX, fMouseY; 198 int fFatBitsScale; 199 // Used by the text showing position and color values. 200 SkTypeface* fTypeface; 201 bool fShowZoomer; 202 203 SkOSMenu::TriState fLCDState; 204 SkOSMenu::TriState fAAState; 205 SkOSMenu::TriState fSubpixelState; 206 int fHintingState; 207 int fFilterQualityIndex; 208 unsigned fFlipAxis; 209 210 int fMSAASampleCount; 211 212 int fScrollTestX, fScrollTestY; 213 SkScalar fZoomCenterX, fZoomCenterY; 214 215 //Stores global settings 216 SkOSMenu* fAppMenu; // We pass ownership to SkWindow, when we call addMenu 217 //Stores slide specific settings 218 SkOSMenu* fSlideMenu; // We pass ownership to SkWindow, when we call addMenu 219 220 void loadView(SkView*); 221 void updateTitle(); 222 bool getRawTitle(SkString*); 223 224 bool zoomIn(); 225 bool zoomOut(); 226 void updatePointer(int x, int y); 227 void magnify(SkCanvas* canvas); 228 void showZoomer(SkCanvas* canvas); 229 void updateMatrix(); 230 void postAnimatingEvent(); 231 int findByTitle(const char*); 232 void listTitles(); 233 SkSize tileSize() const; 234 bool sendAnimatePulse(); 235 236 typedef SkOSWindow INHERITED; 237 }; 238 239 #endif 240