| /* |
| * Copyright 2011 Skia |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SampleApp_DEFINED |
| #define SampleApp_DEFINED |
| |
| #include "SkOSMenu.h" |
| #include "SkPath.h" |
| #include "SkPicture.h" |
| #include "SkScalar.h" |
| #include "SkTDArray.h" |
| #include "SkTouchGesture.h" |
| #include "SkWindow.h" |
| |
| class GrContext; |
| class GrRenderTarget; |
| |
| class SkCanvas; |
| class SkData; |
| class SkEvent; |
| class SkTypeface; |
| class SkViewFactory; |
| |
| class SampleWindow : public SkOSWindow { |
| SkTDArray<const SkViewFactory*> fSamples; |
| public: |
| enum DeviceType { |
| kRaster_DeviceType, |
| kPicture_DeviceType, |
| #if SK_SUPPORT_GPU |
| kGPU_DeviceType, |
| #if SK_ANGLE |
| kANGLE_DeviceType, |
| #endif // SK_ANGLE |
| kNullGPU_DeviceType, |
| #endif // SK_SUPPORT_GPU |
| |
| kDeviceTypeCnt |
| }; |
| |
| static bool IsGpuDeviceType(DeviceType devType) { |
| #if SK_SUPPORT_GPU |
| switch (devType) { |
| case kGPU_DeviceType: |
| #if SK_ANGLE |
| case kANGLE_DeviceType: |
| #endif // SK_ANGLE |
| case kNullGPU_DeviceType: |
| return true; |
| default: |
| return false; |
| } |
| #endif // SK_SUPPORT_GPU |
| return false; |
| } |
| |
| /** |
| * SampleApp ports can subclass this manager class if they want to: |
| * * filter the types of devices supported |
| * * customize plugging of SkBaseDevice objects into an SkCanvas |
| * * customize publishing the results of draw to the OS window |
| * * manage GrContext / GrRenderTarget lifetimes |
| */ |
| class DeviceManager : public SkRefCnt { |
| public: |
| SK_DECLARE_INST_COUNT(DeviceManager) |
| |
| virtual void setUpBackend(SampleWindow* win, int msaaSampleCount) = 0; |
| |
| virtual void tearDownBackend(SampleWindow* win) = 0; |
| |
| // called before drawing. should install correct device |
| // type on the canvas. Will skip drawing if returns false. |
| virtual SkCanvas* createCanvas(DeviceType dType, 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 (NULL if not built with GPU support) |
| virtual GrContext* getGrContext() = 0; |
| |
| // return the GrRenderTarget backing gpu devices (NULL if not built with GPU support) |
| virtual GrRenderTarget* getGrRenderTarget() = 0; |
| private: |
| typedef SkRefCnt INHERITED; |
| }; |
| |
| SampleWindow(void* hwnd, int argc, char** argv, DeviceManager*); |
| virtual ~SampleWindow(); |
| |
| virtual SkCanvas* createCanvas() SK_OVERRIDE { |
| SkCanvas* canvas = NULL; |
| if (fDevManager) { |
| canvas = fDevManager->createCanvas(fDeviceType, this); |
| } |
| if (NULL == canvas) { |
| canvas = this->INHERITED::createCanvas(); |
| } |
| return canvas; |
| } |
| |
| 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(); |
| |
| DeviceType getDeviceType() const { return fDeviceType; } |
| |
| protected: |
| virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE; |
| virtual bool onHandleKey(SkKey key) SK_OVERRIDE; |
| virtual bool onHandleChar(SkUnichar) SK_OVERRIDE; |
| virtual void onSizeChange() SK_OVERRIDE; |
| |
| virtual SkCanvas* beforeChildren(SkCanvas*) SK_OVERRIDE; |
| virtual void afterChildren(SkCanvas*) SK_OVERRIDE; |
| virtual void beforeChild(SkView* child, SkCanvas* canvas) SK_OVERRIDE; |
| virtual void afterChild(SkView* child, SkCanvas* canvas) SK_OVERRIDE; |
| |
| virtual bool onEvent(const SkEvent& evt) SK_OVERRIDE; |
| virtual bool onQuery(SkEvent* evt) SK_OVERRIDE; |
| |
| virtual bool onDispatchClick(int x, int y, Click::State, void* owner, |
| unsigned modi) SK_OVERRIDE; |
| virtual bool onClick(Click* click) SK_OVERRIDE; |
| virtual Click* onFindClickHandler(SkScalar x, SkScalar y, |
| unsigned modi) SK_OVERRIDE; |
| |
| void registerPictFileSamples(char** argv, int argc); |
| void registerPictFileSample(char** argv, int argc); |
| |
| #ifdef SAMPLE_PDF_FILE_VIEWER |
| void registerPdfFileViewerSamples(char** argv, int argc); |
| #endif // SAMPLE_PDF_FILE_VIEWER |
| |
| |
| private: |
| class DefaultDeviceManager; |
| |
| int fCurrIndex; |
| |
| SkPictureRecorder fRecorder; |
| SkPath fClipPath; |
| |
| SkTouchGesture fGesture; |
| SkScalar fZoomLevel; |
| SkScalar fZoomScale; |
| |
| DeviceType fDeviceType; |
| DeviceManager* fDevManager; |
| |
| bool fSaveToPdf; |
| SkCanvas* fPdfCanvas; |
| SkData* fPDFData; |
| |
| bool fUseClip; |
| bool fNClip; |
| bool fAnimating; |
| bool fRotate; |
| SkScalar fRotateAnimTime; |
| bool fPerspAnim; |
| SkScalar fPerspAnimTime; |
| bool fRequestGrabImage; |
| bool fMeasureFPS; |
| SkMSec fMeasureFPS_Time; |
| SkMSec fMeasureFPS_StartTime; |
| bool fMagnify; |
| int fTilingMode; |
| |
| |
| SkOSMenu::TriState fPipeState; // Mixed uses a tiled pipe |
| // On uses a normal pipe |
| // Off uses no pipe |
| int fUsePipeMenuItemID; |
| |
| // 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 fSubpixelState; |
| int fHintingState; |
| int fFilterLevelIndex; |
| unsigned fFlipAxis; |
| |
| int fMSAASampleCount; |
| |
| int fScrollTestX, fScrollTestY; |
| SkScalar fZoomCenterX, fZoomCenterY; |
| |
| //Stores global settings |
| SkOSMenu* fAppMenu; // We pass ownership to SkWindow, when we call addMenu |
| //Stores slide specific settings |
| SkOSMenu* fSlideMenu; // We pass ownership to SkWindow, when we call addMenu |
| |
| 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 updateMatrix(); |
| void postAnimatingEvent(); |
| void installDrawFilter(SkCanvas*); |
| int findByTitle(const char*); |
| void listTitles(); |
| SkSize tileSize() const; |
| |
| typedef SkOSWindow INHERITED; |
| }; |
| |
| #endif |