1 #include "gm.h" 2 #include "SkCanvas.h" 3 //#include "SkParsePath.h" 4 #include "SkPath.h" 5 //#include "SkRandom.h" 6 7 namespace skiagm { 8 9 class ComplexClipGM : public GM { 10 public: 11 ComplexClipGM() { 12 } 13 14 protected: 15 16 SkString onShortName() { 17 return SkString("complexclip"); 18 } 19 20 SkISize onISize() { return make_isize(550, 1000); } 21 22 void drawBG(SkCanvas* canvas) { 23 canvas->drawColor(SkColorSetRGB(0xA0,0xDD,0xA0)); 24 } 25 26 virtual void onDraw(SkCanvas* canvas) { 27 SkPath path; 28 path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); 29 path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); 30 path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); 31 path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); 32 path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); 33 path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); 34 path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); 35 path.close(); 36 path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); 37 path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); 38 path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); 39 path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); 40 path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); 41 path.close(); 42 path.setFillType(SkPath::kEvenOdd_FillType); 43 SkColor pathColor = SK_ColorBLACK; 44 SkPaint pathPaint; 45 pathPaint.setAntiAlias(true); 46 pathPaint.setColor(pathColor); 47 48 SkPath clipA; 49 clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); 50 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); 51 clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); 52 clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); 53 clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); 54 clipA.close(); 55 SkColor colorA = SK_ColorCYAN; 56 57 SkPath clipB; 58 clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); 59 clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); 60 clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); 61 clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); 62 clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); 63 clipB.close(); 64 SkColor colorB = SK_ColorRED; 65 66 drawBG(canvas); 67 SkPaint paint; 68 paint.setAntiAlias(true); 69 70 paint.setStyle(SkPaint::kStroke_Style); 71 paint.setStrokeWidth(0); 72 73 canvas->translate(SkIntToScalar(10),SkIntToScalar(10)); 74 canvas->drawPath(path, pathPaint); 75 paint.setColor(colorA); 76 canvas->drawPath(clipA, paint); 77 paint.setColor(colorB); 78 canvas->drawPath(clipB, paint); 79 80 static const struct { 81 SkRegion::Op fOp; 82 const char* fName; 83 } gOps[] = { //extra spaces in names for measureText 84 {SkRegion::kIntersect_Op, "Isect "}, 85 {SkRegion::kDifference_Op, "Diff " }, 86 {SkRegion::kUnion_Op, "Union "}, 87 {SkRegion::kXOR_Op, "Xor " }, 88 {SkRegion::kReverseDifference_Op, "RDiff "} 89 }; 90 91 canvas->translate(0, SkIntToScalar(40)); 92 canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 93 canvas->save(); 94 95 for (int invA = 0; invA < 2; ++invA) { 96 for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 97 int idx = invA * SK_ARRAY_COUNT(gOps) + op; 98 if (!(idx % 3)) { 99 canvas->restore(); 100 canvas->translate(0, SkIntToScalar(250)); 101 canvas->save(); 102 } 103 canvas->save(); 104 // set clip 105 clipA.setFillType(invA ? SkPath::kInverseEvenOdd_FillType : 106 SkPath::kEvenOdd_FillType); 107 canvas->clipPath(clipA); 108 canvas->clipPath(clipB, gOps[op].fOp); 109 110 // draw path clipped 111 canvas->drawPath(path, pathPaint); 112 canvas->restore(); 113 114 // draw path in hairline 115 paint.setColor(pathColor); 116 canvas->drawPath(path, paint); 117 118 // draw clips in hair line 119 paint.setColor(colorA); 120 canvas->drawPath(clipA, paint); 121 paint.setColor(colorB); 122 canvas->drawPath(clipB, paint); 123 124 paint.setTextSize(SkIntToScalar(20)); 125 126 SkScalar txtX = SkIntToScalar(55); 127 paint.setColor(colorA); 128 const char* aTxt = invA ? "InverseA " : "A "; 129 canvas->drawText(aTxt, strlen(aTxt), txtX, SkIntToScalar(220), paint); 130 txtX += paint.measureText(aTxt, strlen(aTxt)); 131 paint.setColor(SK_ColorBLACK); 132 canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), 133 txtX, SkIntToScalar(220), paint); 134 txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); 135 paint.setColor(colorB); 136 canvas->drawText("B", 1, txtX, SkIntToScalar(220), paint); 137 138 canvas->translate(SkIntToScalar(250),0); 139 } 140 } 141 canvas->restore(); 142 } 143 private: 144 typedef GM INHERITED; 145 }; 146 147 ////////////////////////////////////////////////////////////////////////////// 148 149 static GM* MyFactory(void*) { return new ComplexClipGM; } 150 static GMRegistry reg(MyFactory); 151 152 } 153