blob: b92614b75641ec7fcebabd8efba01142198a0251 [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.com0ad336f2009-06-29 16:02:20 +00005#include "SkStream.h"
reed@android.comf76bacf2009-05-13 14:00:33 +00006#include "SkView.h"
7
8#include "SkRectShape.h"
9#include "SkGroupShape.h"
10
11static SkRect make_rect(int l, int t, int r, int b) {
12 SkRect rect;
13 rect.set(SkIntToScalar(l), SkIntToScalar(t),
14 SkIntToScalar(r), SkIntToScalar(b));
15 return rect;
16}
17
reed@android.comf48f2812009-05-18 04:20:55 +000018static SkShape* make_shape0(bool red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000019 SkRectShape* s = new SkRectShape;
20 s->setRect(make_rect(10, 10, 90, 90));
reed@android.comf48f2812009-05-18 04:20:55 +000021 if (red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000022 s->paint().setColor(SK_ColorRED);
23 }
24 return s;
25}
26
reed@android.comf48f2812009-05-18 04:20:55 +000027static SkShape* make_shape1() {
reed@android.comf76bacf2009-05-13 14:00:33 +000028 SkRectShape* s = new SkRectShape;
29 s->setOval(make_rect(10, 10, 90, 90));
reed@android.comf76bacf2009-05-13 14:00:33 +000030 s->paint().setColor(SK_ColorBLUE);
31 return s;
32}
33
reed@android.comf48f2812009-05-18 04:20:55 +000034static SkShape* make_shape2() {
reed@android.comf76bacf2009-05-13 14:00:33 +000035 SkRectShape* s = new SkRectShape;
36 s->setRRect(make_rect(10, 10, 90, 90),
37 SkIntToScalar(20), SkIntToScalar(20));
reed@android.comf76bacf2009-05-13 14:00:33 +000038 s->paint().setColor(SK_ColorGREEN);
39 return s;
40}
41
42///////////////////////////////////////////////////////////////////////////////
43
44class ShapesView : public SkView {
45 SkGroupShape fGroup;
reed@android.com88c2d8e2009-05-27 01:44:24 +000046 SkMatrixRef* fMatrixRefs[4];
reed@android.comf76bacf2009-05-13 14:00:33 +000047public:
48 ShapesView() {
49 SkMatrix m;
reed@android.comf48f2812009-05-18 04:20:55 +000050 fGroup.appendShape(make_shape0(false))->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000051 m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50));
52 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000053 fGroup.appendShape(make_shape0(true), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000054
55 m.setTranslate(SkIntToScalar(120), 0);
reed@android.comf48f2812009-05-18 04:20:55 +000056 fGroup.appendShape(make_shape1(), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000057 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000058 fGroup.appendShape(make_shape2(), m)->unref();
reed@android.com88c2d8e2009-05-27 01:44:24 +000059
60 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
61 SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i));
62 }
reed@android.com88c2d8e2009-05-27 01:44:24 +000063 }
64
65 virtual ~ShapesView() {
66 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
67 SkSafeUnref(fMatrixRefs[i]);
68 }
reed@android.comf76bacf2009-05-13 14:00:33 +000069 }
70
71protected:
72 // overrides from SkEventSink
73 virtual bool onQuery(SkEvent* evt) {
74 if (SampleCode::TitleQ(*evt)) {
75 SampleCode::TitleR(evt, "Shapes");
76 return true;
77 }
78 return this->INHERITED::onQuery(evt);
79 }
80
81 void drawBG(SkCanvas* canvas) {
82 canvas->drawColor(0xFFDDDDDD);
83 }
84
reed@android.com0ad336f2009-06-29 16:02:20 +000085 void drawpicture(SkCanvas* canvas, SkPicture& pict) {
86#if 1
87 SkDynamicMemoryWStream ostream;
88 pict.serialize(&ostream);
89
90 SkMemoryStream istream(ostream.getStream(), ostream.getOffset());
reed@android.com8433b5d2009-07-03 02:52:27 +000091 SkPicture* newPict = new SkPicture(&istream);
92 canvas->drawPicture(*newPict);
93 newPict->unref();
reed@android.com0ad336f2009-06-29 16:02:20 +000094#else
95 canvas->drawPicture(pict);
96#endif
97 }
98
reed@android.comf76bacf2009-05-13 14:00:33 +000099 virtual void onDraw(SkCanvas* canvas) {
100 this->drawBG(canvas);
101
reed@android.com44177402009-11-23 21:07:51 +0000102 SkScalar angle = SampleCode::GetAnimScalar(SkIntToScalar(360)/2,
103 SkIntToScalar(360));
104
reed@android.com88c2d8e2009-05-27 01:44:24 +0000105 SkMatrix saveM = *fMatrixRefs[3];
reed@android.com88c2d8e2009-05-27 01:44:24 +0000106 SkScalar c = SkIntToScalar(50);
reed@android.com44177402009-11-23 21:07:51 +0000107 fMatrixRefs[3]->preRotate(angle, c, c);
reed@android.com88c2d8e2009-05-27 01:44:24 +0000108
reed@android.comf76bacf2009-05-13 14:00:33 +0000109 SkMatrix matrix;
reed@android.com09b84a02009-06-26 20:22:26 +0000110
111 SkGroupShape* gs = new SkGroupShape;
112 SkAutoUnref aur(gs);
113 gs->appendShape(&fGroup);
reed@android.com88c2d8e2009-05-27 01:44:24 +0000114 matrix.setScale(-SK_Scalar1, SK_Scalar1);
115 matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240));
reed@android.com09b84a02009-06-26 20:22:26 +0000116 gs->appendShape(&fGroup, matrix);
reed@android.comf76bacf2009-05-13 14:00:33 +0000117 matrix.setTranslate(SkIntToScalar(240), 0);
118 matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
reed@android.com09b84a02009-06-26 20:22:26 +0000119 gs->appendShape(&fGroup, matrix);
120
reed@android.com0ad336f2009-06-29 16:02:20 +0000121#if 0
reed@android.com09b84a02009-06-26 20:22:26 +0000122 canvas->drawShape(gs);
reed@android.comf48f2812009-05-18 04:20:55 +0000123#else
reed@android.com09b84a02009-06-26 20:22:26 +0000124 SkPicture pict;
125 SkCanvas* cv = pict.beginRecording(1000, 1000);
126 cv->scale(SK_ScalarHalf, SK_ScalarHalf);
127 cv->drawShape(gs);
128 cv->translate(SkIntToScalar(680), SkIntToScalar(480));
129 cv->scale(-SK_Scalar1, SK_Scalar1);
130 cv->drawShape(gs);
131 pict.endRecording();
reed@android.com0ad336f2009-06-29 16:02:20 +0000132
133 drawpicture(canvas, pict);
reed@android.comf48f2812009-05-18 04:20:55 +0000134#endif
reed@android.com88c2d8e2009-05-27 01:44:24 +0000135
136 *fMatrixRefs[3] = saveM;
137 this->inval(NULL);
138}
reed@android.comf76bacf2009-05-13 14:00:33 +0000139
140private:
141 typedef SkView INHERITED;
142};
143
144///////////////////////////////////////////////////////////////////////////////
145
146static SkView* MyFactory() { return new ShapesView; }
147static SkViewRegister reg(MyFactory);
148