1 2 /* 3 * Copyright 2011 Skia 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 #ifndef SampleWindow_DEFINED 11 #define SampleWindow_DEFINED 12 13 #include "SkWindow.h" 14 15 #include "SampleCode.h" 16 #include "SkPath.h" 17 #include "SkScalar.h" 18 #include "SkTDArray.h" 19 #include "SkTouchGesture.h" 20 #include "SkWindow.h" 21 #include "SkOSMenu.h" 22 23 class GrContext; 24 class GrRenderTarget; 25 26 class SkEvent; 27 class SkCanvas; 28 class SkPicture; 29 class SkTypeface; 30 class SkData; 31 32 class SampleWindow : public SkOSWindow { 33 SkTDArray<const SkViewFactory*> fSamples; 34 public: 35 enum DeviceType { 36 kRaster_DeviceType, 37 kPicture_DeviceType, 38 kGPU_DeviceType, 39 kNullGPU_DeviceType 40 }; 41 /** 42 * SampleApp ports can subclass this manager class if they want to: 43 * * filter the types of devices supported 44 * * customize plugging of SkDevice objects into an SkCanvas 45 * * customize publishing the results of draw to the OS window 46 * * manage GrContext / GrRenderTarget lifetimes 47 */ 48 class DeviceManager : public SkRefCnt { 49 public: 50 // called at end of SampleWindow cons 51 virtual void init(SampleWindow* win) = 0; 52 53 // called when selecting a new device type 54 // can disallow a device type by returning false. 55 virtual bool supportsDeviceType(DeviceType dType) = 0; 56 57 // called before drawing. should install correct device 58 // type on the canvas. Will skip drawing if returns false. 59 virtual bool prepareCanvas(DeviceType dType, 60 SkCanvas* canvas, 61 SampleWindow* win) = 0; 62 63 // called after drawing, should get the results onto the 64 // screen. 65 virtual void publishCanvas(DeviceType dType, 66 SkCanvas* canvas, 67 SampleWindow* win) = 0; 68 69 // called when window changes size, guaranteed to be called 70 // at least once before first draw (after init) 71 virtual void windowSizeChanged(SampleWindow* win) = 0; 72 73 // return the GrContext backing gpu devices 74 virtual GrContext* getGrContext(DeviceType dType) = 0; 75 }; 76 77 SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*); 78 virtual ~SampleWindow(); 79 80 virtual void draw(SkCanvas* canvas); 81 82 void setDeviceType(DeviceType type); 83 void toggleRendering(); 84 void toggleSlideshow(); 85 void toggleFPS(); 86 void showOverview(); 87 88 GrContext* getGrContext() const { return fDevManager->getGrContext(fDeviceType); } 89 90 void setZoomCenter(float x, float y); 91 void changeZoomLevel(float delta); 92 bool nextSample(); 93 bool previousSample(); 94 bool goToSample(int i); 95 SkString getSampleTitle(int i); 96 int sampleCount(); 97 bool handleTouch(int ownerId, float x, float y, 98 SkView::Click::State state); 99 void saveToPdf(); 100 SkData* getPDFData() { return fPDFData; } 101 void postInvalDelay(); 102 103 protected: 104 virtual void onDraw(SkCanvas* canvas); 105 virtual bool onHandleKey(SkKey key); 106 virtual bool onHandleChar(SkUnichar); 107 virtual void onSizeChange(); 108 109 virtual SkCanvas* beforeChildren(SkCanvas*); 110 virtual void afterChildren(SkCanvas*); 111 virtual void beforeChild(SkView* child, SkCanvas* canvas); 112 virtual void afterChild(SkView* child, SkCanvas* canvas); 113 114 virtual bool onEvent(const SkEvent& evt); 115 virtual bool onQuery(SkEvent* evt); 116 117 virtual bool onDispatchClick(int x, int y, Click::State, void* owner); 118 virtual bool onClick(Click* click); 119 virtual Click* onFindClickHandler(SkScalar x, SkScalar y); 120 121 private: 122 class DefaultDeviceManager; 123 124 int fCurrIndex; 125 126 SkPicture* fPicture; 127 SkPath fClipPath; 128 129 SkTouchGesture fGesture; 130 SkScalar fZoomLevel; 131 SkScalar fZoomScale; 132 133 DeviceType fDeviceType; 134 DeviceManager* fDevManager; 135 136 bool fSaveToPdf; 137 SkCanvas* fPdfCanvas; 138 SkData* fPDFData; 139 140 bool fUseClip; 141 bool fNClip; 142 bool fAnimating; 143 bool fRotate; 144 bool fPerspAnim; 145 SkScalar fPerspAnimTime; 146 bool fScale; 147 bool fRequestGrabImage; 148 bool fMeasureFPS; 149 SkMSec fMeasureFPS_Time; 150 bool fMagnify; 151 152 153 bool fUsePipe; 154 int fUsePipeMenuItemID; 155 bool fDebugger; 156 157 // The following are for the 'fatbits' drawing 158 // Latest position of the mouse. 159 int fMouseX, fMouseY; 160 int fFatBitsScale; 161 // Used by the text showing position and color values. 162 SkTypeface* fTypeface; 163 bool fShowZoomer; 164 165 SkOSMenu::TriState fLCDState; 166 SkOSMenu::TriState fAAState; 167 SkOSMenu::TriState fFilterState; 168 SkOSMenu::TriState fHintingState; 169 unsigned fFlipAxis; 170 171 int fScrollTestX, fScrollTestY; 172 SkScalar fZoomCenterX, fZoomCenterY; 173 174 //Stores global settings 175 SkOSMenu fAppMenu; 176 //Stores slide specific settings 177 SkOSMenu fSlideMenu; 178 int fTransitionNext; 179 int fTransitionPrev; 180 181 void loadView(SkView*); 182 void updateTitle(); 183 184 bool zoomIn(); 185 bool zoomOut(); 186 void updatePointer(int x, int y); 187 void magnify(SkCanvas* canvas); 188 void showZoomer(SkCanvas* canvas); 189 void updateMatrix(); 190 void postAnimatingEvent(); 191 void installDrawFilter(SkCanvas*); 192 int findByTitle(const char*); 193 194 typedef SkOSWindow INHERITED; 195 }; 196 197 #endif 198