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