1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SampleCode_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SampleCode_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
11f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com#include "SkColor.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkEvent.h"
132eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org#include "SkView.h"
1476113a9b7716748c70ea0ecf7aacbabe4cce5009reed
1576113a9b7716748c70ea0ecf7aacbabe4cce5009reedclass SkAnimTimer;
163cec4d71e6f53fda99705427f9820d025cfbf64breed@google.com
17a7a8b10134f78d4ed55ff0370a54d8141daa7cacreed#define DEF_SAMPLE(code) \
18a7a8b10134f78d4ed55ff0370a54d8141daa7cacreed    static SkView*          SK_MACRO_APPEND_LINE(F_)() { code } \
19a7a8b10134f78d4ed55ff0370a54d8141daa7cacreed    static SkViewRegister   SK_MACRO_APPEND_LINE(R_)(SK_MACRO_APPEND_LINE(F_));
20a7a8b10134f78d4ed55ff0370a54d8141daa7cacreed
21c7027ab03f2e8bab4c74bc1b047642622d3d682bjvanverthstatic const char gCharEvtName[] = "SampleCode_Char_Event";
22c7027ab03f2e8bab4c74bc1b047642622d3d682bjvanverthstatic const char gTitleEvtName[] = "SampleCode_Title_Event";
23a7a8b10134f78d4ed55ff0370a54d8141daa7cacreed
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SampleCode {
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
26f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com    static bool CharQ(const SkEvent&, SkUnichar* outUni);
27f2b98d67dcb6fcb3120feede9c72016fc7b3ead8reed@android.com
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool TitleQ(const SkEvent&);
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static void TitleR(SkEvent*, const char title[]);
30db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    static bool RequestTitle(SkView* view, SkString* title);
31ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
32d9adfe6a223955bc69c8c7661ab8e0a078afbc32reed    friend class SampleWindow;
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com//////////////////////////////////////////////////////////////////////////////
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// interface that constructs SkViews
3848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comclass SkViewFactory : public SkRefCnt {
39ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.compublic:
4048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    virtual SkView* operator() () const = 0;
4148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com};
4248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
4348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comtypedef SkView* (*SkViewCreateFunc)();
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com// wraps SkViewCreateFunc in SkViewFactory interface
4648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comclass SkFuncViewFactory : public SkViewFactory {
478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
4848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    SkFuncViewFactory(SkViewCreateFunc func);
4936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkView* operator() () const override;
50ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
5148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comprivate:
5248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    SkViewCreateFunc fCreateFunc;
5348dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com};
5448dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
5548dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.comclass SkViewRegister : public SkRefCnt {
5648dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.compublic:
5748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    explicit SkViewRegister(SkViewFactory*);
5848dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    explicit SkViewRegister(SkViewCreateFunc);
5948dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com
6048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    ~SkViewRegister() {
6148dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com        fFact->unref();
6248dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    }
63ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static const SkViewRegister* Head() { return gHead; }
65ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkViewRegister* next() const { return fChain; }
6748dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    const SkViewFactory*   factory() const { return fFact; }
68ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
7048dd1a26ec07c5baa04856202e4e7e2a53e4d7e5bsalomon@google.com    SkViewFactory*  fFact;
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkViewRegister* fChain;
72ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static SkViewRegister* gHead;
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
762eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org///////////////////////////////////////////////////////////////////////////////
772eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
782eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgclass SampleView : public SkView {
792eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgpublic:
804d5c26de0a24f86c37c1da8b0e30d11a550ea67breed@google.com    SampleView()
814f99e58252175f01c0b9ca1a5e2fc7acec6acec3Brian Osman        : fBGColor(SK_ColorWHITE)
8263c684a8a609d39da11b4a656223cebf52ca85dccaryclark        , fHaveCalledOnceBeforeDraw(false)
83868074b50b0fc3e460d2aa97c1096827fe0a1935reed    {}
842eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
85f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com    void setBGColor(SkColor color) { fBGColor = color; }
8676113a9b7716748c70ea0ecf7aacbabe4cce5009reed    bool animate(const SkAnimTimer& timer) { return this->onAnimate(timer); }
87f21833999d90ad9c8c584cff3238797b39cfc00breed@google.com
88a6ff4dc22d5006dc588769aa20c8b0bb4fde6d43reed@google.com    static bool IsSampleView(SkView*);
89bbe43a9ce0513d37cbd5dca583c391b7b1e39b3acommit-bot@chromium.org
902eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgprotected:
912eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    virtual void onDrawBackground(SkCanvas*);
922eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    virtual void onDrawContent(SkCanvas*) = 0;
9376113a9b7716748c70ea0ecf7aacbabe4cce5009reed    virtual bool onAnimate(const SkAnimTimer&) { return false; }
9463c684a8a609d39da11b4a656223cebf52ca85dccaryclark    virtual void onOnceBeforeDraw() {}
95ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
962eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    // overrides
972eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    virtual bool onQuery(SkEvent* evt);
982eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    virtual void onDraw(SkCanvas*);
992eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
100db03eaa37111a63835ab7f61cb550971e609a621yangsu@google.com    SkColor fBGColor;
101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com
1022eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.orgprivate:
10363c684a8a609d39da11b4a656223cebf52ca85dccaryclark    bool fHaveCalledOnceBeforeDraw;
1042eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org    typedef SkView INHERITED;
1052eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org};
1062eb595292b9624371d1698ae9da7accb4c09c26cmike@reedtribe.org
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
108