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