SampleCowboy.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  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. #include "include/core/SkTypes.h"
  8. #ifdef SK_XML
  9. #include "experimental/svg/model/SkSVGDOM.h"
  10. #include "include/core/SkCanvas.h"
  11. #include "include/core/SkRect.h"
  12. #include "include/core/SkStream.h"
  13. #include "samplecode/Sample.h"
  14. #include "src/core/SkOSFile.h"
  15. #include "src/utils/SkOSPath.h"
  16. #include "src/xml/SkDOM.h"
  17. #include "tools/Resources.h"
  18. namespace {
  19. class AnimatedSVGSample : public Sample {
  20. static constexpr auto kAnimationIterations = 5;
  21. enum State {
  22. kZoomIn,
  23. kScroll,
  24. kZoomOut
  25. };
  26. sk_sp<SkSVGDOM> fDom;
  27. const char* fResource = nullptr;
  28. const char* fName = nullptr;
  29. State fState = kZoomIn;
  30. int fAnimationLoop = kAnimationIterations;
  31. SkScalar fDelta = 1;
  32. public:
  33. AnimatedSVGSample(const char* r, const char* n) : fResource(r), fName(n) {}
  34. private:
  35. void onOnceBeforeDraw() override {
  36. SkASSERT(fResource);
  37. auto data = GetResourceAsData(fResource);
  38. if (!data) {
  39. SkDebugf("Resource not found: \"%s\"\n", fResource);
  40. return;
  41. }
  42. SkMemoryStream svgStream(std::move(data));
  43. SkDOM xmlDom;
  44. if (!xmlDom.build(svgStream)) {
  45. SkDebugf("XML parsing failed: \"%s\"\n", fResource);
  46. return;
  47. }
  48. fDom = SkSVGDOM::MakeFromDOM(xmlDom);
  49. if (fDom) {
  50. fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
  51. }
  52. }
  53. void onDrawContent(SkCanvas* canvas) override {
  54. if (fDom) {
  55. canvas->setMatrix(SkMatrix::MakeScale(3));
  56. canvas->clipRect(SkRect::MakeLTRB(0, 0, 400, 400));
  57. switch (fState) {
  58. case kZoomIn:
  59. fDelta += 0.2f;
  60. canvas->concat(SkMatrix::MakeScale(fDelta));
  61. break;
  62. case kScroll:
  63. if (fAnimationLoop > kAnimationIterations/2) {
  64. fDelta += 80.f;
  65. } else {
  66. fDelta -= 80.f;
  67. }
  68. canvas->concat(SkMatrix::MakeScale(fDelta));
  69. canvas->translate(fDelta, 0);
  70. break;
  71. case kZoomOut:
  72. fDelta += 0.2f;
  73. canvas->concat(SkMatrix::MakeScale(fDelta));
  74. break;
  75. }
  76. fDom->render(canvas);
  77. }
  78. }
  79. void onSizeChange() override {
  80. if (fDom) {
  81. fDom->setContainerSize(SkSize::Make(this->width(), this->height()));
  82. }
  83. }
  84. SkString name() override { return SkASSERT(fName), SkString(fName); }
  85. bool onAnimate(double nanos) override {
  86. if (!fDom) {
  87. return false;
  88. }
  89. --fAnimationLoop;
  90. if (fAnimationLoop == 0) {
  91. fAnimationLoop = kAnimationIterations;
  92. switch (fState) {
  93. case kZoomIn:
  94. fState = kScroll;
  95. fDelta = 0;
  96. break;
  97. case kScroll:
  98. fState = kZoomOut;
  99. fDelta = 2;
  100. break;
  101. case kZoomOut:
  102. fState = kZoomIn;
  103. fDelta = 1;
  104. break;
  105. }
  106. }
  107. return true;
  108. }
  109. };
  110. } // namespace
  111. DEF_SAMPLE( return new AnimatedSVGSample("Cowboy.svg", "SampleCowboy"); )
  112. #endif // SK_XML