|  | 
 | /* | 
 |  * Copyright 2011 Skia | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef SampleWindow_DEFINED | 
 | #define SampleWindow_DEFINED | 
 |  | 
 | #include "SkWindow.h" | 
 |  | 
 | #include "SampleCode.h" | 
 | #include "SkPath.h" | 
 | #include "SkScalar.h" | 
 | #include "SkTDArray.h" | 
 | #include "SkTouchGesture.h" | 
 | #include "SkWindow.h" | 
 | #include "SkOSMenu.h" | 
 |  | 
 | class GrContext; | 
 | class GrRenderTarget; | 
 |  | 
 | class SkEvent; | 
 | class SkCanvas; | 
 | class SkPicture; | 
 | class SkTypeface; | 
 | class SkData; | 
 |  | 
 | class SampleWindow : public SkOSWindow { | 
 |     SkTDArray<SkViewFactory> fSamples; | 
 | public: | 
 |     enum DeviceType { | 
 |         kRaster_DeviceType, | 
 |         kPicture_DeviceType, | 
 |         kGPU_DeviceType | 
 |     }; | 
 |     /** | 
 |      * SampleApp ports can subclass this manager class if they want to: | 
 |      *      * filter the types of devices supported | 
 |      *      * customize plugging of SkDevice objects into an SkCanvas | 
 |      *      * customize publishing the results of draw to the OS window | 
 |      *      * manage GrContext / GrRenderTarget lifetimes | 
 |      */ | 
 |     class DeviceManager : public SkRefCnt { | 
 |     public: | 
 |         // called at end of SampleWindow cons | 
 |         virtual void init(SampleWindow* win) = 0; | 
 |  | 
 |         // called when selecting a new device type | 
 |         // can disallow a device type by returning false. | 
 |         virtual bool supportsDeviceType(DeviceType dType) = 0; | 
 |  | 
 |         // called before drawing. should install correct device | 
 |         // type on the canvas. Will skip drawing if returns false. | 
 |         virtual bool prepareCanvas(DeviceType dType, | 
 |                                    SkCanvas* canvas, | 
 |                                    SampleWindow* win) = 0; | 
 |  | 
 |         // called after drawing, should get the results onto the | 
 |         // screen. | 
 |         virtual void publishCanvas(DeviceType dType, | 
 |                                    SkCanvas* canvas, | 
 |                                    SampleWindow* win) = 0; | 
 |  | 
 |         // called when window changes size, guaranteed to be called | 
 |         // at least once before first draw (after init) | 
 |         virtual void windowSizeChanged(SampleWindow* win) = 0; | 
 |  | 
 |         // return the GrContext backing gpu devices | 
 |         virtual GrContext* getGrContext() = 0; | 
 |     }; | 
 |  | 
 |     SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*); | 
 |     virtual ~SampleWindow(); | 
 |  | 
 |     virtual void draw(SkCanvas* canvas); | 
 |  | 
 |     void setDeviceType(DeviceType type); | 
 |     void toggleRendering(); | 
 |     void toggleSlideshow(); | 
 |     void toggleFPS(); | 
 |     void showOverview(); | 
 |  | 
 |     GrContext* getGrContext() const { return fDevManager->getGrContext(); } | 
 |  | 
 |     void setZoomCenter(float x, float y); | 
 |     void changeZoomLevel(float delta); | 
 |     bool nextSample(); | 
 |     bool previousSample(); | 
 |     bool goToSample(int i); | 
 |     SkString getSampleTitle(int i); | 
 |     int  sampleCount(); | 
 |     bool handleTouch(int ownerId, float x, float y, | 
 |             SkView::Click::State state); | 
 |     void saveToPdf(); | 
 |     SkData* getPDFData() { return fPDFData; } | 
 |     void postInvalDelay(); | 
 |  | 
 | protected: | 
 |     virtual void onDraw(SkCanvas* canvas); | 
 |     virtual bool onHandleKey(SkKey key); | 
 |     virtual bool onHandleChar(SkUnichar); | 
 |     virtual void onSizeChange(); | 
 |  | 
 |     virtual SkCanvas* beforeChildren(SkCanvas*); | 
 |     virtual void afterChildren(SkCanvas*); | 
 |     virtual void beforeChild(SkView* child, SkCanvas* canvas); | 
 |     virtual void afterChild(SkView* child, SkCanvas* canvas); | 
 |  | 
 |     virtual bool onEvent(const SkEvent& evt); | 
 |     virtual bool onQuery(SkEvent* evt); | 
 |  | 
 |     virtual bool onDispatchClick(int x, int y, Click::State, void* owner); | 
 |     virtual bool onClick(Click* click); | 
 |     virtual Click* onFindClickHandler(SkScalar x, SkScalar y); | 
 |  | 
 | private: | 
 |     class DefaultDeviceManager; | 
 |  | 
 |     int fCurrIndex; | 
 |  | 
 |     SkPicture* fPicture; | 
 |     SkPath fClipPath; | 
 |  | 
 |     SkTouchGesture fGesture; | 
 |     SkScalar fZoomLevel; | 
 |     SkScalar fZoomScale; | 
 |  | 
 |     DeviceType fDeviceType; | 
 |     DeviceManager* fDevManager; | 
 |  | 
 |     bool fSaveToPdf; | 
 |     SkCanvas* fPdfCanvas; | 
 |     SkData* fPDFData; | 
 |  | 
 |     bool fUseClip; | 
 |     bool fNClip; | 
 |     bool fRepeatDrawing; | 
 |     bool fAnimating; | 
 |     bool fRotate; | 
 |     bool fPerspAnim; | 
 |     SkScalar fPerspAnimTime; | 
 |     bool fScale; | 
 |     bool fRequestGrabImage; | 
 |     bool fMeasureFPS; | 
 |     SkMSec fMeasureFPS_Time; | 
 |     bool fMagnify; | 
 |      | 
 |      | 
 |     bool fUsePipe; | 
 |     int  fUsePipeMenuItemID; | 
 |     bool fDebugger; | 
 |      | 
 |     // The following are for the 'fatbits' drawing | 
 |     // Latest position of the mouse. | 
 |     int fMouseX, fMouseY; | 
 |     int fFatBitsScale; | 
 |     // Used by the text showing position and color values. | 
 |     SkTypeface* fTypeface; | 
 |     bool fShowZoomer; | 
 |      | 
 |     SkOSMenu::TriState fLCDState; | 
 |     SkOSMenu::TriState fAAState; | 
 |     SkOSMenu::TriState fFilterState; | 
 |     SkOSMenu::TriState fHintingState; | 
 |     unsigned   fFlipAxis; | 
 |  | 
 |     int fScrollTestX, fScrollTestY; | 
 |     SkScalar fZoomCenterX, fZoomCenterY; | 
 |  | 
 |     //Stores global settings | 
 |     SkOSMenu fAppMenu; | 
 |     //Stores slide specific settings | 
 |     SkOSMenu fSlideMenu; | 
 |     int fTransitionNext; | 
 |     int fTransitionPrev; | 
 |      | 
 |     void loadView(SkView*); | 
 |     void updateTitle(); | 
 |  | 
 |     bool zoomIn(); | 
 |     bool zoomOut(); | 
 |     void updatePointer(int x, int y); | 
 |     void magnify(SkCanvas* canvas); | 
 |     void showZoomer(SkCanvas* canvas); | 
 |  | 
 |     void postAnimatingEvent(); | 
 |  | 
 |     typedef SkOSWindow INHERITED; | 
 | }; | 
 |  | 
 | #endif |