• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #define MAX_ZOOM_LEVEL  8
25 #define MIN_ZOOM_LEVEL  -8
26 
27 static const char gCharEvtName[] = "SampleCode_Char_Event";
28 static const char gKeyEvtName[] = "SampleCode_Key_Event";
29 static const char gTitleEvtName[] = "SampleCode_Title_Event";
30 static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event";
31 static const char gFastTextEvtName[] = "SampleCode_FastText_Event";
32 static const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle";
33 
34 class SampleCode {
35 public:
36     static bool KeyQ(const SkEvent&, SkKey* outKey);
37     static bool CharQ(const SkEvent&, SkUnichar* outUni);
38 
39     static bool TitleQ(const SkEvent&);
40     static void TitleR(SkEvent*, const char title[]);
41     static bool RequestTitle(SkView* view, SkString* title);
42 
43     static bool PrefSizeQ(const SkEvent&);
44     static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
45 
46     static bool FastTextQ(const SkEvent&);
47 
48     friend class SampleWindow;
49 };
50 
51 //////////////////////////////////////////////////////////////////////////////
52 
53 // interface that constructs SkViews
54 class SkViewFactory : public SkRefCnt {
55 public:
56     virtual SkView* operator() () const = 0;
57 };
58 
59 typedef SkView* (*SkViewCreateFunc)();
60 
61 // wraps SkViewCreateFunc in SkViewFactory interface
62 class SkFuncViewFactory : public SkViewFactory {
63 public:
64     SkFuncViewFactory(SkViewCreateFunc func);
65     SkView* operator() () const override;
66 
67 private:
68     SkViewCreateFunc fCreateFunc;
69 };
70 
71 namespace skiagm {
72 class GM;
73 }
74 
75 // factory function that creates a skiagm::GM
76 typedef skiagm::GM* (*GMFactoryFunc)(void*);
77 
78 // Takes a GM factory function and implements the SkViewFactory interface
79 // by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
80 // the SampleView interface to skiagm::GM.
81 class SkGMSampleViewFactory : public SkViewFactory {
82 public:
83     SkGMSampleViewFactory(GMFactoryFunc func);
84     SkView* operator() () const override;
85 private:
86     GMFactoryFunc fFunc;
87 };
88 
89 class SkViewRegister : public SkRefCnt {
90 public:
91     explicit SkViewRegister(SkViewFactory*);
92     explicit SkViewRegister(SkViewCreateFunc);
93     explicit SkViewRegister(GMFactoryFunc);
94 
~SkViewRegister()95     ~SkViewRegister() {
96         fFact->unref();
97     }
98 
Head()99     static const SkViewRegister* Head() { return gHead; }
100 
next()101     SkViewRegister* next() const { return fChain; }
factory()102     const SkViewFactory*   factory() const { return fFact; }
103 
104 private:
105     SkViewFactory*  fFact;
106     SkViewRegister* fChain;
107 
108     static SkViewRegister* gHead;
109 };
110 
111 ///////////////////////////////////////////////////////////////////////////////
112 
113 class SampleView : public SkView {
114 public:
SampleView()115     SampleView()
116         : fPipeState(SkOSMenu::kOffState)
117         , fBGColor(SK_ColorWHITE)
118         , fRepeatCount(1)
119         , fHaveCalledOnceBeforeDraw(false)
120     {}
121 
setBGColor(SkColor color)122     void setBGColor(SkColor color) { fBGColor = color; }
animate(const SkAnimTimer & timer)123     bool animate(const SkAnimTimer& timer) { return this->onAnimate(timer); }
124 
125     static bool IsSampleView(SkView*);
126     static bool SetRepeatDraw(SkView*, int count);
127     static bool SetUsePipe(SkView*, SkOSMenu::TriState);
128 
129     /**
130      *  Call this to request menu items from a SampleView.
131      *  Subclassing notes: A subclass of SampleView can overwrite this method
132      *  to add new items of various types to the menu and change its title.
133      *  The events attached to any new menu items must be handled in its onEvent
134      *  method. See SkOSMenu.h for helper functions.
135      */
requestMenu(SkOSMenu * menu)136     virtual void requestMenu(SkOSMenu* menu) {}
137 
onTileSizeChanged(const SkSize & tileSize)138     virtual void onTileSizeChanged(const SkSize& tileSize) {}
139 
140 protected:
141     virtual void onDrawBackground(SkCanvas*);
142     virtual void onDrawContent(SkCanvas*) = 0;
onAnimate(const SkAnimTimer &)143     virtual bool onAnimate(const SkAnimTimer&) { return false; }
onOnceBeforeDraw()144     virtual void onOnceBeforeDraw() {}
145 
146     // overrides
147     virtual bool onEvent(const SkEvent& evt);
148     virtual bool onQuery(SkEvent* evt);
149     virtual void onDraw(SkCanvas*);
150 
151     SkOSMenu::TriState fPipeState;
152     SkColor fBGColor;
153 
154 private:
155     int fRepeatCount;
156     bool fHaveCalledOnceBeforeDraw;
157     typedef SkView INHERITED;
158 };
159 
160 #endif
161