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