| /* |
| * Copyright 2011 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SampleCode_DEFINED |
| #define SampleCode_DEFINED |
| |
| #include "SkColor.h" |
| #include "SkEvent.h" |
| #include "SkKey.h" |
| #include "SkView.h" |
| #include "SkOSMenu.h" |
| |
| class GrContext; |
| class SkAnimTimer; |
| |
| #define DEF_SAMPLE(code) \ |
| static SkView* SK_MACRO_APPEND_LINE(F_)() { code } \ |
| static SkViewRegister SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_)); |
| |
| #define MAX_ZOOM_LEVEL 8 |
| #define MIN_ZOOM_LEVEL -8 |
| |
| static const char gCharEvtName[] = "SampleCode_Char_Event"; |
| static const char gKeyEvtName[] = "SampleCode_Key_Event"; |
| static const char gTitleEvtName[] = "SampleCode_Title_Event"; |
| static const char gPrefSizeEvtName[] = "SampleCode_PrefSize_Event"; |
| static const char gFastTextEvtName[] = "SampleCode_FastText_Event"; |
| static const char gUpdateWindowTitleEvtName[] = "SampleCode_UpdateWindowTitle"; |
| |
| class SampleCode { |
| public: |
| static bool KeyQ(const SkEvent&, SkKey* outKey); |
| static bool CharQ(const SkEvent&, SkUnichar* outUni); |
| |
| static bool TitleQ(const SkEvent&); |
| static void TitleR(SkEvent*, const char title[]); |
| static bool RequestTitle(SkView* view, SkString* title); |
| |
| static bool PrefSizeQ(const SkEvent&); |
| static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height); |
| |
| static bool FastTextQ(const SkEvent&); |
| |
| friend class SampleWindow; |
| }; |
| |
| ////////////////////////////////////////////////////////////////////////////// |
| |
| // interface that constructs SkViews |
| class SkViewFactory : public SkRefCnt { |
| public: |
| virtual SkView* operator() () const = 0; |
| }; |
| |
| typedef SkView* (*SkViewCreateFunc)(); |
| |
| // wraps SkViewCreateFunc in SkViewFactory interface |
| class SkFuncViewFactory : public SkViewFactory { |
| public: |
| SkFuncViewFactory(SkViewCreateFunc func); |
| SkView* operator() () const override; |
| |
| private: |
| SkViewCreateFunc fCreateFunc; |
| }; |
| |
| namespace skiagm { |
| class GM; |
| } |
| |
| // factory function that creates a skiagm::GM |
| typedef skiagm::GM* (*GMFactoryFunc)(void*); |
| |
| // Takes a GM factory function and implements the SkViewFactory interface |
| // by making the GM and wrapping it in a GMSampleView. GMSampleView bridges |
| // the SampleView interface to skiagm::GM. |
| class SkGMSampleViewFactory : public SkViewFactory { |
| public: |
| SkGMSampleViewFactory(GMFactoryFunc func); |
| SkView* operator() () const override; |
| private: |
| GMFactoryFunc fFunc; |
| }; |
| |
| class SkViewRegister : public SkRefCnt { |
| public: |
| explicit SkViewRegister(SkViewFactory*); |
| explicit SkViewRegister(SkViewCreateFunc); |
| explicit SkViewRegister(GMFactoryFunc); |
| |
| ~SkViewRegister() { |
| fFact->unref(); |
| } |
| |
| static const SkViewRegister* Head() { return gHead; } |
| |
| SkViewRegister* next() const { return fChain; } |
| const SkViewFactory* factory() const { return fFact; } |
| |
| private: |
| SkViewFactory* fFact; |
| SkViewRegister* fChain; |
| |
| static SkViewRegister* gHead; |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| |
| class SampleView : public SkView { |
| public: |
| SampleView() |
| : fPipeState(SkOSMenu::kOffState) |
| , fBGColor(SK_ColorWHITE) |
| , fRepeatCount(1) |
| , fHaveCalledOnceBeforeDraw(false) |
| {} |
| |
| void setBGColor(SkColor color) { fBGColor = color; } |
| bool animate(const SkAnimTimer& timer) { return this->onAnimate(timer); } |
| |
| static bool IsSampleView(SkView*); |
| static bool SetRepeatDraw(SkView*, int count); |
| static bool SetUsePipe(SkView*, SkOSMenu::TriState); |
| |
| /** |
| * Call this to request menu items from a SampleView. |
| * Subclassing notes: A subclass of SampleView can overwrite this method |
| * to add new items of various types to the menu and change its title. |
| * The events attached to any new menu items must be handled in its onEvent |
| * method. See SkOSMenu.h for helper functions. |
| */ |
| virtual void requestMenu(SkOSMenu* menu) {} |
| |
| virtual void onTileSizeChanged(const SkSize& tileSize) {} |
| |
| protected: |
| virtual void onDrawBackground(SkCanvas*); |
| virtual void onDrawContent(SkCanvas*) = 0; |
| virtual bool onAnimate(const SkAnimTimer&) { return false; } |
| virtual void onOnceBeforeDraw() {} |
| |
| // overrides |
| virtual bool onEvent(const SkEvent& evt); |
| virtual bool onQuery(SkEvent* evt); |
| virtual void onDraw(SkCanvas*); |
| |
| SkOSMenu::TriState fPipeState; |
| SkColor fBGColor; |
| |
| private: |
| int fRepeatCount; |
| bool fHaveCalledOnceBeforeDraw; |
| typedef SkView INHERITED; |
| }; |
| |
| #endif |