1 #include "gm.h"
2 #include "SkPicture.h"
3 #include "SkRectShape.h"
4 #include "SkGroupShape.h"
5
6 namespace skiagm {
7
make_rect(int l,int t,int r,int b)8 static SkRect make_rect(int l, int t, int r, int b) {
9 SkRect rect;
10 rect.set(SkIntToScalar(l), SkIntToScalar(t),
11 SkIntToScalar(r), SkIntToScalar(b));
12 return rect;
13 }
14
make_shape0(bool red)15 static SkShape* make_shape0(bool red) {
16 SkRectShape* s = new SkRectShape;
17 s->setRect(make_rect(10, 10, 90, 90));
18 if (red) {
19 s->paint().setColor(SK_ColorRED);
20 }
21 return s;
22 }
23
make_shape1()24 static SkShape* make_shape1() {
25 SkRectShape* s = new SkRectShape;
26 s->setOval(make_rect(10, 10, 90, 90));
27 s->paint().setColor(SK_ColorBLUE);
28 return s;
29 }
30
make_shape2()31 static SkShape* make_shape2() {
32 SkRectShape* s = new SkRectShape;
33 s->setRRect(make_rect(10, 10, 90, 90),
34 SkIntToScalar(20), SkIntToScalar(20));
35 s->paint().setColor(SK_ColorGREEN);
36 return s;
37 }
38
39 ///////////////////////////////////////////////////////////////////////////////
40
41 class ShapesGM : public GM {
42 SkGroupShape fGroup;
43 SkMatrixRef* fMatrixRefs[4];
44 public:
ShapesGM()45 ShapesGM() {
46 SkMatrix m;
47 fGroup.appendShape(make_shape0(false))->unref();
48 m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50));
49 m.postTranslate(0, SkIntToScalar(120));
50 fGroup.appendShape(make_shape0(true), m)->unref();
51
52 m.setTranslate(SkIntToScalar(120), 0);
53 fGroup.appendShape(make_shape1(), m)->unref();
54 m.postTranslate(0, SkIntToScalar(120));
55 fGroup.appendShape(make_shape2(), m)->unref();
56
57 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
58 SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i));
59 }
60 SkScalar c = SkIntToScalar(50);
61 fMatrixRefs[3]->preRotate(SkIntToScalar(30), c, c);
62 }
63
~ShapesGM()64 virtual ~ShapesGM() {
65 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
66 SkSafeUnref(fMatrixRefs[i]);
67 }
68 }
69
70 protected:
onShortName()71 virtual SkString onShortName() {
72 return SkString("shapes");
73 }
74
onISize()75 virtual SkISize onISize() {
76 return make_isize(380, 480);
77 }
78
drawBG(SkCanvas * canvas)79 void drawBG(SkCanvas* canvas) {
80 canvas->drawColor(0xFFDDDDDD);
81 }
82
onDraw(SkCanvas * canvas)83 virtual void onDraw(SkCanvas* canvas) {
84 this->drawBG(canvas);
85
86 SkMatrix matrix;
87
88 SkGroupShape* gs = new SkGroupShape;
89 SkAutoUnref aur(gs);
90 gs->appendShape(&fGroup);
91 matrix.setScale(-SK_Scalar1, SK_Scalar1);
92 matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240));
93 gs->appendShape(&fGroup, matrix);
94 matrix.setTranslate(SkIntToScalar(240), 0);
95 matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
96 gs->appendShape(&fGroup, matrix);
97
98 #if 0
99 canvas->drawShape(gs);
100 #else
101 SkPicture* pict = new SkPicture;
102 SkCanvas* cv = pict->beginRecording(1000, 1000);
103 cv->scale(SK_ScalarHalf, SK_ScalarHalf);
104 cv->drawShape(gs);
105 cv->translate(SkIntToScalar(680), SkIntToScalar(480));
106 cv->scale(-SK_Scalar1, SK_Scalar1);
107 cv->drawShape(gs);
108 pict->endRecording();
109 canvas->drawPicture(*pict);
110 pict->unref();
111 #endif
112 }
113
114 private:
115 typedef GM INHERITED;
116 };
117
118 ///////////////////////////////////////////////////////////////////////////////
119
MyFactory(void *)120 static GM* MyFactory(void*) { return new ShapesGM; }
121 static GMRegistry reg(MyFactory);
122
123 }
124