SampleComplexClip.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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/SkFont.h"
  9. #include "include/core/SkPath.h"
  10. #include "samplecode/Sample.h"
  11. #include "src/core/SkClipOpPriv.h"
  12. class ComplexClipView : public Sample {
  13. void onOnceBeforeDraw() override {
  14. this->setBGColor(0xFFA0DDA0);
  15. }
  16. SkString name() override { return SkString("ComplexClip"); }
  17. void onDrawContent(SkCanvas* canvas) override {
  18. SkPath path;
  19. path.moveTo(SkIntToScalar(0), SkIntToScalar(50));
  20. path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0));
  21. path.lineTo(SkIntToScalar(175), SkIntToScalar(0));
  22. path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25));
  23. path.lineTo(SkIntToScalar(200), SkIntToScalar(150));
  24. path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200));
  25. path.lineTo(SkIntToScalar(0), SkIntToScalar(200));
  26. path.close();
  27. path.moveTo(SkIntToScalar(50), SkIntToScalar(50));
  28. path.lineTo(SkIntToScalar(150), SkIntToScalar(50));
  29. path.lineTo(SkIntToScalar(150), SkIntToScalar(125));
  30. path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150));
  31. path.lineTo(SkIntToScalar(50), SkIntToScalar(150));
  32. path.close();
  33. path.setFillType(SkPath::kEvenOdd_FillType);
  34. SkColor pathColor = SK_ColorBLACK;
  35. SkPaint pathPaint;
  36. pathPaint.setAntiAlias(true);
  37. pathPaint.setColor(pathColor);
  38. SkPath clipA;
  39. clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20));
  40. clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22));
  41. clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105));
  42. clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177));
  43. clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180));
  44. clipA.close();
  45. SkColor colorA = SK_ColorCYAN;
  46. SkPath clipB;
  47. clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10));
  48. clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15));
  49. clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190));
  50. clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185));
  51. clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100));
  52. clipB.close();
  53. SkColor colorB = SK_ColorRED;
  54. SkFont font;
  55. font.setSize(20);
  56. SkPaint paint;
  57. paint.setAntiAlias(true);
  58. paint.setStyle(SkPaint::kStroke_Style);
  59. paint.setStrokeWidth(0);
  60. canvas->translate(SkIntToScalar(10),SkIntToScalar(10));
  61. canvas->drawPath(path, pathPaint);
  62. paint.setColor(colorA);
  63. canvas->drawPath(clipA, paint);
  64. paint.setColor(colorB);
  65. canvas->drawPath(clipB, paint);
  66. static const struct {
  67. SkClipOp fOp;
  68. const char* fName;
  69. } gOps[] = { //extra spaces in names for measureText
  70. {kIntersect_SkClipOp, "Isect "},
  71. {kDifference_SkClipOp, "Diff " },
  72. {kUnion_SkClipOp, "Union "},
  73. {kXOR_SkClipOp, "Xor " },
  74. {kReverseDifference_SkClipOp, "RDiff "}
  75. };
  76. canvas->translate(0, SkIntToScalar(40));
  77. canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4);
  78. canvas->save();
  79. for (int invA = 0; invA < 2; ++invA) {
  80. for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) {
  81. size_t idx = invA * SK_ARRAY_COUNT(gOps) + op;
  82. if (!(idx % 3)) {
  83. canvas->restore();
  84. canvas->translate(0, SkIntToScalar(250));
  85. canvas->save();
  86. }
  87. canvas->save();
  88. // set clip
  89. clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType :
  90. SkPath::kEvenOdd_FillType);
  91. canvas->clipPath(clipA);
  92. canvas->clipPath(clipB, gOps[op].fOp);
  93. // draw path clipped
  94. canvas->drawPath(path, pathPaint);
  95. canvas->restore();
  96. // draw path in hairline
  97. paint.setColor(pathColor);
  98. canvas->drawPath(path, paint);
  99. // draw clips in hair line
  100. paint.setColor(colorA);
  101. canvas->drawPath(clipA, paint);
  102. paint.setColor(colorB);
  103. canvas->drawPath(clipB, paint);
  104. SkScalar txtX = SkIntToScalar(55);
  105. paint.setColor(colorA);
  106. const char* aTxt = invA ? "InverseA " : "A ";
  107. canvas->drawSimpleText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8, txtX, SkIntToScalar(220), font, paint);
  108. txtX += font.measureText(aTxt, strlen(aTxt), SkTextEncoding::kUTF8);
  109. paint.setColor(SK_ColorBLACK);
  110. canvas->drawSimpleText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8,
  111. txtX, 220, font, paint);
  112. txtX += font.measureText(gOps[op].fName, strlen(gOps[op].fName), SkTextEncoding::kUTF8);
  113. paint.setColor(colorB);
  114. canvas->drawSimpleText("B", 1, SkTextEncoding::kUTF8, txtX, 220, font, paint);
  115. canvas->translate(SkIntToScalar(250),0);
  116. }
  117. }
  118. canvas->restore();
  119. }
  120. };
  121. DEF_SAMPLE( return new ComplexClipView(); )