blob: 62a72f28cebe8df6014bf4ebc6f5e8de64f1d72f [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
Mike Kleinc0bd9f92019-04-23 12:05:21 -050012#include "include/core/SkCanvas.h"
13#include "include/core/SkRect.h"
14#include "include/core/SkStream.h"
Florin Malitab3418102020-10-15 18:10:29 -040015#include "modules/svg/include/SkSVGDOM.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050016#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
Florin Malita7006e152020-11-10 15:24:59 -050050 fDom = SkSVGDOM::MakeFromStream(svgStream);
Jim Van Verth712fe732017-09-25 16:53:49 -040051 if (fDom) {
52 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
53 }
54 }
55
56 void onDrawContent(SkCanvas* canvas) override {
57 if (fDom) {
Mike Reed1f607332020-05-21 12:11:27 -040058 canvas->setMatrix(SkMatrix::Scale(3, 3));
Jim Van Verth712fe732017-09-25 16:53:49 -040059 canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400));
60 switch (fState) {
61 case kZoomIn:
62 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040063 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040064 break;
65 case kScroll:
66 if (fAnimationLoop > kAnimationIterations/2) {
67 fDelta += 80.f;
68 } else {
69 fDelta -= 80.f;
70 }
Mike Reed1f607332020-05-21 12:11:27 -040071 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040072 canvas->translate(fDelta, 0);
73 break;
74 case kZoomOut:
75 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040076 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040077 break;
78 }
Ben Wagner63fd7602017-10-09 15:45:33 -040079
Jim Van Verth712fe732017-09-25 16:53:49 -040080 fDom->render(canvas);
81 }
82 }
83
84 void onSizeChange() override {
85 if (fDom) {
86 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
87 }
Jim Van Verth712fe732017-09-25 16:53:49 -040088 }
89
Hal Canaryd7639af2019-07-17 09:08:11 -040090 SkString name() override { return SkASSERT(fName), SkString(fName); }
Ben Wagner63fd7602017-10-09 15:45:33 -040091
Hal Canary41248072019-07-11 16:32:53 -040092 bool onAnimate(double nanos) override {
Jim Van Verth712fe732017-09-25 16:53:49 -040093 if (!fDom) {
94 return false;
95 }
Ben Wagner63fd7602017-10-09 15:45:33 -040096
Jim Van Verth712fe732017-09-25 16:53:49 -040097 --fAnimationLoop;
98 if (fAnimationLoop == 0) {
99 fAnimationLoop = kAnimationIterations;
100 switch (fState) {
101 case kZoomIn:
102 fState = kScroll;
103 fDelta = 0;
104 break;
105 case kScroll:
106 fState = kZoomOut;
107 fDelta = 2;
108 break;
109 case kZoomOut:
110 fState = kZoomIn;
111 fDelta = 1;
112 break;
113 }
114 }
115 return true;
116 }
Jim Van Verth712fe732017-09-25 16:53:49 -0400117};
Hal Canaryd7639af2019-07-17 09:08:11 -0400118} // namespace
Jim Van Verth712fe732017-09-25 16:53:49 -0400119
Hal Canaryd7639af2019-07-17 09:08:11 -0400120DEF_SAMPLE( return new AnimatedSVGSample("Cowboy.svg", "SampleCowboy"); )
Jim Van Verth712fe732017-09-25 16:53:49 -0400121
Hal Canary0f666812018-03-22 15:21:12 -0400122#endif // SK_XML