blob: 48de7dfdcb2e5986dc3c702cd0ab481e6b36ee84 [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
2#include "SkView.h"
3#include "SkCanvas.h"
4#include "Sk64.h"
5#include "SkGradientShader.h"
6#include "SkGraphics.h"
7#include "SkImageDecoder.h"
8#include "SkKernel33MaskFilter.h"
9#include "SkPath.h"
10#include "SkPicture.h"
11#include "SkRandom.h"
12#include "SkRegion.h"
13#include "SkShader.h"
14#include "SkUtils.h"
15#include "SkShaderExtras.h"
16#include "SkColorPriv.h"
17#include "SkColorFilter.h"
18#include "SkTime.h"
19#include "SkTypeface.h"
20#include "SkXfermode.h"
21
22#include "SkStream.h"
23#include "SkXMLParser.h"
24
25static void drawCircle(SkCanvas* canvas, int r, SkColor color) {
26 SkPaint paint;
27 paint.setAntiAlias(true);
28 paint.setColor(color);
29
30 canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r),
31 paint);
32}
33
34class PictureView : public SkView {
35public:
36 PictureView() {
37 fPicture = new SkPicture;
38 SkCanvas* canvas = fPicture->beginRecording(100, 100);
39 SkPaint paint;
40 paint.setAntiAlias(true);
41
42 drawCircle(canvas, 50, SK_ColorBLACK);
43 fSubPicture = new SkPicture;
44 canvas->drawPicture(*fSubPicture);
45 canvas->translate(SkIntToScalar(50), 0);
46 canvas->drawPicture(*fSubPicture);
47 canvas->translate(0, SkIntToScalar(50));
48 canvas->drawPicture(*fSubPicture);
49 canvas->translate(SkIntToScalar(-50), 0);
50 canvas->drawPicture(*fSubPicture);
51 // fPicture now has (4) references to us. We can release ours, and just
52 // unref fPicture in our destructor, and it will in turn take care of
53 // the other references to fSubPicture
54 fSubPicture->unref();
55 }
56
57 virtual ~PictureView() {
58 fPicture->unref();
59 }
60
61protected:
62 // overrides from SkEventSink
63 virtual bool onQuery(SkEvent* evt) {
64 if (SampleCode::TitleQ(*evt)) {
65 SampleCode::TitleR(evt, "Picture");
66 return true;
67 }
68 return this->INHERITED::onQuery(evt);
69 }
70
71 void drawBG(SkCanvas* canvas) {
72// canvas->drawColor(0xFFDDDDDD);
73 canvas->drawColor(SK_ColorWHITE);
74 // canvas->drawColor(SK_ColorBLACK);
75 }
76
77 void drawSomething(SkCanvas* canvas) {
78 SkPaint paint;
79
80 paint.setAntiAlias(true);
81
82 paint.setColor(SK_ColorRED);
83 canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
84 SkIntToScalar(40), paint);
85 paint.setColor(SK_ColorBLACK);
86 paint.setTextSize(SkIntToScalar(40));
87 canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
88 paint);
89 }
90
91 virtual void onDraw(SkCanvas* canvas) {
92 this->drawBG(canvas);
93
94 drawSomething(canvas);
95
96 SkPicture* pict = new SkPicture;
97 SkAutoUnref aur(pict);
98
99 drawSomething(pict->beginRecording(100, 100));
100 pict->endRecording();
101
102 canvas->save();
103 canvas->translate(SkIntToScalar(300), SkIntToScalar(50));
104 canvas->scale(-SK_Scalar1, -SK_Scalar1);
105 canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50));
106 canvas->drawPicture(*pict);
107 canvas->restore();
108
109 canvas->save();
110 canvas->translate(SkIntToScalar(200), SkIntToScalar(150));
111 canvas->scale(SK_Scalar1, -SK_Scalar1);
112 canvas->translate(0, -SkIntToScalar(50));
113 canvas->drawPicture(*pict);
114 canvas->restore();
115
116 canvas->save();
117 canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
118 canvas->scale(-SK_Scalar1, SK_Scalar1);
119 canvas->translate(-SkIntToScalar(100), 0);
120 canvas->drawPicture(*pict);
121 canvas->restore();
122
123 // test that we can re-record a subpicture, and see the results
124
125 canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
126 drawCircle(fSubPicture->beginRecording(50, 50), 25,
127 fRand.nextU() | 0xFF000000);
128 canvas->drawPicture(*fPicture);
129 delayInval(500);
130 }
131
132private:
133 #define INVAL_ALL_TYPE "inval-all"
134
135 void delayInval(SkMSec delay) {
136 (new SkEvent(INVAL_ALL_TYPE))->post(this->getSinkID(), delay);
137 }
138
139 virtual bool onEvent(const SkEvent& evt) {
140 if (evt.isType(INVAL_ALL_TYPE)) {
141 this->inval(NULL);
142 return true;
143 }
144 return this->INHERITED::onEvent(evt);
145 }
146
147 SkPicture* fPicture;
148 SkPicture* fSubPicture;
149 SkRandom fRand;
150
151 typedef SkView INHERITED;
152};
153
154//////////////////////////////////////////////////////////////////////////////
155
156static SkView* MyFactory() { return new PictureView; }
157static SkViewRegister reg(MyFactory);
158