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 28class ConcavePathView : public SampleView { 29public: 30 ConcavePathView() {} 31 32protected: 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 146private: 147 typedef SampleView INHERITED; 148}; 149 150////////////////////////////////////////////////////////////////////////////// 151 152static SkView* MyFactory() { return new ConcavePathView; } 153static SkViewRegister reg(MyFactory); 154