1 #include "gm.h" 2 #include "SkPicture.h" 3 #include "SkRectShape.h" 4 #include "SkGroupShape.h" 5 6 typedef SkScalar (*MakePathProc)(SkPath*); 7 8 static SkScalar make_frame(SkPath* path) { 9 SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 10 SkIntToScalar(630), SkIntToScalar(470) }; 11 path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15)); 12 13 SkPaint paint; 14 paint.setStyle(SkPaint::kStroke_Style); 15 paint.setStrokeWidth(SkIntToScalar(5)); 16 paint.getFillPath(*path, path); 17 return SkIntToScalar(15); 18 } 19 20 static SkScalar make_triangle(SkPath* path) { 21 static const int gCoord[] = { 22 10, 20, 15, 5, 30, 30 23 }; 24 path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); 25 path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); 26 path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); 27 path->close(); 28 path->offset(SkIntToScalar(10), SkIntToScalar(0)); 29 return SkIntToScalar(30); 30 } 31 32 static SkScalar make_rect(SkPath* path) { 33 SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 34 SkIntToScalar(30), SkIntToScalar(30) }; 35 path->addRect(r); 36 path->offset(SkIntToScalar(10), SkIntToScalar(0)); 37 return SkIntToScalar(30); 38 } 39 40 static SkScalar make_oval(SkPath* path) { 41 SkRect r = { SkIntToScalar(10), SkIntToScalar(10), 42 SkIntToScalar(30), SkIntToScalar(30) }; 43 path->addOval(r); 44 path->offset(SkIntToScalar(10), SkIntToScalar(0)); 45 return SkIntToScalar(30); 46 } 47 48 static 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 68 static 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 85 static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } 86 static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } 87 88 static 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 100 namespace skiagm { 101 102 class PathFillGM : public GM { 103 SkPath fPath[N]; 104 SkScalar fDY[N]; 105 public: 106 PathFillGM() { 107 for (size_t i = 0; i < N; i++) { 108 fDY[i] = gProcs[i](&fPath[i]); 109 } 110 } 111 112 protected: 113 virtual SkString onShortName() { 114 return SkString("pathfill"); 115 } 116 117 virtual SkISize onISize() { 118 return make_isize(640, 480); 119 } 120 121 void drawBG(SkCanvas* canvas) { 122 canvas->drawColor(SK_ColorWHITE); 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(SkIntToScalar(0), fDY[i]); 134 } 135 } 136 137 private: 138 typedef GM INHERITED; 139 }; 140 141 /////////////////////////////////////////////////////////////////////////////// 142 143 static GM* MyFactory(void*) { return new PathFillGM; } 144 static GMRegistry reg(MyFactory); 145 146 } 147