blob: 6742017a482e4d7e495e117b98ad6300db77fcd0 [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
reed@google.coma09368c2011-02-24 21:42:29 +00008#define DO_AA true
reed@android.comf2b98d62010-12-20 18:26:13 +00009
reed@android.comf76bacf2009-05-13 14:00:33 +000010#include "SkRectShape.h"
11#include "SkGroupShape.h"
12
13static SkRect make_rect(int l, int t, int r, int b) {
14 SkRect rect;
15 rect.set(SkIntToScalar(l), SkIntToScalar(t),
16 SkIntToScalar(r), SkIntToScalar(b));
17 return rect;
18}
19
reed@android.comf48f2812009-05-18 04:20:55 +000020static SkShape* make_shape0(bool red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000021 SkRectShape* s = new SkRectShape;
22 s->setRect(make_rect(10, 10, 90, 90));
reed@android.comf48f2812009-05-18 04:20:55 +000023 if (red) {
reed@android.comf76bacf2009-05-13 14:00:33 +000024 s->paint().setColor(SK_ColorRED);
25 }
reed@android.comf2b98d62010-12-20 18:26:13 +000026 s->paint().setAntiAlias(DO_AA);
reed@android.comf76bacf2009-05-13 14:00:33 +000027 return s;
28}
29
reed@android.comf48f2812009-05-18 04:20:55 +000030static SkShape* make_shape1() {
reed@android.comf76bacf2009-05-13 14:00:33 +000031 SkRectShape* s = new SkRectShape;
32 s->setOval(make_rect(10, 10, 90, 90));
reed@android.comf76bacf2009-05-13 14:00:33 +000033 s->paint().setColor(SK_ColorBLUE);
reed@android.comf2b98d62010-12-20 18:26:13 +000034 s->paint().setAntiAlias(DO_AA);
reed@android.comf76bacf2009-05-13 14:00:33 +000035 return s;
36}
37
reed@android.comf48f2812009-05-18 04:20:55 +000038static SkShape* make_shape2() {
reed@android.comf76bacf2009-05-13 14:00:33 +000039 SkRectShape* s = new SkRectShape;
40 s->setRRect(make_rect(10, 10, 90, 90),
41 SkIntToScalar(20), SkIntToScalar(20));
reed@android.comf76bacf2009-05-13 14:00:33 +000042 s->paint().setColor(SK_ColorGREEN);
reed@android.comf2b98d62010-12-20 18:26:13 +000043 s->paint().setAntiAlias(DO_AA);
reed@android.comf76bacf2009-05-13 14:00:33 +000044 return s;
45}
46
47///////////////////////////////////////////////////////////////////////////////
48
reed@google.comf2183392011-04-22 14:10:48 +000049class ShapesView : public SampleView {
reed@android.comf76bacf2009-05-13 14:00:33 +000050 SkGroupShape fGroup;
reed@android.com88c2d8e2009-05-27 01:44:24 +000051 SkMatrixRef* fMatrixRefs[4];
reed@android.comf76bacf2009-05-13 14:00:33 +000052public:
53 ShapesView() {
54 SkMatrix m;
reed@android.comf48f2812009-05-18 04:20:55 +000055 fGroup.appendShape(make_shape0(false))->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000056 m.setRotate(SkIntToScalar(30), SkIntToScalar(50), SkIntToScalar(50));
57 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000058 fGroup.appendShape(make_shape0(true), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000059
60 m.setTranslate(SkIntToScalar(120), 0);
reed@android.comf48f2812009-05-18 04:20:55 +000061 fGroup.appendShape(make_shape1(), m)->unref();
reed@android.comf76bacf2009-05-13 14:00:33 +000062 m.postTranslate(0, SkIntToScalar(120));
reed@android.comf48f2812009-05-18 04:20:55 +000063 fGroup.appendShape(make_shape2(), m)->unref();
reed@android.com88c2d8e2009-05-27 01:44:24 +000064
65 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
66 SkSafeRef(fMatrixRefs[i] = fGroup.getShapeMatrixRef(i));
67 }
reed@google.comf2183392011-04-22 14:10:48 +000068
69 this->setBGColor(0xFFDDDDDD);
reed@android.com88c2d8e2009-05-27 01:44:24 +000070 }
71
72 virtual ~ShapesView() {
73 for (size_t i = 0; i < SK_ARRAY_COUNT(fMatrixRefs); i++) {
74 SkSafeUnref(fMatrixRefs[i]);
75 }
reed@android.comf76bacf2009-05-13 14:00:33 +000076 }
77
78protected:
79 // overrides from SkEventSink
80 virtual bool onQuery(SkEvent* evt) {
81 if (SampleCode::TitleQ(*evt)) {
82 SampleCode::TitleR(evt, "Shapes");
83 return true;
84 }
85 return this->INHERITED::onQuery(evt);
86 }
87
reed@android.com0ad336f2009-06-29 16:02:20 +000088 void drawpicture(SkCanvas* canvas, SkPicture& pict) {
reed@android.comf2b98d62010-12-20 18:26:13 +000089#if 0
reed@android.com0ad336f2009-06-29 16:02:20 +000090 SkDynamicMemoryWStream ostream;
91 pict.serialize(&ostream);
92
93 SkMemoryStream istream(ostream.getStream(), ostream.getOffset());
reed@android.com8433b5d2009-07-03 02:52:27 +000094 SkPicture* newPict = new SkPicture(&istream);
95 canvas->drawPicture(*newPict);
96 newPict->unref();
reed@android.com0ad336f2009-06-29 16:02:20 +000097#else
98 canvas->drawPicture(pict);
99#endif
100 }
101
reed@google.comf2183392011-04-22 14:10:48 +0000102 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.comf2b98d62010-12-20 18:26:13 +0000103 SkScalar angle = SampleCode::GetAnimScalar(SkIntToScalar(180),
reed@android.com44177402009-11-23 21:07:51 +0000104 SkIntToScalar(360));
105
reed@android.com88c2d8e2009-05-27 01:44:24 +0000106 SkMatrix saveM = *fMatrixRefs[3];
reed@android.com88c2d8e2009-05-27 01:44:24 +0000107 SkScalar c = SkIntToScalar(50);
reed@android.com44177402009-11-23 21:07:51 +0000108 fMatrixRefs[3]->preRotate(angle, c, c);
reed@android.com88c2d8e2009-05-27 01:44:24 +0000109
reed@android.comf2b98d62010-12-20 18:26:13 +0000110 const SkScalar dx = 350;
111 const SkScalar dy = 500;
112 const int N = 1;
113 for (int v = -N; v <= N; v++) {
114 for (int h = -N; h <= N; h++) {
115 SkAutoCanvasRestore acr(canvas, true);
116 canvas->translate(h * dx, v * dy);
117
reed@android.comf76bacf2009-05-13 14:00:33 +0000118 SkMatrix matrix;
reed@android.com09b84a02009-06-26 20:22:26 +0000119
120 SkGroupShape* gs = new SkGroupShape;
121 SkAutoUnref aur(gs);
122 gs->appendShape(&fGroup);
reed@android.com88c2d8e2009-05-27 01:44:24 +0000123 matrix.setScale(-SK_Scalar1, SK_Scalar1);
124 matrix.postTranslate(SkIntToScalar(220), SkIntToScalar(240));
reed@android.com09b84a02009-06-26 20:22:26 +0000125 gs->appendShape(&fGroup, matrix);
reed@android.comf76bacf2009-05-13 14:00:33 +0000126 matrix.setTranslate(SkIntToScalar(240), 0);
127 matrix.preScale(SK_Scalar1*2, SK_Scalar1*2);
reed@android.com09b84a02009-06-26 20:22:26 +0000128 gs->appendShape(&fGroup, matrix);
129
reed@google.com5667afc2011-06-27 14:42:15 +0000130#if 1
reed@android.comf2b98d62010-12-20 18:26:13 +0000131 SkPicture* pict = new SkPicture;
132 SkCanvas* cv = pict->beginRecording(1000, 1000);
reed@android.com09b84a02009-06-26 20:22:26 +0000133 cv->scale(SK_ScalarHalf, SK_ScalarHalf);
reed@google.com5667afc2011-06-27 14:42:15 +0000134 gs->draw(cv);
reed@android.com09b84a02009-06-26 20:22:26 +0000135 cv->translate(SkIntToScalar(680), SkIntToScalar(480));
136 cv->scale(-SK_Scalar1, SK_Scalar1);
reed@google.com5667afc2011-06-27 14:42:15 +0000137 gs->draw(cv);
reed@android.comf2b98d62010-12-20 18:26:13 +0000138 pict->endRecording();
reed@android.com0ad336f2009-06-29 16:02:20 +0000139
reed@android.comf2b98d62010-12-20 18:26:13 +0000140 drawpicture(canvas, *pict);
141 pict->unref();
reed@android.comf48f2812009-05-18 04:20:55 +0000142#endif
reed@android.com88c2d8e2009-05-27 01:44:24 +0000143
reed@android.comf2b98d62010-12-20 18:26:13 +0000144 }}
145
reed@android.com88c2d8e2009-05-27 01:44:24 +0000146 *fMatrixRefs[3] = saveM;
147 this->inval(NULL);
148}
reed@android.comf76bacf2009-05-13 14:00:33 +0000149
150private:
reed@google.comf2183392011-04-22 14:10:48 +0000151 typedef SampleView INHERITED;
reed@android.comf76bacf2009-05-13 14:00:33 +0000152};
153
154///////////////////////////////////////////////////////////////////////////////
155
156static SkView* MyFactory() { return new ShapesView; }
157static SkViewRegister reg(MyFactory);
158