11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "gm.h"
987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkPicture.h"
1087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkRectShape.h"
1187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#include "SkGroupShape.h"
1287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergertypedef SkScalar (*MakePathProc)(SkPath*);
1487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_frame(SkPath* path) {
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 SkIntToScalar(630), SkIntToScalar(470) };
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->addRoundRect(r, SkIntToScalar(15), SkIntToScalar(15));
1987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
2087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkPaint paint;
2187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    paint.setStyle(SkPaint::kStroke_Style);
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    paint.setStrokeWidth(SkIntToScalar(5));
2387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    paint.getFillPath(*path, path);
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return SkIntToScalar(15);
2587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
2687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
2787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_triangle(SkPath* path) {
2887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    static const int gCoord[] = {
2987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        10, 20, 15, 5, 30, 30
3087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    };
3187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->moveTo(SkIntToScalar(gCoord[0]), SkIntToScalar(gCoord[1]));
3287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->lineTo(SkIntToScalar(gCoord[2]), SkIntToScalar(gCoord[3]));
3387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->lineTo(SkIntToScalar(gCoord[4]), SkIntToScalar(gCoord[5]));
3487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->close();
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->offset(SkIntToScalar(10), SkIntToScalar(0));
3687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return SkIntToScalar(30);
3787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
3887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
3987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_rect(SkPath* path) {
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 SkIntToScalar(30), SkIntToScalar(30) };
4287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->addRect(r);
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->offset(SkIntToScalar(10), SkIntToScalar(0));
4487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return SkIntToScalar(30);
4587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
4687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
4787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_oval(SkPath* path) {
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkRect r = { SkIntToScalar(10), SkIntToScalar(10),
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger                 SkIntToScalar(30), SkIntToScalar(30) };
5087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->addOval(r);
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->offset(SkIntToScalar(10), SkIntToScalar(0));
5287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return SkIntToScalar(30);
5387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
5487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
5587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_sawtooth(SkPath* path) {
5687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkScalar x = SkIntToScalar(20);
5787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkScalar y = SkIntToScalar(20);
5887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar x0 = x;
5987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar dx = SK_Scalar1 * 5;
6087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar dy = SK_Scalar1 * 10;
6187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
6287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->moveTo(x, y);
6387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    for (int i = 0; i < 32; i++) {
6487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        x += dx;
6587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        path->lineTo(x, y - dy);
6687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        x += dx;
6787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        path->lineTo(x, y + dy);
6887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->lineTo(x, y + (2 * dy));
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    path->lineTo(x0, y + (2 * dy));
7187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->close();
7287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return SkIntToScalar(30);
7387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
7487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
7587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star(SkPath* path, int n) {
7687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar c = SkIntToScalar(45);
7787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar r = SkIntToScalar(20);
7887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
7987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkScalar rad = -SK_ScalarPI / 2;
8087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    const SkScalar drad = (n >> 1) * SK_ScalarPI * 2 / n;
8187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
8287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->moveTo(c, c - r);
8387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    for (int i = 1; i < n; i++) {
8487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        rad += drad;
8587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        SkScalar cosV, sinV = SkScalarSinCos(rad, &cosV);
8687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        path->lineTo(c + SkScalarMul(cosV, r), c + SkScalarMul(sinV, r));
8787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
8887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    path->close();
8987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    return r * 2 * 6 / 5;
9087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
9187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star_5(SkPath* path) { return make_star(path, 5); }
9387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic SkScalar make_star_13(SkPath* path) { return make_star(path, 13); }
9487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
9587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic const MakePathProc gProcs[] = {
9687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_frame,
9787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_triangle,
9887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_rect,
9987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_oval,
10087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_sawtooth,
10187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_star_5,
10287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    make_star_13
10387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
10487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger#define N   SK_ARRAY_COUNT(gProcs)
10687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergernamespace skiagm {
10887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
10987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerclass PathFillGM : public GM {
11087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkPath  fPath[N];
11187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    SkScalar fDY[N];
11287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerpublic:
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    PathFillGM() {
11487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        for (size_t i = 0; i < N; i++) {
11587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            fDY[i] = gProcs[i](&fPath[i]);
11687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
11787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
11887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
11987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprotected:
12087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual SkString onShortName() {
12187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return SkString("pathfill");
12287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
1240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual SkISize onISize() {
12587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        return make_isize(640, 480);
12687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
12787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
12887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
12987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        SkPaint paint;
13087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        paint.setAntiAlias(true);
13187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
13287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        for (size_t i = 0; i < N; i++) {
13387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger            canvas->drawPath(fPath[i], paint);
1340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            canvas->translate(SkIntToScalar(0), fDY[i]);
13587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger        }
13687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    }
13787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
13887b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerprivate:
13987b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger    typedef GM INHERITED;
14087b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger};
14187b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14287b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger///////////////////////////////////////////////////////////////////////////////
14387b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14487b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic GM* MyFactory(void*) { return new PathFillGM; }
14587b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenbergerstatic GMRegistry reg(MyFactory);
14687b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger
14787b8e645865f9633f410c02252a0fd3feb18f09bDerek Sollenberger}
148