1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2017 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_ENABLE_SVG) 11*c8dee2aaSAndroid Build Coastguard Worker 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkStream.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "modules/skshaper/utils/FactoryHelpers.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGDOM.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGNode.h" 18*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkOSFile.h" 19*c8dee2aaSAndroid Build Coastguard Worker #include "src/utils/SkOSPath.h" 20*c8dee2aaSAndroid Build Coastguard Worker #include "src/xml/SkDOM.h" 21*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 22*c8dee2aaSAndroid Build Coastguard Worker #include "tools/fonts/FontToolUtils.h" 23*c8dee2aaSAndroid Build Coastguard Worker #include "tools/viewer/Slide.h" 24*c8dee2aaSAndroid Build Coastguard Worker 25*c8dee2aaSAndroid Build Coastguard Worker namespace { 26*c8dee2aaSAndroid Build Coastguard Worker class AnimatedSVGSlide : public Slide { 27*c8dee2aaSAndroid Build Coastguard Worker inline static constexpr auto kAnimationIterations = 5; 28*c8dee2aaSAndroid Build Coastguard Worker enum State { 29*c8dee2aaSAndroid Build Coastguard Worker kZoomIn, 30*c8dee2aaSAndroid Build Coastguard Worker kScroll, 31*c8dee2aaSAndroid Build Coastguard Worker kZoomOut 32*c8dee2aaSAndroid Build Coastguard Worker }; 33*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSVGDOM> fDom; 34*c8dee2aaSAndroid Build Coastguard Worker const char* fResource = nullptr; 35*c8dee2aaSAndroid Build Coastguard Worker State fState = kZoomIn; 36*c8dee2aaSAndroid Build Coastguard Worker int fAnimationLoop = kAnimationIterations; 37*c8dee2aaSAndroid Build Coastguard Worker SkScalar fDelta = 1; 38*c8dee2aaSAndroid Build Coastguard Worker 39*c8dee2aaSAndroid Build Coastguard Worker public: AnimatedSVGSlide(const char * r,const char * n)40*c8dee2aaSAndroid Build Coastguard Worker AnimatedSVGSlide(const char* r, const char* n) : fResource(r) { fName = n; } 41*c8dee2aaSAndroid Build Coastguard Worker load(SkScalar w,SkScalar h)42*c8dee2aaSAndroid Build Coastguard Worker void load(SkScalar w, SkScalar h) override { 43*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(fResource); 44*c8dee2aaSAndroid Build Coastguard Worker auto data = GetResourceAsData(fResource); 45*c8dee2aaSAndroid Build Coastguard Worker if (!data) { 46*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("Resource not found: \"%s\"\n", fResource); 47*c8dee2aaSAndroid Build Coastguard Worker return; 48*c8dee2aaSAndroid Build Coastguard Worker } 49*c8dee2aaSAndroid Build Coastguard Worker SkMemoryStream svgStream(std::move(data)); 50*c8dee2aaSAndroid Build Coastguard Worker 51*c8dee2aaSAndroid Build Coastguard Worker fDom = SkSVGDOM::Builder() 52*c8dee2aaSAndroid Build Coastguard Worker .setFontManager(ToolUtils::TestFontMgr()) 53*c8dee2aaSAndroid Build Coastguard Worker .setTextShapingFactory(SkShapers::BestAvailable()) 54*c8dee2aaSAndroid Build Coastguard Worker .make(svgStream); 55*c8dee2aaSAndroid Build Coastguard Worker if (fDom) { 56*c8dee2aaSAndroid Build Coastguard Worker fDom->setContainerSize(SkSize::Make(w, h)); 57*c8dee2aaSAndroid Build Coastguard Worker } 58*c8dee2aaSAndroid Build Coastguard Worker } 59*c8dee2aaSAndroid Build Coastguard Worker draw(SkCanvas * canvas)60*c8dee2aaSAndroid Build Coastguard Worker void draw(SkCanvas* canvas) override { 61*c8dee2aaSAndroid Build Coastguard Worker if (fDom) { 62*c8dee2aaSAndroid Build Coastguard Worker canvas->setMatrix(SkMatrix::Scale(3, 3)); 63*c8dee2aaSAndroid Build Coastguard Worker canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400)); 64*c8dee2aaSAndroid Build Coastguard Worker switch (fState) { 65*c8dee2aaSAndroid Build Coastguard Worker case kZoomIn: 66*c8dee2aaSAndroid Build Coastguard Worker fDelta += 0.2f; 67*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(fDelta, fDelta); 68*c8dee2aaSAndroid Build Coastguard Worker break; 69*c8dee2aaSAndroid Build Coastguard Worker case kScroll: 70*c8dee2aaSAndroid Build Coastguard Worker if (fAnimationLoop > kAnimationIterations/2) { 71*c8dee2aaSAndroid Build Coastguard Worker fDelta += 80.f; 72*c8dee2aaSAndroid Build Coastguard Worker } else { 73*c8dee2aaSAndroid Build Coastguard Worker fDelta -= 80.f; 74*c8dee2aaSAndroid Build Coastguard Worker } 75*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(fDelta, fDelta); 76*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(fDelta, 0); 77*c8dee2aaSAndroid Build Coastguard Worker break; 78*c8dee2aaSAndroid Build Coastguard Worker case kZoomOut: 79*c8dee2aaSAndroid Build Coastguard Worker fDelta += 0.2f; 80*c8dee2aaSAndroid Build Coastguard Worker canvas->scale(fDelta, fDelta); 81*c8dee2aaSAndroid Build Coastguard Worker break; 82*c8dee2aaSAndroid Build Coastguard Worker } 83*c8dee2aaSAndroid Build Coastguard Worker 84*c8dee2aaSAndroid Build Coastguard Worker fDom->render(canvas); 85*c8dee2aaSAndroid Build Coastguard Worker } 86*c8dee2aaSAndroid Build Coastguard Worker } 87*c8dee2aaSAndroid Build Coastguard Worker resize(SkScalar w,SkScalar h)88*c8dee2aaSAndroid Build Coastguard Worker void resize(SkScalar w, SkScalar h) override { 89*c8dee2aaSAndroid Build Coastguard Worker if (fDom) { 90*c8dee2aaSAndroid Build Coastguard Worker fDom->setContainerSize(SkSize::Make(w, h)); 91*c8dee2aaSAndroid Build Coastguard Worker } 92*c8dee2aaSAndroid Build Coastguard Worker } 93*c8dee2aaSAndroid Build Coastguard Worker animate(double nanos)94*c8dee2aaSAndroid Build Coastguard Worker bool animate(double nanos) override { 95*c8dee2aaSAndroid Build Coastguard Worker if (!fDom) { 96*c8dee2aaSAndroid Build Coastguard Worker return false; 97*c8dee2aaSAndroid Build Coastguard Worker } 98*c8dee2aaSAndroid Build Coastguard Worker 99*c8dee2aaSAndroid Build Coastguard Worker --fAnimationLoop; 100*c8dee2aaSAndroid Build Coastguard Worker if (fAnimationLoop == 0) { 101*c8dee2aaSAndroid Build Coastguard Worker fAnimationLoop = kAnimationIterations; 102*c8dee2aaSAndroid Build Coastguard Worker switch (fState) { 103*c8dee2aaSAndroid Build Coastguard Worker case kZoomIn: 104*c8dee2aaSAndroid Build Coastguard Worker fState = kScroll; 105*c8dee2aaSAndroid Build Coastguard Worker fDelta = 0; 106*c8dee2aaSAndroid Build Coastguard Worker break; 107*c8dee2aaSAndroid Build Coastguard Worker case kScroll: 108*c8dee2aaSAndroid Build Coastguard Worker fState = kZoomOut; 109*c8dee2aaSAndroid Build Coastguard Worker fDelta = 2; 110*c8dee2aaSAndroid Build Coastguard Worker break; 111*c8dee2aaSAndroid Build Coastguard Worker case kZoomOut: 112*c8dee2aaSAndroid Build Coastguard Worker fState = kZoomIn; 113*c8dee2aaSAndroid Build Coastguard Worker fDelta = 1; 114*c8dee2aaSAndroid Build Coastguard Worker break; 115*c8dee2aaSAndroid Build Coastguard Worker } 116*c8dee2aaSAndroid Build Coastguard Worker } 117*c8dee2aaSAndroid Build Coastguard Worker return true; 118*c8dee2aaSAndroid Build Coastguard Worker } 119*c8dee2aaSAndroid Build Coastguard Worker }; 120*c8dee2aaSAndroid Build Coastguard Worker } // namespace 121*c8dee2aaSAndroid Build Coastguard Worker 122*c8dee2aaSAndroid Build Coastguard Worker DEF_SLIDE( return new AnimatedSVGSlide("Cowboy.svg", "SampleCowboy"); ) 123*c8dee2aaSAndroid Build Coastguard Worker 124*c8dee2aaSAndroid Build Coastguard Worker #endif // defined(SK_ENABLE_SVG) 125