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