SampleArc.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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/SkColorFilter.h"
  9. #include "include/core/SkColorPriv.h"
  10. #include "include/core/SkDrawable.h"
  11. #include "include/core/SkPath.h"
  12. #include "include/core/SkPathMeasure.h"
  13. #include "include/core/SkPictureRecorder.h"
  14. #include "include/core/SkRegion.h"
  15. #include "include/core/SkShader.h"
  16. #include "include/core/SkString.h"
  17. #include "include/effects/Sk1DPathEffect.h"
  18. #include "include/effects/SkCornerPathEffect.h"
  19. #include "include/effects/SkGradientShader.h"
  20. #include "include/utils/SkRandom.h"
  21. #include "include/utils/SkTextUtils.h"
  22. #include "samplecode/Sample.h"
  23. #include "src/utils/SkUTF.h"
  24. #include "include/utils/SkParsePath.h"
  25. static void testparse() {
  26. SkRect r;
  27. r.set(0, 0, 10, 10.5f);
  28. SkPath p, p2;
  29. SkString str, str2;
  30. p.addRect(r);
  31. SkParsePath::ToSVGString(p, &str);
  32. SkParsePath::FromSVGString(str.c_str(), &p2);
  33. SkParsePath::ToSVGString(p2, &str2);
  34. }
  35. class ArcsView : public Sample {
  36. class MyDrawable : public SkDrawable {
  37. SkRect fR;
  38. SkScalar fSweep;
  39. public:
  40. MyDrawable(const SkRect& r) : fR(r), fSweep(0) {}
  41. void setSweep(SkScalar sweep) {
  42. if (fSweep != sweep) {
  43. fSweep = sweep;
  44. this->notifyDrawingChanged();
  45. }
  46. }
  47. void onDraw(SkCanvas* canvas) override {
  48. SkPaint paint;
  49. paint.setAntiAlias(true);
  50. paint.setStrokeWidth(SkIntToScalar(2));
  51. paint.setStyle(SkPaint::kFill_Style);
  52. paint.setColor(0x800000FF);
  53. canvas->drawArc(fR, 0, fSweep, true, paint);
  54. paint.setColor(0x800FF000);
  55. canvas->drawArc(fR, 0, fSweep, false, paint);
  56. paint.setStyle(SkPaint::kStroke_Style);
  57. paint.setColor(SK_ColorRED);
  58. canvas->drawArc(fR, 0, fSweep, true, paint);
  59. paint.setStrokeWidth(0);
  60. paint.setColor(SK_ColorBLUE);
  61. canvas->drawArc(fR, 0, fSweep, false, paint);
  62. }
  63. SkRect onGetBounds() override {
  64. SkRect r(fR);
  65. r.outset(2, 2);
  66. return r;
  67. }
  68. };
  69. SkRect fRect = {20, 20, 220, 220};
  70. sk_sp<MyDrawable> fAnimatingDrawable;
  71. sk_sp<SkDrawable> fRootDrawable;
  72. SkString name() override { return SkString("Arcs"); }
  73. static void DrawRectWithLines(SkCanvas* canvas, const SkRect& r, const SkPaint& p) {
  74. canvas->drawRect(r, p);
  75. canvas->drawLine(r.fLeft, r.fTop, r.fRight, r.fBottom, p);
  76. canvas->drawLine(r.fLeft, r.fBottom, r.fRight, r.fTop, p);
  77. canvas->drawLine(r.fLeft, r.centerY(), r.fRight, r.centerY(), p);
  78. canvas->drawLine(r.centerX(), r.fTop, r.centerX(), r.fBottom, p);
  79. }
  80. static void DrawLabel(SkCanvas* canvas, const SkRect& rect, SkScalar start, SkScalar sweep) {
  81. SkFont font;
  82. SkString str;
  83. str.appendScalar(start);
  84. str.append(", ");
  85. str.appendScalar(sweep);
  86. SkTextUtils::DrawString(canvas, str.c_str(), rect.centerX(),
  87. rect.fBottom + font.getSize() * 5/4, font, SkPaint(),
  88. SkTextUtils::kCenter_Align);
  89. }
  90. static void DrawArcs(SkCanvas* canvas) {
  91. SkPaint paint;
  92. SkRect r;
  93. SkScalar w = 75;
  94. SkScalar h = 50;
  95. r.set(0, 0, w, h);
  96. paint.setAntiAlias(true);
  97. paint.setStyle(SkPaint::kStroke_Style);
  98. canvas->save();
  99. canvas->translate(SkIntToScalar(10), SkIntToScalar(300));
  100. paint.setStrokeWidth(SkIntToScalar(1));
  101. static const SkScalar gAngles[] = {
  102. 0, 360,
  103. 0, 45,
  104. 0, -45,
  105. 720, 135,
  106. -90, 269,
  107. -90, 270,
  108. -90, 271,
  109. -180, -270,
  110. 225, 90
  111. };
  112. for (size_t i = 0; i < SK_ARRAY_COUNT(gAngles); i += 2) {
  113. paint.setColor(SK_ColorBLACK);
  114. DrawRectWithLines(canvas, r, paint);
  115. paint.setColor(SK_ColorRED);
  116. canvas->drawArc(r, gAngles[i], gAngles[i+1], false, paint);
  117. DrawLabel(canvas, r, gAngles[i], gAngles[i+1]);
  118. canvas->translate(w * 8 / 7, 0);
  119. }
  120. canvas->restore();
  121. }
  122. void drawRoot(SkCanvas* canvas) {
  123. SkPaint paint;
  124. paint.setAntiAlias(true);
  125. paint.setStrokeWidth(SkIntToScalar(2));
  126. paint.setStyle(SkPaint::kStroke_Style);
  127. DrawRectWithLines(canvas, fRect, paint);
  128. canvas->drawDrawable(fAnimatingDrawable.get());
  129. DrawArcs(canvas);
  130. }
  131. void onOnceBeforeDraw() override {
  132. testparse();
  133. this->setBGColor(0xFFDDDDDD);
  134. fAnimatingDrawable = sk_make_sp<MyDrawable>(fRect);
  135. SkPictureRecorder recorder;
  136. this->drawRoot(recorder.beginRecording(SkRect::MakeWH(800, 500)));
  137. fRootDrawable = recorder.finishRecordingAsDrawable();
  138. }
  139. void onDrawContent(SkCanvas* canvas) override {
  140. canvas->drawDrawable(fRootDrawable.get());
  141. }
  142. bool onAnimate(double nanos) override {
  143. SkScalar angle = SkDoubleToScalar(fmod(1e-9 * nanos * 360 / 24, 360));
  144. if (fAnimatingDrawable) {
  145. fAnimatingDrawable->setSweep(angle);
  146. }
  147. return true;
  148. }
  149. };
  150. DEF_SAMPLE( return new ArcsView(); )