1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2017 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SampleCode.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "Resources.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkDOM.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOSFile.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkOSPath.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkStream.h" 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkSVGDOM.h" 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkView.h" 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass CowboyView : public SampleView { 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot CowboyView() 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : fLabel("SampleCowboy") 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fState(kZoomIn) 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fAnimationLoop(kAnimationIterations) 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot , fDelta(1) {} 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ~CowboyView() override = default; 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr auto kAnimationIterations = 5; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot enum State { 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kZoomIn, 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kScroll, 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kZoomOut 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr char path[] = "Cowboy.svg"; 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot auto data = GetResourceAsData(path); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!data) { 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("file not found: \"%s\"\n", path); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkMemoryStream svgStream(std::move(data)); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDOM xmlDom; 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!xmlDom.build(svgStream)) { 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkDebugf("XML parsing failed: \"path\"\n", fPath.c_str()); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return; 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDom = SkSVGDOM::MakeFromDOM(xmlDom); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDom) { 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDom->setContainerSize(SkSize::Make(this->width(), this->height())); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDrawContent(SkCanvas* canvas) override { 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDom) { 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->setMatrix(SkMatrix::MakeScale(3)); 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400)); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fState) { 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kZoomIn: 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta += 0.2f; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->concat(SkMatrix::MakeScale(fDelta)); 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kScroll: 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fAnimationLoop > kAnimationIterations/2) { 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta += 80.f; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta -= 80.f; 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->concat(SkMatrix::MakeScale(fDelta)); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(fDelta, 0); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kZoomOut: 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta += 0.2f; 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->concat(SkMatrix::MakeScale(fDelta)); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDom->render(canvas); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onSizeChange() override { 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fDom) { 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDom->setContainerSize(SkSize::Make(this->width(), this->height())); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->INHERITED::onSizeChange(); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onQuery(SkEvent* evt) override { 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (SampleCode::TitleQ(*evt)) { 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SampleCode::TitleR(evt, fLabel.c_str()); 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return this->INHERITED::onQuery(evt); 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bool onAnimate(const SkAnimTimer& timer) override { 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (!fDom) { 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return false; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot --fAnimationLoop; 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (fAnimationLoop == 0) { 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fAnimationLoop = kAnimationIterations; 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch (fState) { 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kZoomIn: 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fState = kScroll; 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta = 0; 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kScroll: 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fState = kZoomOut; 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta = 2; 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case kZoomOut: 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fState = kZoomIn; 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fDelta = 1; 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return true; 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sk_sp<SkSVGDOM> fDom; 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fPath; 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString fLabel; 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot State fState; 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int fAnimationLoop; 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar fDelta; 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef SampleView INHERITED; 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} // anonymous namespace 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_SAMPLE( return new CowboyView(); ) 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 146