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