blob: 492550891ac5126a76a5104c247c8fe8e8eca70f [file] [log] [blame]
Jim Van Verth712fe732017-09-25 16:53:49 -04001/*
2 * Copyright 2017 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
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "include/core/SkTypes.h"
Hal Canary0f666812018-03-22 15:21:12 -04009
10#ifdef SK_XML
11
Robert Phillipsd6cf56f2020-10-15 18:54:12 +000012#include "experimental/svg/model/SkSVGDOM.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050013#include "include/core/SkCanvas.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkStream.h"
16#include "samplecode/Sample.h"
17#include "src/core/SkOSFile.h"
18#include "src/utils/SkOSPath.h"
19#include "src/xml/SkDOM.h"
20#include "tools/Resources.h"
Jim Van Verth712fe732017-09-25 16:53:49 -040021
22namespace {
Hal Canaryd7639af2019-07-17 09:08:11 -040023class AnimatedSVGSample : public Sample {
Jim Van Verth712fe732017-09-25 16:53:49 -040024 static constexpr auto kAnimationIterations = 5;
Jim Van Verth712fe732017-09-25 16:53:49 -040025 enum State {
26 kZoomIn,
27 kScroll,
28 kZoomOut
29 };
Hal Canaryd7639af2019-07-17 09:08:11 -040030 sk_sp<SkSVGDOM> fDom;
31 const char* fResource = nullptr;
32 const char* fName = nullptr;
33 State fState = kZoomIn;
34 int fAnimationLoop = kAnimationIterations;
35 SkScalar fDelta = 1;
Ben Wagner63fd7602017-10-09 15:45:33 -040036
Hal Canaryd7639af2019-07-17 09:08:11 -040037public:
38 AnimatedSVGSample(const char* r, const char* n) : fResource(r), fName(n) {}
39
40private:
Jim Van Verth712fe732017-09-25 16:53:49 -040041 void onOnceBeforeDraw() override {
Hal Canaryd7639af2019-07-17 09:08:11 -040042 SkASSERT(fResource);
43 auto data = GetResourceAsData(fResource);
Mike Reed0933bc92017-12-09 01:27:41 +000044 if (!data) {
Hal Canaryd7639af2019-07-17 09:08:11 -040045 SkDebugf("Resource not found: \"%s\"\n", fResource);
Jim Van Verth712fe732017-09-25 16:53:49 -040046 return;
47 }
Mike Reed0933bc92017-12-09 01:27:41 +000048 SkMemoryStream svgStream(std::move(data));
Jim Van Verth712fe732017-09-25 16:53:49 -040049
50 SkDOM xmlDom;
51 if (!xmlDom.build(svgStream)) {
Hal Canaryd7639af2019-07-17 09:08:11 -040052 SkDebugf("XML parsing failed: \"%s\"\n", fResource);
Jim Van Verth712fe732017-09-25 16:53:49 -040053 return;
54 }
55
56 fDom = SkSVGDOM::MakeFromDOM(xmlDom);
57 if (fDom) {
58 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
59 }
60 }
61
62 void onDrawContent(SkCanvas* canvas) override {
63 if (fDom) {
Mike Reed1f607332020-05-21 12:11:27 -040064 canvas->setMatrix(SkMatrix::Scale(3, 3));
Jim Van Verth712fe732017-09-25 16:53:49 -040065 canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400));
66 switch (fState) {
67 case kZoomIn:
68 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040069 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040070 break;
71 case kScroll:
72 if (fAnimationLoop > kAnimationIterations/2) {
73 fDelta += 80.f;
74 } else {
75 fDelta -= 80.f;
76 }
Mike Reed1f607332020-05-21 12:11:27 -040077 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040078 canvas->translate(fDelta, 0);
79 break;
80 case kZoomOut:
81 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040082 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040083 break;
84 }
Ben Wagner63fd7602017-10-09 15:45:33 -040085
Jim Van Verth712fe732017-09-25 16:53:49 -040086 fDom->render(canvas);
87 }
88 }
89
90 void onSizeChange() override {
91 if (fDom) {
92 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
93 }
Jim Van Verth712fe732017-09-25 16:53:49 -040094 }
95
Hal Canaryd7639af2019-07-17 09:08:11 -040096 SkString name() override { return SkASSERT(fName), SkString(fName); }
Ben Wagner63fd7602017-10-09 15:45:33 -040097
Hal Canary41248072019-07-11 16:32:53 -040098 bool onAnimate(double nanos) override {
Jim Van Verth712fe732017-09-25 16:53:49 -040099 if (!fDom) {
100 return false;
101 }
Ben Wagner63fd7602017-10-09 15:45:33 -0400102
Jim Van Verth712fe732017-09-25 16:53:49 -0400103 --fAnimationLoop;
104 if (fAnimationLoop == 0) {
105 fAnimationLoop = kAnimationIterations;
106 switch (fState) {
107 case kZoomIn:
108 fState = kScroll;
109 fDelta = 0;
110 break;
111 case kScroll:
112 fState = kZoomOut;
113 fDelta = 2;
114 break;
115 case kZoomOut:
116 fState = kZoomIn;
117 fDelta = 1;
118 break;
119 }
120 }
121 return true;
122 }
Jim Van Verth712fe732017-09-25 16:53:49 -0400123};
Hal Canaryd7639af2019-07-17 09:08:11 -0400124} // namespace
Jim Van Verth712fe732017-09-25 16:53:49 -0400125
Hal Canaryd7639af2019-07-17 09:08:11 -0400126DEF_SAMPLE( return new AnimatedSVGSample("Cowboy.svg", "SampleCowboy"); )
Jim Van Verth712fe732017-09-25 16:53:49 -0400127
Hal Canary0f666812018-03-22 15:21:12 -0400128#endif // SK_XML