SamplePathFill.cpp revision ad89fbd3535cbbb528488c7a5ce98f88c57d2de3
1#include "SampleCode.h" 2#include "SkView.h" 3#include "SkCanvas.h" 4#include "SkGraphics.h" 5#include "SkRandom.h" 6#include "SkBlurDrawLooper.h" 7#include "SkGradientShader.h" 8 9typedef SkScalar (*MakePathProc)(SkPath*); 10 11static SkScalar make_frame(SkPath* path) { 12 SkRect r = { 10, 10, 630, 470 }; 13 path->addRoundRect(r, 15, 15); 14 15 SkPaint paint; 16 paint.setStyle(SkPaint::kStroke_Style); 17 paint.setStrokeWidth(5); 18 paint.getFillPath(*path, path); 19 return 15; 20} 21 22static SkScalar make_triangle(SkPath* path) { 23 static const int gCoord[] = { 24 10, 20, 15, 5, 30, 30 25 }; 26 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 27 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 28 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 29 path->close(); 30 path->offset(10, 0); 31 return SkIntToScalar(30); 32} 33 34static SkScalar make_rect(SkPath* path) { 35 SkRect r = { 10, 10, 30, 30 }; 36 path->addRect(r); 37 path->offset(10, 0); 38 return SkIntToScalar(30); 39} 40 41static SkScalar make_oval(SkPath* path) { 42 SkRect r = { 10, 10, 30, 30 }; 43 path->addOval(r); 44 path->offset(10, 0); 45 return SkIntToScalar(30); 46} 47 48static SkScalar make_sawtooth(SkPath* path) { 49 SkScalar x = SkIntToScalar(20); 50 SkScalar y = SkIntToScalar(20); 51 const SkScalar x0 = x; 52 const SkScalar dx = SK_Scalar1 * 5; 53 const SkScalar dy = SK_Scalar1 * 10; 54 55 path->moveTo(x, y); 56 for (int i = 0; i < 32; i++) { 57 x += dx; 58 path->lineTo(x, y - dy); 59 x += dx; 60 path->lineTo(x, y + dy); 61 } 62 path->lineTo(x, y + 2 * dy); 63 path->lineTo(x0, y + 2 * dy); 64 path->close(); 65 return SkIntToScalar(30); 66} 67 68static SkScalar make_star(SkPath* path, int n) { 69 const SkScalar c = SkIntToScalar(45); 70 const SkScalar r = SkIntToScalar(20); 71 72 SkScalar rad = -SK_ScalarPI / 2; 73 const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; 74 75 path->moveTo(c, c - r); 76 for (int i = 1; i < n; i++) { 77 rad += drad; 78 SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); 79 path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r)); 80 } 81 path->close(); 82 return r * 2 * 6 / 5; 83} 84 85static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } 86static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } 87 88static const MakePathProc gProcs[] = { 89 make_frame, 90 make_triangle, 91 make_rect, 92 make_oval, 93 make_sawtooth, 94 make_star_5, 95 make_star_13 96}; 97 98#define N SK_ARRAY_COUNT(gProcs) 99 100class PathFillView : public SkView { 101 SkPath fPath[N]; 102 SkScalar fDY[N]; 103 104public: 105 PathFillView() { 106 for (size_t i = 0; i < N; i++) { 107 fDY[i] = gProcs[i](&fPath[i]); 108 } 109 } 110 111protected: 112 // overrides from SkEventSink 113 virtual bool onQuery(SkEvent* evt) { 114 if (SampleCode::TitleQ(*evt)) { 115 SampleCode::TitleR(evt, "PathFill"); 116 return true; 117 } 118 return this->INHERITED::onQuery(evt); 119 } 120 121 void drawBG(SkCanvas* canvas) { 122 canvas->drawColor(0xFFDDDDDD); 123 } 124 125 virtual void onDraw(SkCanvas* canvas) { 126 this->drawBG(canvas); 127 128 SkPaint paint; 129 paint.setAntiAlias(true); 130 131 for (size_t i = 0; i < N; i++) { 132 canvas->drawPath(fPath[i], paint); 133 canvas->translate(0, fDY[i]); 134 } 135 } 136 137private: 138 typedef SkView INHERITED; 139}; 140 141////////////////////////////////////////////////////////////////////////////// 142 143static SkView* MyFactory() { return new PathFillView; } 144static SkViewRegister reg(MyFactory); 145 146