diff options
Diffstat (limited to 'gm/pathfill.cpp')
-rw-r--r-- | gm/pathfill.cpp | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/gm/pathfill.cpp b/gm/pathfill.cpp new file mode 100644 index 0000000..ec56942 --- /dev/null +++ b/gm/pathfill.cpp @@ -0,0 +1,143 @@ +#include "gm.h" +#include "SkPicture.h" +#include "SkRectShape.h" +#include "SkGroupShape.h" + +typedef SkScalar (*MakePathProc)(SkPath*); + +static SkScalar make_frame(SkPath* path) { + SkRect r = { 10, 10, 630, 470 }; + path->addRoundRect(r, 15, 15); + + SkPaint paint; + paint.setStyle(SkPaint::kStroke_Style); + paint.setStrokeWidth(5); + paint.getFillPath(*path, path); + return 15; +} + +static SkScalar make_triangle(SkPath* path) { + static const int gCoord[] = { + 10, 20, 15, 5, 30, 30 + }; + path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1])); + path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3])); + path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5])); + path->close(); + path->offset(10, 0); + return SkIntToScalar(30); +} + +static SkScalar make_rect(SkPath* path) { + SkRect r = { 10, 10, 30, 30 }; + path->addRect(r); + path->offset(10, 0); + return SkIntToScalar(30); +} + +static SkScalar make_oval(SkPath* path) { + SkRect r = { 10, 10, 30, 30 }; + path->addOval(r); + path->offset(10, 0); + return SkIntToScalar(30); +} + +static SkScalar make_sawtooth(SkPath* path) { + SkScalar x = SkIntToScalar(20); + SkScalar y = SkIntToScalar(20); + const SkScalar x0 = x; + const SkScalar dx = SK_Scalar1 * 5; + const SkScalar dy = SK_Scalar1 * 10; + + path->moveTo(x, y); + for (int i = 0; i < 32; i++) { + x += dx; + path->lineTo(x, y - dy); + x += dx; + path->lineTo(x, y + dy); + } + path->lineTo(x, y + 2 * dy); + path->lineTo(x0, y + 2 * dy); + path->close(); + return SkIntToScalar(30); +} + +static SkScalar make_star(SkPath* path, int n) { + const SkScalar c = SkIntToScalar(45); + const SkScalar r = SkIntToScalar(20); + + SkScalar rad = -SK_ScalarPI / 2; + const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n; + + path->moveTo(c, c - r); + for (int i = 1; i < n; i++) { + rad += drad; + SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV); + path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r)); + } + path->close(); + return r * 2 * 6 / 5; +} + +static SkScalar make_star_5(SkPath* path) { return make_star(path, 5); } +static SkScalar make_star_13(SkPath* path) { return make_star(path, 13); } + +static const MakePathProc gProcs[] = { + make_frame, + make_triangle, + make_rect, + make_oval, + make_sawtooth, + make_star_5, + make_star_13 +}; + +#define N SK_ARRAY_COUNT(gProcs) + +namespace skiagm { + +class PathFillGM : public GM { + SkPath fPath[N]; + SkScalar fDY[N]; +public: + PathFillGM() { + for (size_t i = 0; i < N; i++) { + fDY[i] = gProcs[i](&fPath[i]); + } + } + +protected: + virtual SkString onShortName() { + return SkString("pathfill"); + } + + virtual SkISize onISize() { + return make_isize(640, 480); + } + + void drawBG(SkCanvas* canvas) { + canvas->drawColor(SK_ColorWHITE); + } + + virtual void onDraw(SkCanvas* canvas) { + this->drawBG(canvas); + + SkPaint paint; + paint.setAntiAlias(true); + + for (size_t i = 0; i < N; i++) { + canvas->drawPath(fPath[i], paint); + canvas->translate(0, fDY[i]); + } + } + +private: + typedef GM INHERITED; +}; + +/////////////////////////////////////////////////////////////////////////////// + +static GM* MyFactory(void*) { return new PathFillGM; } +static GMRegistry reg(MyFactory); + +} |