1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "SampleCode.h" 10 #include "SkView.h" 11 #include "SkCanvas.h" 12 #include "SkGradientShader.h" 13 #include "SkGraphics.h" 14 #include "SkImageDecoder.h" 15 #include "SkPath.h" 16 #include "SkRegion.h" 17 #include "SkShader.h" 18 #include "SkUtils.h" 19 #include "SkXfermode.h" 20 #include "SkColorPriv.h" 21 #include "SkColorFilter.h" 22 #include "SkParsePath.h" 23 #include "SkTime.h" 24 #include "SkTypeface.h" 25 26 #include "SkGeometry.h" 27 28 class ConcavePathView : public SampleView { 29 public: 30 ConcavePathView() {} 31 32 protected: 33 // overrides from SkEventSink 34 virtual bool onQuery(SkEvent* evt) { 35 if (SampleCode::TitleQ(*evt)) { 36 SampleCode::TitleR(evt, "ConcavePaths"); 37 return true; 38 } 39 return this->INHERITED::onQuery(evt); 40 } 41 42 virtual void onDrawContent(SkCanvas* canvas) { 43 SkPaint paint; 44 45 paint.setAntiAlias(true); 46 paint.setStyle(SkPaint::kFill_Style); 47 48 // Concave test 49 if (1) { 50 SkPath path; 51 canvas->translate(0, 0); 52 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 53 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 54 path.lineTo(SkIntToScalar(30), SkIntToScalar(30)); 55 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 56 canvas->drawPath(path, paint); 57 } 58 // Reverse concave test 59 if (1) { 60 SkPath path; 61 canvas->save(); 62 canvas->translate(100, 0); 63 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 64 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 65 path.lineTo(SkIntToScalar(30), SkIntToScalar(30)); 66 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 67 canvas->drawPath(path, paint); 68 canvas->restore(); 69 } 70 // Bowtie (intersection) 71 if (1) { 72 SkPath path; 73 canvas->save(); 74 canvas->translate(200, 0); 75 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 76 path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 77 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 78 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 79 canvas->drawPath(path, paint); 80 canvas->restore(); 81 } 82 // "fake" bowtie (concave, but no intersection) 83 if (1) { 84 SkPath path; 85 canvas->save(); 86 canvas->translate(300, 0); 87 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 88 path.lineTo(SkIntToScalar(50), SkIntToScalar(40)); 89 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 90 path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 91 path.lineTo(SkIntToScalar(50), SkIntToScalar(60)); 92 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 93 canvas->drawPath(path, paint); 94 canvas->restore(); 95 } 96 // Fish test (intersection/concave) 97 if (1) { 98 SkPath path; 99 canvas->save(); 100 canvas->translate(0, 100); 101 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 102 path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 103 path.lineTo(SkIntToScalar(70), SkIntToScalar(50)); 104 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 105 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 106 path.lineTo(SkIntToScalar(0), SkIntToScalar(50)); 107 canvas->drawPath(path, paint); 108 canvas->restore(); 109 } 110 // Collinear test 111 if (1) { 112 SkPath path; 113 canvas->save(); 114 canvas->translate(100, 100); 115 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 116 path.lineTo(SkIntToScalar(50), SkIntToScalar(20)); 117 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 118 path.lineTo(SkIntToScalar(50), SkIntToScalar(80)); 119 canvas->drawPath(path, paint); 120 canvas->restore(); 121 } 122 // Hole test 123 if (1) { 124 SkPath path; 125 canvas->save(); 126 canvas->translate(200, 100); 127 path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); 128 path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); 129 path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); 130 path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); 131 path.moveTo(SkIntToScalar(30), SkIntToScalar(30)); 132 path.lineTo(SkIntToScalar(30), SkIntToScalar(70)); 133 path.lineTo(SkIntToScalar(70), SkIntToScalar(70)); 134 path.lineTo(SkIntToScalar(70), SkIntToScalar(30)); 135 canvas->drawPath(path, paint); 136 canvas->restore(); 137 } 138 } 139 140 virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, 141 unsigned modi) { 142 this->inval(NULL); 143 return this->INHERITED::onFindClickHandler(x, y, modi); 144 } 145 146 private: 147 typedef SampleView INHERITED; 148 }; 149 150 ////////////////////////////////////////////////////////////////////////////// 151 152 static SkView* MyFactory() { return new ConcavePathView; } 153 static SkViewRegister reg(MyFactory); 154