Home | History | Annotate | Download | only in samplecode
      1 /*
      2  * Copyright 2011 Google Inc.
      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 SampleCode_DEFINED
      9 #define SampleCode_DEFINED
     10 
     11 #include "SkColor.h"
     12 #include "SkEvent.h"
     13 #include "SkView.h"
     14 
     15 class SkAnimTimer;
     16 
     17 #define DEF_SAMPLE(code) \
     18     static SkView*          SK_MACRO_APPEND_LINE(F_)() { code } \
     19     static SkViewRegister   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
     20 
     21 static const char gCharEvtName[] = "SampleCode_Char_Event";
     22 static const char gTitleEvtName[] = "SampleCode_Title_Event";
     23 
     24 class SampleCode {
     25 public:
     26     static bool CharQ(const SkEvent&, SkUnichar* outUni);
     27 
     28     static bool TitleQ(const SkEvent&);
     29     static void TitleR(SkEvent*, const char title[]);
     30     static bool RequestTitle(SkView* view, SkString* title);
     31 
     32     friend class SampleWindow;
     33 };
     34 
     35 //////////////////////////////////////////////////////////////////////////////
     36 
     37 // interface that constructs SkViews
     38 class SkViewFactory : public SkRefCnt {
     39 public:
     40     virtual SkView* operator() () const = 0;
     41 };
     42 
     43 typedef SkView* (*SkViewCreateFunc)();
     44 
     45 // wraps SkViewCreateFunc in SkViewFactory interface
     46 class SkFuncViewFactory : public SkViewFactory {
     47 public:
     48     SkFuncViewFactory(SkViewCreateFunc func);
     49     SkView* operator() () const override;
     50 
     51 private:
     52     SkViewCreateFunc fCreateFunc;
     53 };
     54 
     55 class SkViewRegister : public SkRefCnt {
     56 public:
     57     explicit SkViewRegister(SkViewFactory*);
     58     explicit SkViewRegister(SkViewCreateFunc);
     59 
     60     ~SkViewRegister() {
     61         fFact->unref();
     62     }
     63 
     64     static const SkViewRegister* Head() { return gHead; }
     65 
     66     SkViewRegister* next() const { return fChain; }
     67     const SkViewFactory*   factory() const { return fFact; }
     68 
     69 private:
     70     SkViewFactory*  fFact;
     71     SkViewRegister* fChain;
     72 
     73     static SkViewRegister* gHead;
     74 };
     75 
     76 ///////////////////////////////////////////////////////////////////////////////
     77 
     78 class SampleView : public SkView {
     79 public:
     80     SampleView()
     81         : fBGColor(SK_ColorWHITE)
     82         , fHaveCalledOnceBeforeDraw(false)
     83     {}
     84 
     85     void setBGColor(SkColor color) { fBGColor = color; }
     86     bool animate(const SkAnimTimer& timer) { return this->onAnimate(timer); }
     87 
     88     static bool IsSampleView(SkView*);
     89 
     90 protected:
     91     virtual void onDrawBackground(SkCanvas*);
     92     virtual void onDrawContent(SkCanvas*) = 0;
     93     virtual bool onAnimate(const SkAnimTimer&) { return false; }
     94     virtual void onOnceBeforeDraw() {}
     95 
     96     // overrides
     97     virtual bool onQuery(SkEvent* evt);
     98     virtual void onDraw(SkCanvas*);
     99 
    100     SkColor fBGColor;
    101 
    102 private:
    103     bool fHaveCalledOnceBeforeDraw;
    104     typedef SkView INHERITED;
    105 };
    106 
    107 #endif
    108