blob: 9c9a20aa936cae8bb5e13a604638f01cd38ea8aa [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
Robert Phillips2af13c12021-09-01 16:47:01 +000010#if defined(SK_ENABLE_SVG)
Hal Canary0f666812018-03-22 15:21:12 -040011
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"
Robert Phillips2af13c12021-09-01 16:47:01 +000016#include "modules/svg/include/SkSVGNode.h"
Mike Kleinc0bd9f92019-04-23 12:05:21 -050017#include "samplecode/Sample.h"
18#include "src/core/SkOSFile.h"
19#include "src/utils/SkOSPath.h"
20#include "src/xml/SkDOM.h"
21#include "tools/Resources.h"
Jim Van Verth712fe732017-09-25 16:53:49 -040022
23namespace {
Hal Canaryd7639af2019-07-17 09:08:11 -040024class AnimatedSVGSample : public Sample {
Jim Van Verth712fe732017-09-25 16:53:49 -040025 static constexpr auto kAnimationIterations = 5;
Jim Van Verth712fe732017-09-25 16:53:49 -040026 enum State {
27 kZoomIn,
28 kScroll,
29 kZoomOut
30 };
Hal Canaryd7639af2019-07-17 09:08:11 -040031 sk_sp<SkSVGDOM> fDom;
32 const char* fResource = nullptr;
33 const char* fName = nullptr;
34 State fState = kZoomIn;
35 int fAnimationLoop = kAnimationIterations;
36 SkScalar fDelta = 1;
Ben Wagner63fd7602017-10-09 15:45:33 -040037
Hal Canaryd7639af2019-07-17 09:08:11 -040038public:
39 AnimatedSVGSample(const char* r, const char* n) : fResource(r), fName(n) {}
40
41private:
Jim Van Verth712fe732017-09-25 16:53:49 -040042 void onOnceBeforeDraw() override {
Hal Canaryd7639af2019-07-17 09:08:11 -040043 SkASSERT(fResource);
44 auto data = GetResourceAsData(fResource);
Mike Reed0933bc92017-12-09 01:27:41 +000045 if (!data) {
Hal Canaryd7639af2019-07-17 09:08:11 -040046 SkDebugf("Resource not found: \"%s\"\n", fResource);
Jim Van Verth712fe732017-09-25 16:53:49 -040047 return;
48 }
Mike Reed0933bc92017-12-09 01:27:41 +000049 SkMemoryStream svgStream(std::move(data));
Jim Van Verth712fe732017-09-25 16:53:49 -040050
Florin Malita7006e152020-11-10 15:24:59 -050051 fDom = SkSVGDOM::MakeFromStream(svgStream);
Jim Van Verth712fe732017-09-25 16:53:49 -040052 if (fDom) {
53 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
54 }
55 }
56
57 void onDrawContent(SkCanvas* canvas) override {
58 if (fDom) {
Mike Reed1f607332020-05-21 12:11:27 -040059 canvas->setMatrix(SkMatrix::Scale(3, 3));
Jim Van Verth712fe732017-09-25 16:53:49 -040060 canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400));
61 switch (fState) {
62 case kZoomIn:
63 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040064 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040065 break;
66 case kScroll:
67 if (fAnimationLoop > kAnimationIterations/2) {
68 fDelta += 80.f;
69 } else {
70 fDelta -= 80.f;
71 }
Mike Reed1f607332020-05-21 12:11:27 -040072 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040073 canvas->translate(fDelta, 0);
74 break;
75 case kZoomOut:
76 fDelta += 0.2f;
Mike Reed1f607332020-05-21 12:11:27 -040077 canvas->scale(fDelta, fDelta);
Jim Van Verth712fe732017-09-25 16:53:49 -040078 break;
79 }
Ben Wagner63fd7602017-10-09 15:45:33 -040080
Jim Van Verth712fe732017-09-25 16:53:49 -040081 fDom->render(canvas);
82 }
83 }
84
85 void onSizeChange() override {
86 if (fDom) {
87 fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
88 }
Jim Van Verth712fe732017-09-25 16:53:49 -040089 }
90
Hal Canaryd7639af2019-07-17 09:08:11 -040091 SkString name() override { return SkASSERT(fName), SkString(fName); }
Ben Wagner63fd7602017-10-09 15:45:33 -040092
Hal Canary41248072019-07-11 16:32:53 -040093 bool onAnimate(double nanos) override {
Jim Van Verth712fe732017-09-25 16:53:49 -040094 if (!fDom) {
95 return false;
96 }
Ben Wagner63fd7602017-10-09 15:45:33 -040097
Jim Van Verth712fe732017-09-25 16:53:49 -040098 --fAnimationLoop;
99 if (fAnimationLoop == 0) {
100 fAnimationLoop = kAnimationIterations;
101 switch (fState) {
102 case kZoomIn:
103 fState = kScroll;
104 fDelta = 0;
105 break;
106 case kScroll:
107 fState = kZoomOut;
108 fDelta = 2;
109 break;
110 case kZoomOut:
111 fState = kZoomIn;
112 fDelta = 1;
113 break;
114 }
115 }
116 return true;
117 }
Jim Van Verth712fe732017-09-25 16:53:49 -0400118};
Hal Canaryd7639af2019-07-17 09:08:11 -0400119} // namespace
Jim Van Verth712fe732017-09-25 16:53:49 -0400120
Hal Canaryd7639af2019-07-17 09:08:11 -0400121DEF_SAMPLE( return new AnimatedSVGSample("Cowboy.svg", "SampleCowboy"); )
Jim Van Verth712fe732017-09-25 16:53:49 -0400122
Robert Phillips2af13c12021-09-01 16:47:01 +0000123#endif // defined(SK_ENABLE_SVG)