SampleApp.h revision a34be68a7eff0ae475b194f8a29975460cf3e456
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 21class GrContext; 22class GrRenderTarget; 23 24class SkCanvas; 25class SkData; 26class SkDocument; 27class SkEvent; 28class SkTypeface; 29class SkViewFactory; 30 31class SampleWindow : public SkOSWindow { 32 SkTDArray<const SkViewFactory*> fSamples; 33public: 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 kCommandBuffer_DeviceType, 43#endif // SK_COMMAND_BUFFER 44#endif // SK_SUPPORT_GPU 45 kDeviceTypeCnt 46 }; 47 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 kCommandBuffer_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 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 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 142 DeviceType getDeviceType() const { return fDeviceType; } 143 144protected: 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 163private: 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