SamplePathEffects.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. /*
  2. * Copyright 2011 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/SkCanvas.h"
  8. #include "include/core/SkColorPriv.h"
  9. #include "include/core/SkPath.h"
  10. #include "include/core/SkPathMeasure.h"
  11. #include "include/core/SkRegion.h"
  12. #include "include/core/SkShader.h"
  13. #include "include/effects/Sk1DPathEffect.h"
  14. #include "include/effects/SkCornerPathEffect.h"
  15. #include "include/effects/SkGradientShader.h"
  16. #include "include/utils/SkRandom.h"
  17. #include "samplecode/Sample.h"
  18. #include "src/utils/SkUTF.h"
  19. #include "tools/timer/TimeUtils.h"
  20. #define CORNER_RADIUS 12
  21. static const int gXY[] = {
  22. 4, 0, 0, -4, 8, -4, 12, 0, 8, 4, 0, 4
  23. };
  24. static sk_sp<SkPathEffect> make_pe(int flags, SkScalar phase) {
  25. if (flags == 1) {
  26. return SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS));
  27. }
  28. SkPath path;
  29. path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
  30. for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2)
  31. path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
  32. path.close();
  33. path.offset(SkIntToScalar(-6), 0);
  34. auto outer = SkPath1DPathEffect::Make(path, 12, phase, SkPath1DPathEffect::kRotate_Style);
  35. if (flags == 2)
  36. return outer;
  37. auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS));
  38. return SkPathEffect::MakeCompose(outer, inner);
  39. }
  40. static sk_sp<SkPathEffect> make_warp_pe(SkScalar phase) {
  41. SkPath path;
  42. path.moveTo(SkIntToScalar(gXY[0]), SkIntToScalar(gXY[1]));
  43. for (unsigned i = 2; i < SK_ARRAY_COUNT(gXY); i += 2) {
  44. path.lineTo(SkIntToScalar(gXY[i]), SkIntToScalar(gXY[i+1]));
  45. }
  46. path.close();
  47. path.offset(SkIntToScalar(-6), 0);
  48. auto outer = SkPath1DPathEffect::Make(
  49. path, 12, phase, SkPath1DPathEffect::kMorph_Style);
  50. auto inner = SkCornerPathEffect::Make(SkIntToScalar(CORNER_RADIUS));
  51. return SkPathEffect::MakeCompose(outer, inner);
  52. }
  53. ///////////////////////////////////////////////////////////
  54. #include "include/core/SkColorFilter.h"
  55. class PathEffectView : public Sample {
  56. SkPath fPath;
  57. SkPoint fClickPt;
  58. SkScalar fPhase;
  59. public:
  60. PathEffectView() : fPhase(0) {
  61. }
  62. protected:
  63. void onOnceBeforeDraw() override {
  64. SkRandom rand;
  65. int steps = 20;
  66. SkScalar dist = SkIntToScalar(400);
  67. SkScalar x = SkIntToScalar(20);
  68. SkScalar y = SkIntToScalar(50);
  69. fPath.moveTo(x, y);
  70. for (int i = 0; i < steps; i++) {
  71. x += dist/steps;
  72. SkScalar tmpY = y + SkIntToScalar(rand.nextS() % 25);
  73. if (i == steps/2) {
  74. fPath.moveTo(x, tmpY);
  75. } else {
  76. fPath.lineTo(x, tmpY);
  77. }
  78. }
  79. {
  80. SkRect oval;
  81. oval.set(SkIntToScalar(20), SkIntToScalar(30),
  82. SkIntToScalar(100), SkIntToScalar(60));
  83. oval.offset(x, 0);
  84. fPath.addRoundRect(oval, SkIntToScalar(8), SkIntToScalar(8));
  85. }
  86. fClickPt.set(SkIntToScalar(200), SkIntToScalar(200));
  87. this->setBGColor(0xFFDDDDDD);
  88. }
  89. SkString name() override { return SkString("PathEffects"); }
  90. void onDrawContent(SkCanvas* canvas) override {
  91. SkPaint paint;
  92. canvas->translate(0, 50);
  93. paint.setColor(SK_ColorBLUE);
  94. paint.setPathEffect(make_pe(2, fPhase));
  95. canvas->drawPath(fPath, paint);
  96. canvas->translate(0, 50);
  97. paint.setARGB(0xFF, 0, 0xBB, 0);
  98. paint.setPathEffect(make_pe(3, fPhase));
  99. canvas->drawPath(fPath, paint);
  100. canvas->translate(0, 50);
  101. paint.setARGB(0xFF, 0, 0, 0);
  102. paint.setPathEffect(make_warp_pe(fPhase));
  103. canvas->drawPath(fPath, paint);
  104. }
  105. bool onAnimate(double nanos) override {
  106. fPhase = TimeUtils::Scaled(1e-9 * nanos, 40);
  107. return true;
  108. }
  109. private:
  110. typedef Sample INHERITED;
  111. };
  112. //////////////////////////////////////////////////////////////////////////////
  113. DEF_SAMPLE( return new PathEffectView(); )