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 SkDeferredCanvas;
     26 class SkDocument;
     27 class SkEvent;
     28 class SkTypeface;
     29 class SkViewFactory;
     30 
     31 class SampleWindow : public SkOSWindow {
     32     SkTDArray<const SkViewFactory*> fSamples;
     33 public:
     34     enum DeviceType {
     35         kRaster_DeviceType,
     36         kPicture_DeviceType,
     37 #if SK_SUPPORT_GPU
     38         kGPU_DeviceType,
     39 #if SK_ANGLE
     40         kANGLE_DeviceType,
     41 #endif // SK_ANGLE
     42 #endif // SK_SUPPORT_GPU
     43         kDeferred_DeviceType,
     44         kDeviceTypeCnt
     45     };
     46 
     47     static bool IsGpuDeviceType(DeviceType devType) {
     48     #if SK_SUPPORT_GPU
     49         switch (devType) {
     50             case kGPU_DeviceType:
     51     #if SK_ANGLE
     52             case kANGLE_DeviceType:
     53     #endif // SK_ANGLE
     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     SkSurface* createSurface() 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     void draw(SkCanvas*) override;
    115 
    116     void setDeviceType(DeviceType type);
    117     void toggleRendering();
    118     void toggleSlideshow();
    119     void toggleFPS();
    120     void showOverview();
    121     void toggleDistanceFieldFonts();
    122 
    123     GrContext* getGrContext() const { return fDevManager->getGrContext(); }
    124 
    125     void setZoomCenter(float x, float y);
    126     void changeZoomLevel(float delta);
    127     bool nextSample();
    128     bool previousSample();
    129     bool goToSample(int i);
    130     SkString getSampleTitle(int i);
    131     int  sampleCount();
    132     bool handleTouch(int ownerId, float x, float y,
    133             SkView::Click::State state);
    134     void saveToPdf();
    135     void postInvalDelay();
    136 
    137     DeviceType getDeviceType() const { return fDeviceType; }
    138 
    139 protected:
    140     void onDraw(SkCanvas* canvas) override;
    141     bool onHandleKey(SkKey key) override;
    142     bool onHandleChar(SkUnichar) override;
    143     void onSizeChange() override;
    144 
    145     SkCanvas* beforeChildren(SkCanvas*) override;
    146     void afterChildren(SkCanvas*) override;
    147     void beforeChild(SkView* child, SkCanvas* canvas) override;
    148     void afterChild(SkView* child, SkCanvas* canvas) override;
    149 
    150     bool onEvent(const SkEvent& evt) override;
    151     bool onQuery(SkEvent* evt) override;
    152 
    153     virtual bool onDispatchClick(int x, int y, Click::State, void* owner,
    154                                  unsigned modi) override;
    155     bool onClick(Click* click) override;
    156     virtual Click* onFindClickHandler(SkScalar x, SkScalar y,
    157                                       unsigned modi) override;
    158 
    159 private:
    160     class DefaultDeviceManager;
    161 
    162     int fCurrIndex;
    163 
    164     SkPictureRecorder fRecorder;
    165     SkAutoTDelete<SkSurface> fDeferredSurface;
    166     SkAutoTDelete<SkDeferredCanvas> fDeferredCanvas;
    167     SkPath fClipPath;
    168 
    169     SkTouchGesture fGesture;
    170     SkScalar fZoomLevel;
    171     SkScalar fZoomScale;
    172 
    173     DeviceType fDeviceType;
    174     DeviceManager* fDevManager;
    175 
    176     bool fSaveToPdf;
    177     SkAutoTUnref<SkDocument> fPDFDocument;
    178 
    179     bool fUseClip;
    180     bool fAnimating;
    181     bool fRotate;
    182     bool fPerspAnim;
    183     bool fRequestGrabImage;
    184     bool fMeasureFPS;
    185     SkMSec fMeasureFPS_Time;
    186     SkMSec fMeasureFPS_StartTime;
    187     bool fMagnify;
    188     int fTilingMode;
    189 
    190 
    191     SkOSMenu::TriState fPipeState;  // Mixed uses a tiled pipe
    192                                     // On uses a normal pipe
    193                                     // Off uses no pipe
    194     int  fUsePipeMenuItemID;
    195 
    196     // The following are for the 'fatbits' drawing
    197     // Latest position of the mouse.
    198     int fMouseX, fMouseY;
    199     int fFatBitsScale;
    200     // Used by the text showing position and color values.
    201     SkTypeface* fTypeface;
    202     bool fShowZoomer;
    203 
    204     SkOSMenu::TriState fLCDState;
    205     SkOSMenu::TriState fAAState;
    206     SkOSMenu::TriState fSubpixelState;
    207     int fHintingState;
    208     int fFilterQualityIndex;
    209     unsigned   fFlipAxis;
    210 
    211     int fMSAASampleCount;
    212 
    213     int fScrollTestX, fScrollTestY;
    214     SkScalar fZoomCenterX, fZoomCenterY;
    215 
    216     //Stores global settings
    217     SkOSMenu* fAppMenu; // We pass ownership to SkWindow, when we call addMenu
    218     //Stores slide specific settings
    219     SkOSMenu* fSlideMenu; // We pass ownership to SkWindow, when we call addMenu
    220 
    221     int fTransitionNext;
    222     int fTransitionPrev;
    223 
    224     void loadView(SkView*);
    225     void updateTitle();
    226     bool getRawTitle(SkString*);
    227 
    228     bool zoomIn();
    229     bool zoomOut();
    230     void updatePointer(int x, int y);
    231     void magnify(SkCanvas* canvas);
    232     void showZoomer(SkCanvas* canvas);
    233     void updateMatrix();
    234     void postAnimatingEvent();
    235     void installDrawFilter(SkCanvas*);
    236     int findByTitle(const char*);
    237     void listTitles();
    238     SkSize tileSize() const;
    239     bool sendAnimatePulse();
    240 
    241     typedef SkOSWindow INHERITED;
    242 };
    243 
    244 #endif
    245