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