11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#ifndef SampleCode_DEFINED
110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#define SampleCode_DEFINED
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkColor.h"
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkEvent.h"
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkKey.h"
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkView.h"
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkOSMenu;
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GrContext;
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SampleCode {
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool KeyQ(const SkEvent&, SkKey* outKey);
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool CharQ(const SkEvent&, SkUnichar* outUni);
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool TitleQ(const SkEvent&);
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static void TitleR(SkEvent*, const char title[]);
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static bool RequestTitle(SkView* view, SkString* title);
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool PrefSizeQ(const SkEvent&);
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static void PrefSizeR(SkEvent*, SkScalar width, SkScalar height);
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool FastTextQ(const SkEvent&);
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkMSec GetAnimTime();
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkMSec GetAnimTimeDelta();
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkScalar GetAnimSecondsDelta();
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkScalar GetAnimScalar(SkScalar speedPerSec, SkScalar period = 0);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    static GrContext* GetGr();
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// interface that constructs SkViews
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkViewFactory : public SkRefCnt {
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkView* operator() () const = 0;
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergertypedef SkView* (*SkViewCreateFunc)();
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// wraps SkViewCreateFunc in SkViewFactory interface
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkFuncViewFactory : public SkViewFactory {
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkFuncViewFactory(SkViewCreateFunc func);
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkView* operator() () const SK_OVERRIDE;
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkViewCreateFunc fCreateFunc;
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass GM;
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// factory function that creates a skiagm::GM
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergertypedef skiagm::GM* (*GMFactoryFunc)(void*);
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// Takes a GM factory function and implements the SkViewFactory interface
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// by making the GM and wrapping it in a GMSampleView. GMSampleView bridges
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// the SampleView interface to skiagm::GM.
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkGMSampleViewFactory : public SkViewFactory {
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkGMSampleViewFactory(GMFactoryFunc func);
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkView* operator() () const SK_OVERRIDE;
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    GMFactoryFunc fFunc;
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkViewRegister : public SkRefCnt {
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkViewRegister(SkViewFactory*);
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkViewRegister(SkViewCreateFunc);
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    explicit SkViewRegister(GMFactoryFunc);
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ~SkViewRegister() {
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fFact->unref();
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
890b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
900b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static const SkViewRegister* Head() { return gHead; }
910b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
920b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkViewRegister* next() const { return fChain; }
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkViewFactory*   factory() const { return fFact; }
940b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
950b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkViewFactory*  fFact;
970b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkViewRegister* fChain;
980b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
990b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static SkViewRegister* gHead;
1000b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1010b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1020b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
1030b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1040b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass SampleView : public SkView {
1050b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SampleView() : fBGColor(SK_ColorWHITE), fRepeatCount(1) {
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fUsePipe = false;
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    void setBGColor(SkColor color) { fBGColor = color; }
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool IsSampleView(SkView*);
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool SetRepeatDraw(SkView*, int count);
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    static bool SetUsePipe(SkView*, bool);
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Call this to request menu items from a SampleView.
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Subclassing notes: A subclass of SampleView can overwrite this method
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  to add new items of various types to the menu and change its title.
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  The events attached to any new menu items must be handled in its onEvent
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  method. See SkOSMenu.h for helper functions.
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void requestMenu(SkOSMenu* menu) {}
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
1260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawBackground(SkCanvas*);
1270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas*) = 0;
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides
1300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onEvent(const SkEvent& evt);
1310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt);
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void draw(SkCanvas*);
1330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDraw(SkCanvas*);
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool fUsePipe;
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColor fBGColor;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    int fRepeatCount;
1400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SkView INHERITED;
1420b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#endif
1450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
146