move inset out of SkRRect.h for now, and add experimental versions to gm
[platform/upstream/libSkiaSharp.git] / gm / rrect.cpp
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
13 typedef void (*InsetProc)(const SkRRect&, SkScalar dx, SkScalar dy, SkRRect*);
14
15 static 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
35 static 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
51 static 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
68 static void drawrr(SkCanvas* canvas, const SkRRect& rrect, InsetProc proc) {
69     SkRRect rr;
70     for (SkScalar d = -30; d <= 30; d += 10) {
71         proc(rrect, d, d, &rr);
72         draw_rrect_color(canvas, rr);
73     }
74 }
75
76 class RRectGM : public skiagm::GM {
77 public:
78     RRectGM() {}
79     
80 protected:
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     
115 private:
116     typedef GM INHERITED;
117 };
118
119 DEF_GM( return new RRectGM; )
120