Home | History | Annotate | Download | only in samplecode
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      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 SampleCode_DEFINED
     11 #define SampleCode_DEFINED
     12 
     13 #include "SkColor.h"
     14 #include "SkEvent.h"
     15 #include "SkKey.h"
     16 #include "SkView.h"
     17 #include "SkOSMenu.h"
     18 class GrContext;
     19 
     20 class SampleCode {
     21 public:
     22     static bool KeyQ(const SkEvent&, SkKey* outKey);
     23     static bool CharQ(const SkEvent&, SkUnichar* outUni);
     24 
     25     static bool TitleQ(const SkEvent&);
     26     static void TitleR(SkEvent*, const char title[]);
     27     static bool RequestTitle(SkView* view, SkString* title);
     28 
     29     static bool PrefSizeQ(const SkEvent&);
     30     static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
     31 
     32     static bool FastTextQ(const SkEvent&);
     33 
     34     static SkMSec GetAnimTime();
     35     static SkMSec GetAnimTimeDelta();
     36     static SkScalar GetAnimSecondsDelta();
     37     static SkScalar GetAnimScalar(SkScalar speedPerSec, SkScalar period = 0);
     38     // gives a sinusoidal value between 0 and amplitude
     39     static SkScalar GetAnimSinScalar(SkScalar amplitude,
     40                                      SkScalar periodInSec,
     41                                      SkScalar phaseInSec = 0);
     42 };
     43 
     44 //////////////////////////////////////////////////////////////////////////////
     45 
     46 // interface that constructs SkViews
     47 class SkViewFactory : public SkRefCnt {
     48 public:
     49     virtual SkView* operator() () const = 0;
     50 };
     51 
     52 typedef SkView* (*SkViewCreateFunc)();
     53 
     54 // wraps SkViewCreateFunc in SkViewFactory interface
     55 class SkFuncViewFactory : public SkViewFactory {
     56 public:
     57     SkFuncViewFactory(SkViewCreateFunc func);
     58     virtual SkView* operator() () const SK_OVERRIDE;
     59 
     60 private:
     61     SkViewCreateFunc fCreateFunc;
     62 };
     63 
     64 namespace skiagm {
     65 class GM;
     66 }
     67 
     68 // factory function that creates a skiagm::GM
     69 typedef skiagm::GM* (*GMFactoryFunc)(void*);
     70 
     71 // Takes a GM factory function and implements the SkViewFactory interface
     72 // by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
     73 // the SampleView interface to skiagm::GM.
     74 class SkGMSampleViewFactory : public SkViewFactory {
     75 public:
     76     SkGMSampleViewFactory(GMFactoryFunc func);
     77     virtual SkView* operator() () const SK_OVERRIDE;
     78 private:
     79     GMFactoryFunc fFunc;
     80 };
     81 
     82 class SkViewRegister : public SkRefCnt {
     83 public:
     84     explicit SkViewRegister(SkViewFactory*);
     85     explicit SkViewRegister(SkViewCreateFunc);
     86     explicit SkViewRegister(GMFactoryFunc);
     87 
     88     ~SkViewRegister() {
     89         fFact->unref();
     90     }
     91 
     92     static const SkViewRegister* Head() { return gHead; }
     93 
     94     SkViewRegister* next() const { return fChain; }
     95     const SkViewFactory*   factory() const { return fFact; }
     96 
     97 private:
     98     SkViewFactory*  fFact;
     99     SkViewRegister* fChain;
    100 
    101     static SkViewRegister* gHead;
    102 };
    103 
    104 ///////////////////////////////////////////////////////////////////////////////
    105 
    106 class SampleView : public SkView {
    107 public:
    108     SampleView()
    109         : fPipeState(SkOSMenu::kOffState)
    110         , fBGColor(SK_ColorWHITE)
    111         , fRepeatCount(1)
    112     {}
    113 
    114     void setBGColor(SkColor color) { fBGColor = color; }
    115 
    116     static bool IsSampleView(SkView*);
    117     static bool SetRepeatDraw(SkView*, int count);
    118     static bool SetUsePipe(SkView*, SkOSMenu::TriState);
    119 
    120     /**
    121      *  Call this to request menu items from a SampleView.
    122      *  Subclassing notes: A subclass of SampleView can overwrite this method
    123      *  to add new items of various types to the menu and change its title.
    124      *  The events attached to any new menu items must be handled in its onEvent
    125      *  method. See SkOSMenu.h for helper functions.
    126      */
    127     virtual void requestMenu(SkOSMenu* menu) {}
    128 
    129     virtual void onTileSizeChanged(const SkSize& tileSize) {}
    130 
    131 protected:
    132     virtual void onDrawBackground(SkCanvas*);
    133     virtual void onDrawContent(SkCanvas*) = 0;
    134 
    135     // overrides
    136     virtual bool onEvent(const SkEvent& evt);
    137     virtual bool onQuery(SkEvent* evt);
    138     virtual void draw(SkCanvas*);
    139     virtual void onDraw(SkCanvas*);
    140 
    141     SkOSMenu::TriState fPipeState;
    142     SkColor fBGColor;
    143 
    144 private:
    145     int fRepeatCount;
    146 
    147     typedef SkView INHERITED;
    148 };
    149 
    150 #endif
    151