• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
~SkViewRegister()88     ~SkViewRegister() {
89         fFact->unref();
90     }
91 
Head()92     static const SkViewRegister* Head() { return gHead; }
93 
next()94     SkViewRegister* next() const { return fChain; }
factory()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:
SampleView()108     SampleView()
109         : fPipeState(SkOSMenu::kOffState)
110         , fBGColor(SK_ColorWHITE)
111         , fRepeatCount(1)
112     {}
113 
setBGColor(SkColor color)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      */
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;
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