1/*
2 * Copyright 2016 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#include "SampleCode.h"
9#include "SkCanvas.h"
10#include "SkString.h"
11
12#if SK_SUPPORT_GPU
13#   include "GrContext.h"
14#else
15class GrContext;
16#endif
17
18//////////////////////////////////////////////////////////////////////////////
19
20bool SampleCode::CharQ(const SkEvent& evt, SkUnichar* outUni) {
21    if (evt.isType(gCharEvtName)) {
22        if (outUni) {
23            *outUni = evt.getFast32();
24        }
25        return true;
26    }
27    return false;
28}
29
30bool SampleCode::TitleQ(const SkEvent& evt) {
31    return evt.isType(gTitleEvtName);
32}
33
34void SampleCode::TitleR(SkEvent* evt, const char title[]) {
35    SkASSERT(evt && TitleQ(*evt));
36    evt->setString(gTitleEvtName, title);
37}
38
39bool SampleCode::RequestTitle(SkView* view, SkString* title) {
40    SkEvent evt(gTitleEvtName);
41    if (view->doQuery(&evt)) {
42        title->set(evt.findString(gTitleEvtName));
43        return true;
44    }
45    return false;
46}
47
48SkViewRegister* SkViewRegister::gHead;
49SkViewRegister::SkViewRegister(SkViewFactory* fact) : fFact(fact) {
50    fFact->ref();
51    fChain = gHead;
52    gHead = this;
53}
54
55///////////////////////////////////////////////////////////////////////////////
56
57SkFuncViewFactory::SkFuncViewFactory(SkViewCreateFunc func)
58    : fCreateFunc(func) {
59}
60
61SkView* SkFuncViewFactory::operator() () const {
62    return (*fCreateFunc)();
63}
64
65SkViewRegister::SkViewRegister(SkViewCreateFunc func) {
66    fFact = new SkFuncViewFactory(func);
67    fChain = gHead;
68    gHead = this;
69}
70
71///////////////////////////////////////////////////////////////////////////////
72
73static const char is_sample_view_tag[] = "sample-is-sample-view";
74
75bool SampleView::IsSampleView(SkView* view) {
76    SkEvent evt(is_sample_view_tag);
77    return view->doQuery(&evt);
78}
79
80bool SampleView::onQuery(SkEvent* evt) {
81    if (evt->isType(is_sample_view_tag)) {
82        return true;
83    }
84    return this->INHERITED::onQuery(evt);
85}
86
87void SampleView::onDraw(SkCanvas* canvas) {
88    if (!fHaveCalledOnceBeforeDraw) {
89        fHaveCalledOnceBeforeDraw = true;
90        this->onOnceBeforeDraw();
91    }
92    this->onDrawBackground(canvas);
93
94    SkAutoCanvasRestore acr(canvas, true);
95    this->onDrawContent(canvas);
96#if SK_SUPPORT_GPU
97    // Ensure the GrContext doesn't combine GrDrawOps across draw loops.
98    if (GrContext* context = canvas->getGrContext()) {
99        context->flush();
100    }
101#endif
102}
103
104void SampleView::onDrawBackground(SkCanvas* canvas) {
105    canvas->drawColor(fBGColor);
106}
107
108