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 "SkKey.h"
14 #include "SkView.h"
15 #include "SkOSMenu.h"
16 
17 class GrContext;
18 class SkAnimTimer;
19 
20 #define DEF_SAMPLE(code) \
21     static SkView*          SK_MACRO_APPEND_LINE(F_)() { code } \
22     static SkViewRegister   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
23 
24 
25 class SampleCode {
26 public:
27     static bool KeyQ(const SkEvent&, SkKey* outKey);
28     static bool CharQ(const SkEvent&, SkUnichar* outUni);
29 
30     static bool TitleQ(const SkEvent&);
31     static void TitleR(SkEvent*, const char title[]);
32     static bool RequestTitle(SkView* view, SkString* title);
33 
34     static bool PrefSizeQ(const SkEvent&);
35     static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
36 
37     static bool FastTextQ(const SkEvent&);
38 
39     friend class SampleWindow;
40 };
41 
42 //////////////////////////////////////////////////////////////////////////////
43 
44 // interface that constructs SkViews
45 class SkViewFactory : public SkRefCnt {
46 public:
47     virtual SkView* operator() () const = 0;
48 };
49 
50 typedef SkView* (*SkViewCreateFunc)();
51 
52 // wraps SkViewCreateFunc in SkViewFactory interface
53 class SkFuncViewFactory : public SkViewFactory {
54 public:
55     SkFuncViewFactory(SkViewCreateFunc func);
56     SkView* operator() () const override;
57 
58 private:
59     SkViewCreateFunc fCreateFunc;
60 };
61 
62 namespace skiagm {
63 class GM;
64 }
65 
66 // factory function that creates a skiagm::GM
67 typedef skiagm::GM* (*GMFactoryFunc)(void*);
68 
69 // Takes a GM factory function and implements the SkViewFactory interface
70 // by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
71 // the SampleView interface to skiagm::GM.
72 class SkGMSampleViewFactory : public SkViewFactory {
73 public:
74     SkGMSampleViewFactory(GMFactoryFunc func);
75     SkView* operator() () const override;
76 private:
77     GMFactoryFunc fFunc;
78 };
79 
80 class SkViewRegister : public SkRefCnt {
81 public:
82     explicit SkViewRegister(SkViewFactory*);
83     explicit SkViewRegister(SkViewCreateFunc);
84     explicit SkViewRegister(GMFactoryFunc);
85 
~SkViewRegister()86     ~SkViewRegister() {
87         fFact->unref();
88     }
89 
Head()90     static const SkViewRegister* Head() { return gHead; }
91 
next()92     SkViewRegister* next() const { return fChain; }
factory()93     const SkViewFactory*   factory() const { return fFact; }
94 
95 private:
96     SkViewFactory*  fFact;
97     SkViewRegister* fChain;
98 
99     static SkViewRegister* gHead;
100 };
101 
102 ///////////////////////////////////////////////////////////////////////////////
103 
104 class SampleView : public SkView {
105 public:
SampleView()106     SampleView()
107         : fPipeState(SkOSMenu::kOffState)
108         , fBGColor(SK_ColorWHITE)
109         , fRepeatCount(1)
110         , fHaveCalledOnceBeforeDraw(false)
111     {}
112 
setBGColor(SkColor color)113     void setBGColor(SkColor color) { fBGColor = color; }
animate(const SkAnimTimer & timer)114     bool animate(const SkAnimTimer& timer) { return this->onAnimate(timer); }
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      */
requestMenu(SkOSMenu * menu)127     virtual void requestMenu(SkOSMenu* menu) {}
128 
onTileSizeChanged(const SkSize & tileSize)129     virtual void onTileSizeChanged(const SkSize& tileSize) {}
130 
131 protected:
132     virtual void onDrawBackground(SkCanvas*);
133     virtual void onDrawContent(SkCanvas*) = 0;
onAnimate(const SkAnimTimer &)134     virtual bool onAnimate(const SkAnimTimer&) { return false; }
onOnceBeforeDraw()135     virtual void onOnceBeforeDraw() {}
136 
137     // overrides
138     virtual bool onEvent(const SkEvent& evt);
139     virtual bool onQuery(SkEvent* evt);
140     virtual void draw(SkCanvas*);
141     virtual void onDraw(SkCanvas*);
142 
143     SkOSMenu::TriState fPipeState;
144     SkColor fBGColor;
145 
146 private:
147     int fRepeatCount;
148     bool fHaveCalledOnceBeforeDraw;
149     typedef SkView INHERITED;
150 };
151 
152 #endif
153