rrect.cpp revision 5138638143b4ebaa60a0b75e816118c35ff220f7
1/*
2 * Copyright 2012 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "gm.h"
9#include "SkCanvas.h"
10#include "SkRRect.h"
11#include "SkPath.h"
12
13typedef void (*InsetProc)(const SkRRect&, SkScalar dx, SkScalar dy, SkRRect*);
14
15static void inset0(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
16    SkRect r = src.rect();
17
18    r.inset(dx, dy);
19    if (r.isEmpty()) {
20        dst->setEmpty();
21        return;
22    }
23
24    SkVector radii[4];
25    for (int i = 0; i < 4; ++i) {
26        radii[i] = src.radii((SkRRect::Corner)i);
27    }
28    for (int i = 0; i < 4; ++i) {
29        radii[i].fX -= dx;
30        radii[i].fY -= dy;
31    }
32    dst->setRectRadii(r, radii);
33}
34
35static void inset1(const SkRRect& src, SkScalar dx, SkScalar dy, SkRRect* dst) {
36    SkRect r = src.rect();
37
38    r.inset(dx, dy);
39    if (r.isEmpty()) {
40        dst->setEmpty();
41        return;
42    }
43
44    SkVector radii[4];
45    for (int i = 0; i < 4; ++i) {
46        radii[i] = src.radii((SkRRect::Corner)i);
47    }
48    dst->setRectRadii(r, radii);
49}
50
51static void draw_rrect_color(SkCanvas* canvas, const SkRRect& rrect) {
52    SkPaint paint;
53    paint.setAntiAlias(true);
54    paint.setStyle(SkPaint::kStroke_Style);
55
56    if (rrect.isRect()) {
57        paint.setColor(SK_ColorRED);
58    } else if (rrect.isOval()) {
59        paint.setColor(0xFF008800);
60    } else if (rrect.isSimple()) {
61        paint.setColor(SK_ColorBLUE);
62    } else {
63        paint.setColor(SK_ColorBLACK);
64    }
65    canvas->drawRRect(rrect, paint);
66}
67
68static void drawrr(SkCanvas* canvas, const SkRRect& rrect, InsetProc proc) {
69    SkRRect rr;
70    for (SkScalar d = -30; d <= 30; d += 5) {
71        proc(rrect, d, d, &rr);
72        draw_rrect_color(canvas, rr);
73    }
74}
75
76class RRectGM : public skiagm::GM {
77public:
78    RRectGM() {}
79
80protected:
81    virtual SkString onShortName() {
82        return SkString("rrect");
83    }
84
85    virtual SkISize onISize() {
86        return SkISize::Make(640, 480);
87    }
88
89    virtual void onDraw(SkCanvas* canvas) {
90        static const InsetProc insetProcs[] = { inset0, inset1 };
91
92        SkRRect rrect[4];
93        SkRect r = { 0, 0, 120, 160 };
94        SkVector radii[4] = {
95            { 0, 0 }, { 20, 20 }, { 10, 40 }, { 40, 40 }
96        };
97
98        rrect[0].setRect(r);
99        rrect[1].setOval(r);
100        rrect[2].setRectXY(r, 20, 20);
101        rrect[3].setRectRadii(r, radii);
102
103        canvas->translate(50, 50);
104        for (size_t j = 0; j < SK_ARRAY_COUNT(insetProcs); ++j) {
105            canvas->save();
106            for (size_t i = 0; i < SK_ARRAY_COUNT(rrect); ++i) {
107                drawrr(canvas, rrect[i], insetProcs[j]);
108                canvas->translate(rrect[i].width() * 5 / 3, 0);
109            }
110            canvas->restore();
111            canvas->translate(0, rrect[0].height() * 5 / 3);
112        }
113    }
114
115private:
116    typedef GM INHERITED;
117};
118
119DEF_GM( return new RRectGM; )
120
121