blob: 81f6e4f6b1188e0e0dd938d8cb55a4b170fcb618 [file] [log] [blame]
reed@android.comf76bacf2009-05-13 14:00:33 +00001#include "SampleCode.h"
2#include "SkCanvas.h"
3#include "SkPaint.h"
reed@android.com09b84a02009-06-26 20:22:26 +00004#include "SkPicture.h"
reed@android.comf76bacf2009-05-13 14:00:33 +00005#include "SkView.h"
6
7#include "SkRectShape.h"
8#include "SkGroupShape.h"
9
10static SkRect make_rect(int l, int t, int r, int b) {
11 SkRect rect;
12 rect.set(SkIntToScalar(l), SkIntToScalar(t),
13 SkIntToScalar(r), SkIntToScalar(b));
14 return rect;
15}
16
reed@android.comf48f2812009-05-18 04:20:55 +000017static SkShape* make_shape0(bool red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000018 SkRectShape* s = new SkRectShape;
19 s->setRect(make_rect(10, 10, 90, 90));
reed@android.comf48f2812009-05-18 04:20:55 +000020 if (red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000021 s->paint().setColor(SK_ColorRED);
22 }
23 return s;
24}
25
reed@android.comf48f2812009-05-18 04:20:55 +000026static SkShape* make_shape1() {
reed@android.comf76bacf2009-05-13 14:00:33 +000027 SkRectShape* s = new SkRectShape;
28 s->setOval(make_rect(10, 10, 90, 90));
reed@android.comf76bacf2009-05-13 14:00:33 +000029 s->paint().setColor(SK_ColorBLUE);
30 return s;
31}
32
reed@android.comf48f2812009-05-18 04:20:55 +000033static SkShape* make_shape2() {
reed@android.comf76bacf2009-05-13 14:00:33 +000034 SkRectShape* s = new SkRectShape;
35 s->setRRect(make_rect(10, 10, 90, 90),
36 SkIntToScalar(20), SkIntToScalar(20));
reed@android.comf76bacf2009-05-13 14:00:33 +000037 s->paint().setColor(SK_ColorGREEN);
38 return s;
39}
40
41///////////////////////////////////////////////////////////////////////////////
42
43class ShapesView : public SkView {
44 SkGroupShape fGroup;
reed@android.com88c2d8e2009-05-27 01:44:24 +000045 SkMatrixRef* fMatrixRefs[4];
reed@android.comf76bacf2009-05-13 14:00:33 +000046public:
47 ShapesView() {
48 SkMatrix m;
reed@android.comf48f2812009-05-18 04:20:55 +000049 fGroup.appendShape(make_shape0(false))->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000050 m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50));
51 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000052 fGroup.appendShape(make_shape0(true), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000053
54 m.setTranslate(SkIntToScalar(120), 0);
reed@android.comf48f2812009-05-18 04:20:55 +000055 fGroup.appendShape(make_shape1(), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000056 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000057 fGroup.appendShape(make_shape2(), m)->unref();
reed@android.com88c2d8e2009-05-27 01:44:24 +000058
59 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
60 SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i));
61 }
62
63 fAngle = 0;
64 }
65
66 virtual ~ShapesView() {
67 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
68 SkSafeUnref(fMatrixRefs[i]);
69 }
reed@android.comf76bacf2009-05-13 14:00:33 +000070 }
71
72protected:
73 // overrides from SkEventSink
74 virtual bool onQuery(SkEvent* evt) {
75 if (SampleCode::TitleQ(*evt)) {
76 SampleCode::TitleR(evt, "Shapes");
77 return true;
78 }
79 return this->INHERITED::onQuery(evt);
80 }
81
82 void drawBG(SkCanvas* canvas) {
83 canvas->drawColor(0xFFDDDDDD);
84 }
85
reed@android.com88c2d8e2009-05-27 01:44:24 +000086 int fAngle;
87
reed@android.comf76bacf2009-05-13 14:00:33 +000088 virtual void onDraw(SkCanvas* canvas) {
89 this->drawBG(canvas);
90
reed@android.com88c2d8e2009-05-27 01:44:24 +000091 SkMatrix saveM = *fMatrixRefs[3];
92 fAngle = (fAngle + 5) % 360;
93 SkScalar c = SkIntToScalar(50);
94 fMatrixRefs[3]->preRotate(SkIntToScalar(fAngle), c, c);
95
reed@android.comf76bacf2009-05-13 14:00:33 +000096 SkMatrix matrix;
reed@android.com09b84a02009-06-26 20:22:26 +000097
98 SkGroupShape* gs = new SkGroupShape;
99 SkAutoUnref aur(gs);
100 gs->appendShape(&fGroup);
reed@android.com88c2d8e2009-05-27 01:44:24 +0000101 matrix.setScale(-SK_Scalar1, SK_Scalar1);
102 matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240));
reed@android.com09b84a02009-06-26 20:22:26 +0000103 gs->appendShape(&fGroup, matrix);
reed@android.comf76bacf2009-05-13 14:00:33 +0000104 matrix.setTranslate(SkIntToScalar(240), 0);
105 matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
reed@android.com09b84a02009-06-26 20:22:26 +0000106 gs->appendShape(&fGroup, matrix);
107
108#if 0
109 canvas->drawShape(gs);
reed@android.comf48f2812009-05-18 04:20:55 +0000110#else
reed@android.com09b84a02009-06-26 20:22:26 +0000111 SkPicture pict;
112 SkCanvas* cv = pict.beginRecording(1000, 1000);
113 cv->scale(SK_ScalarHalf, SK_ScalarHalf);
114 cv->drawShape(gs);
115 cv->translate(SkIntToScalar(680), SkIntToScalar(480));
116 cv->scale(-SK_Scalar1, SK_Scalar1);
117 cv->drawShape(gs);
118 pict.endRecording();
119 canvas->drawPicture(pict);
reed@android.comf48f2812009-05-18 04:20:55 +0000120#endif
reed@android.com88c2d8e2009-05-27 01:44:24 +0000121
122 *fMatrixRefs[3] = saveM;
123 this->inval(NULL);
124}
reed@android.comf76bacf2009-05-13 14:00:33 +0000125
126private:
127 typedef SkView INHERITED;
128};
129
130///////////////////////////////////////////////////////////////////////////////
131
132static SkView* MyFactory() { return new ShapesView; }
133static SkViewRegister reg(MyFactory);
134