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