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