137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org/*
237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * Copyright 2012 Google Inc.
337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org *
437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * Use of this source code is governed by a BSD-style license that can be
537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org * found in the LICENSE file.
637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org */
737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "gm.h"
937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkCanvas.h"
1037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkRRect.h"
1137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org#include "SkPath.h"
1237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
13c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgtypedef void (*InsetProc)(const SkRRect&, SkScalar dx, SkScalar dy, SkRRect*);
14c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
15c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void inset0(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
16c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    SkRect r = src.rect();
17c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
18c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    r.inset(dx, dy);
19c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    if (r.isEmpty()) {
20c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        dst->setEmpty();
21c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        return;
22c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
237a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
24c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    SkVector radii[4];
25c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    for (int i = 0; i < 4; ++i) {
26c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        radii[i] = src.radii((SkRRect::Corner)i);
27c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
28c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    for (int i = 0; i < 4; ++i) {
29c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        radii[i].fX -= dx;
30c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        radii[i].fY -= dy;
31c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
32c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    dst->setRectRadii(r, radii);
33c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org}
34c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
35c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void inset1(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
36c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    SkRect r = src.rect();
37c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
38c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    r.inset(dx, dy);
39c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    if (r.isEmpty()) {
40c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        dst->setEmpty();
41c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        return;
42c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
437a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
44c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    SkVector radii[4];
45c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    for (int i = 0; i < 4; ++i) {
46c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        radii[i] = src.radii((SkRRect::Corner)i);
47c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
48c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    dst->setRectRadii(r, radii);
49c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org}
50c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
51ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.comstatic void inset2(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
52ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    SkRect r = src.rect();
537a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
54ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    r.inset(dx, dy);
55ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    if (r.isEmpty()) {
56ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        dst->setEmpty();
57ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        return;
58ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
597a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
60ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    SkVector radii[4];
61ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    for (int i = 0; i < 4; ++i) {
62ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        radii[i] = src.radii((SkRRect::Corner)i);
63ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
64ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    for (int i = 0; i < 4; ++i) {
65ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        if (radii[i].fX) {
66ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com            radii[i].fX -= dx;
67ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        }
68ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        if (radii[i].fY) {
69ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com            radii[i].fY -= dy;
70ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        }
71ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
72ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    dst->setRectRadii(r, radii);
73ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com}
74ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com
750f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.comstatic SkScalar prop(SkScalar radius, SkScalar newSize, SkScalar oldSize) {
76ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    return newSize * radius / oldSize;
77ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com}
78ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com
79ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.comstatic void inset3(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
80ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    SkRect r = src.rect();
817a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
82ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    r.inset(dx, dy);
83ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    if (r.isEmpty()) {
84ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        dst->setEmpty();
85ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        return;
86ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
877a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
88ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    SkVector radii[4];
89ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    for (int i = 0; i < 4; ++i) {
90ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        radii[i] = src.radii((SkRRect::Corner)i);
91ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
92ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    for (int i = 0; i < 4; ++i) {
930f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.com        radii[i].fX = prop(radii[i].fX, r.width(), src.rect().width());
940f0d9b720e1afef91d30c83b379725b8a53fafc8sugoi@google.com        radii[i].fY = prop(radii[i].fY, r.height(), src.rect().height());
95ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    }
96ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com    dst->setRectRadii(r, radii);
97ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com}
98ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com
9937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgstatic void draw_rrect_color(SkCanvas* canvas, const SkRRect& rrect) {
10037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    SkPaint paint;
10137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    paint.setAntiAlias(true);
102c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    paint.setStyle(SkPaint::kStroke_Style);
103c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
10437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    if (rrect.isRect()) {
10537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        paint.setColor(SK_ColorRED);
10637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    } else if (rrect.isOval()) {
107c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        paint.setColor(0xFF008800);
10837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    } else if (rrect.isSimple()) {
10937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        paint.setColor(SK_ColorBLUE);
11037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    } else {
111c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        paint.setColor(SK_ColorBLACK);
11237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    }
11337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    canvas->drawRRect(rrect, paint);
11437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org}
11537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
116c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.orgstatic void drawrr(SkCanvas* canvas, const SkRRect& rrect, InsetProc proc) {
117c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    SkRRect rr;
1185138638143b4ebaa60a0b75e816118c35ff220f7mike@reedtribe.org    for (SkScalar d = -30; d <= 30; d += 5) {
119c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        proc(rrect, d, d, &rr);
120c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        draw_rrect_color(canvas, rr);
121c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org    }
12237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org}
12337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
12437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgclass RRectGM : public skiagm::GM {
12537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgpublic:
12637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    RRectGM() {}
1277a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
12837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgprotected:
129a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    virtual uint32_t onGetFlags() const SK_OVERRIDE {
130a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org        return kSkipTiled_Flag;
131a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org    }
132a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org
13337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    virtual SkString onShortName() {
13437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        return SkString("rrect");
13537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    }
1367a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
13737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    virtual SkISize onISize() {
138ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        return SkISize::Make(820, 710);
13937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    }
1407a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
14137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    virtual void onDraw(SkCanvas* canvas) {
142ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        static const InsetProc insetProcs[] = {
143ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com            inset0, inset1, inset2, inset3
144ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        };
145c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org
14637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        SkRRect rrect[4];
147ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        SkRect r = { 0, 0, 120, 100 };
14837071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        SkVector radii[4] = {
149ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com            { 0, 0 }, { 30, 1 }, { 10, 40 }, { 40, 40 }
15037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        };
1517a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
15237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        rrect[0].setRect(r);
15337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        rrect[1].setOval(r);
15437071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        rrect[2].setRectXY(r, 20, 20);
15537071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        rrect[3].setRectRadii(r, radii);
15637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
157ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com        canvas->translate(50.5f, 50.5f);
158c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org        for (size_t j = 0; j < SK_ARRAY_COUNT(insetProcs); ++j) {
159c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org            canvas->save();
160c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org            for (size_t i = 0; i < SK_ARRAY_COUNT(rrect); ++i) {
161c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org                drawrr(canvas, rrect[i], insetProcs[j]);
162ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com                canvas->translate(200, 0);
163c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org            }
164c3442d53dabf2a692f4c9efba5e8be7bbb43d3efmike@reedtribe.org            canvas->restore();
165ec93bf92339d923dbf5964f7844b9f8366eeba13reed@google.com            canvas->translate(0, 170);
16637071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org        }
16737071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    }
1687a03d86a3d9adcb13432fbd82039725149487c97skia.committer@gmail.com
16937071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgprivate:
17037071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org    typedef GM INHERITED;
17137071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org};
17237071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.org
17337071640f6bdcb1bfb193f85b9ca615b29679425mike@reedtribe.orgDEF_GM( return new RRectGM; )
174