SampleClip.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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/SkFont.h"
  10. #include "include/core/SkPaint.h"
  11. #include "include/core/SkPath.h"
  12. #include "include/utils/SkRandom.h"
  13. #include "samplecode/Sample.h"
  14. #include "src/core/SkClipOpPriv.h"
  15. constexpr int W = 150;
  16. constexpr int H = 200;
  17. static void show_text(SkCanvas* canvas, bool doAA) {
  18. SkRandom rand;
  19. SkPaint paint;
  20. SkFont font(nullptr, 20);
  21. font.setEdging(doAA ? SkFont::Edging::kSubpixelAntiAlias : SkFont::Edging::kAlias);
  22. for (int i = 0; i < 200; ++i) {
  23. paint.setColor((SK_A32_MASK << SK_A32_SHIFT) | rand.nextU());
  24. canvas->drawString("Hamburgefons", rand.nextSScalar1() * W, rand.nextSScalar1() * H + 20,
  25. font, paint);
  26. }
  27. }
  28. static void show_fill(SkCanvas* canvas, bool doAA) {
  29. SkRandom rand;
  30. SkPaint paint;
  31. paint.setAntiAlias(doAA);
  32. for (int i = 0; i < 50; ++i) {
  33. SkRect r;
  34. SkPath p;
  35. r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
  36. rand.nextUScalar1() * W, rand.nextUScalar1() * H);
  37. paint.setColor(rand.nextU());
  38. canvas->drawRect(r, paint);
  39. r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
  40. rand.nextUScalar1() * W, rand.nextUScalar1() * H);
  41. paint.setColor(rand.nextU());
  42. p.addOval(r);
  43. canvas->drawPath(p, paint);
  44. }
  45. }
  46. static SkScalar randRange(SkRandom& rand, SkScalar min, SkScalar max) {
  47. SkASSERT(min <= max);
  48. return min + rand.nextUScalar1() * (max - min);
  49. }
  50. static void show_stroke(SkCanvas* canvas, bool doAA, SkScalar strokeWidth, int n) {
  51. SkRandom rand;
  52. SkPaint paint;
  53. paint.setAntiAlias(doAA);
  54. paint.setStyle(SkPaint::kStroke_Style);
  55. paint.setStrokeWidth(strokeWidth);
  56. for (int i = 0; i < n; ++i) {
  57. SkRect r;
  58. SkPath p;
  59. r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
  60. rand.nextUScalar1() * W, rand.nextUScalar1() * H);
  61. paint.setColor(rand.nextU());
  62. canvas->drawRect(r, paint);
  63. r.setXYWH(rand.nextSScalar1() * W, rand.nextSScalar1() * H,
  64. rand.nextUScalar1() * W, rand.nextUScalar1() * H);
  65. paint.setColor(rand.nextU());
  66. p.addOval(r);
  67. canvas->drawPath(p, paint);
  68. const SkScalar minx = -SkIntToScalar(W)/4;
  69. const SkScalar maxx = 5*SkIntToScalar(W)/4;
  70. const SkScalar miny = -SkIntToScalar(H)/4;
  71. const SkScalar maxy = 5*SkIntToScalar(H)/4;
  72. paint.setColor(rand.nextU());
  73. canvas->drawLine(randRange(rand, minx, maxx), randRange(rand, miny, maxy),
  74. randRange(rand, minx, maxx), randRange(rand, miny, maxy),
  75. paint);
  76. }
  77. }
  78. static void show_hair(SkCanvas* canvas, bool doAA) {
  79. show_stroke(canvas, doAA, 0, 150);
  80. }
  81. static void show_thick(SkCanvas* canvas, bool doAA) {
  82. show_stroke(canvas, doAA, SkIntToScalar(5), 50);
  83. }
  84. typedef void (*CanvasProc)(SkCanvas*, bool);
  85. class ClipView : public Sample {
  86. SkString name() override { return SkString("Clip"); }
  87. void onDrawContent(SkCanvas* canvas) override {
  88. canvas->drawColor(SK_ColorWHITE);
  89. canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
  90. static const CanvasProc gProc[] = {
  91. show_text, show_thick, show_hair, show_fill
  92. };
  93. SkRect r = { 0, 0, SkIntToScalar(W), SkIntToScalar(H) };
  94. SkPath clipPath;
  95. r.inset(SK_Scalar1 / 4, SK_Scalar1 / 4);
  96. clipPath.addRoundRect(r, SkIntToScalar(20), SkIntToScalar(20));
  97. // clipPath.toggleInverseFillType();
  98. for (int aa = 0; aa <= 1; ++aa) {
  99. canvas->save();
  100. for (size_t i = 0; i < SK_ARRAY_COUNT(gProc); ++i) {
  101. canvas->save();
  102. canvas->clipPath(clipPath, kIntersect_SkClipOp, SkToBool(aa));
  103. // canvas->drawColor(SK_ColorWHITE);
  104. gProc[i](canvas, SkToBool(aa));
  105. canvas->restore();
  106. canvas->translate(W * SK_Scalar1 * 8 / 7, 0);
  107. }
  108. canvas->restore();
  109. canvas->translate(0, H * SK_Scalar1 * 8 / 7);
  110. }
  111. }
  112. };
  113. DEF_SAMPLE( return new ClipView(); )