blob: e232a5040999c4afe412bb759faa28eb3444e64f [file] [log] [blame]
reed@android.com8a1c16f2008-12-17 15:59:43 +00001#include "SampleCode.h"
reed@android.comcb608442009-12-04 21:32:27 +00002#include "SkDumpCanvas.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00003#include "SkView.h"
4#include "SkCanvas.h"
5#include "Sk64.h"
6#include "SkGradientShader.h"
7#include "SkGraphics.h"
8#include "SkImageDecoder.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +00009#include "SkPath.h"
10#include "SkPicture.h"
11#include "SkRandom.h"
12#include "SkRegion.h"
13#include "SkShader.h"
14#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000015#include "SkColorPriv.h"
16#include "SkColorFilter.h"
17#include "SkTime.h"
18#include "SkTypeface.h"
19#include "SkXfermode.h"
20
21#include "SkStream.h"
22#include "SkXMLParser.h"
23
reed@android.comc6ddc112009-11-10 15:54:55 +000024#include "SkImageRef_GlobalPool.h"
25
26static SkBitmap load_bitmap() {
27 SkStream* stream = new SkFILEStream("/skimages/sesame_street_ensemble-hp.jpg");
28 SkAutoUnref aur(stream);
29
30 SkBitmap bm;
31 if (SkImageDecoder::DecodeStream(stream, &bm, SkBitmap::kNo_Config,
32 SkImageDecoder::kDecodeBounds_Mode)) {
33 SkPixelRef* pr = new SkImageRef_GlobalPool(stream, bm.config(), 1);
34 bm.setPixelRef(pr)->unref();
35 }
36 return bm;
37}
38
reed@android.com8a1c16f2008-12-17 15:59:43 +000039static void drawCircle(SkCanvas* canvas, int r, SkColor color) {
40 SkPaint paint;
41 paint.setAntiAlias(true);
42 paint.setColor(color);
43
44 canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r),
45 paint);
46}
47
48class PictureView : public SkView {
reed@android.comc6ddc112009-11-10 15:54:55 +000049 SkBitmap fBitmap;
reed@android.com8a1c16f2008-12-17 15:59:43 +000050public:
51 PictureView() {
reed@android.comc6ddc112009-11-10 15:54:55 +000052 SkImageRef_GlobalPool::SetRAMBudget(16 * 1024);
53
54 fBitmap = load_bitmap();
55
reed@android.com8a1c16f2008-12-17 15:59:43 +000056 fPicture = new SkPicture;
57 SkCanvas* canvas = fPicture->beginRecording(100, 100);
58 SkPaint paint;
59 paint.setAntiAlias(true);
60
reed@android.comc6ddc112009-11-10 15:54:55 +000061 canvas->drawBitmap(fBitmap, 0, 0, NULL);
62
reed@android.com8a1c16f2008-12-17 15:59:43 +000063 drawCircle(canvas, 50, SK_ColorBLACK);
64 fSubPicture = new SkPicture;
65 canvas->drawPicture(*fSubPicture);
66 canvas->translate(SkIntToScalar(50), 0);
67 canvas->drawPicture(*fSubPicture);
68 canvas->translate(0, SkIntToScalar(50));
69 canvas->drawPicture(*fSubPicture);
70 canvas->translate(SkIntToScalar(-50), 0);
71 canvas->drawPicture(*fSubPicture);
72 // fPicture now has (4) references to us. We can release ours, and just
73 // unref fPicture in our destructor, and it will in turn take care of
74 // the other references to fSubPicture
75 fSubPicture->unref();
76 }
77
78 virtual ~PictureView() {
79 fPicture->unref();
80 }
81
82protected:
83 // overrides from SkEventSink
84 virtual bool onQuery(SkEvent* evt) {
85 if (SampleCode::TitleQ(*evt)) {
86 SampleCode::TitleR(evt, "Picture");
87 return true;
88 }
89 return this->INHERITED::onQuery(evt);
90 }
91
92 void drawBG(SkCanvas* canvas) {
93// canvas->drawColor(0xFFDDDDDD);
94 canvas->drawColor(SK_ColorWHITE);
95 // canvas->drawColor(SK_ColorBLACK);
96 }
97
98 void drawSomething(SkCanvas* canvas) {
99 SkPaint paint;
reed@android.comc6ddc112009-11-10 15:54:55 +0000100
101 canvas->save();
102 canvas->scale(0.5f, 0.5f);
103 canvas->drawBitmap(fBitmap, 0, 0, NULL);
104 canvas->restore();
105
reed@android.comcb608442009-12-04 21:32:27 +0000106 const char beforeStr[] = "before circle";
107 const char afterStr[] = "after circle";
108
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109 paint.setAntiAlias(true);
110
111 paint.setColor(SK_ColorRED);
reed@android.comcb608442009-12-04 21:32:27 +0000112 canvas->drawData(beforeStr, sizeof(beforeStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000113 canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
114 SkIntToScalar(40), paint);
reed@android.comcb608442009-12-04 21:32:27 +0000115 canvas->drawData(afterStr, sizeof(afterStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116 paint.setColor(SK_ColorBLACK);
117 paint.setTextSize(SkIntToScalar(40));
118 canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
119 paint);
reed@android.comcb608442009-12-04 21:32:27 +0000120
reed@android.com8a1c16f2008-12-17 15:59:43 +0000121 }
122
123 virtual void onDraw(SkCanvas* canvas) {
124 this->drawBG(canvas);
125
126 drawSomething(canvas);
reed@android.com149e2f62009-05-22 14:39:03 +0000127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128 SkPicture* pict = new SkPicture;
129 SkAutoUnref aur(pict);
130
131 drawSomething(pict->beginRecording(100, 100));
132 pict->endRecording();
reed@android.com149e2f62009-05-22 14:39:03 +0000133
reed@android.com8a1c16f2008-12-17 15:59:43 +0000134 canvas->save();
135 canvas->translate(SkIntToScalar(300), SkIntToScalar(50));
136 canvas->scale(-SK_Scalar1, -SK_Scalar1);
137 canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50));
138 canvas->drawPicture(*pict);
139 canvas->restore();
140
141 canvas->save();
142 canvas->translate(SkIntToScalar(200), SkIntToScalar(150));
143 canvas->scale(SK_Scalar1, -SK_Scalar1);
144 canvas->translate(0, -SkIntToScalar(50));
145 canvas->drawPicture(*pict);
146 canvas->restore();
147
148 canvas->save();
149 canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
150 canvas->scale(-SK_Scalar1, SK_Scalar1);
151 canvas->translate(-SkIntToScalar(100), 0);
152 canvas->drawPicture(*pict);
153 canvas->restore();
reed@android.comcb608442009-12-04 21:32:27 +0000154
155 if (false) {
156 SkDebugfDumper dumper;
157 SkDumpCanvas dumpCanvas(&dumper);
158 dumpCanvas.drawPicture(*pict);
159 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000160
161 // test that we can re-record a subpicture, and see the results
162
reed@android.com44177402009-11-23 21:07:51 +0000163 SkRandom rand(SampleCode::GetAnimTime());
reed@android.com8a1c16f2008-12-17 15:59:43 +0000164 canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
165 drawCircle(fSubPicture->beginRecording(50, 50), 25,
reed@android.com44177402009-11-23 21:07:51 +0000166 rand.nextU() | 0xFF000000);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000167 canvas->drawPicture(*fPicture);
168 delayInval(500);
169 }
170
171private:
172 #define INVAL_ALL_TYPE "inval-all"
173
174 void delayInval(SkMSec delay) {
175 (new SkEvent(INVAL_ALL_TYPE))->post(this->getSinkID(), delay);
176 }
177
178 virtual bool onEvent(const SkEvent& evt) {
179 if (evt.isType(INVAL_ALL_TYPE)) {
180 this->inval(NULL);
181 return true;
182 }
183 return this->INHERITED::onEvent(evt);
184 }
185
186 SkPicture* fPicture;
187 SkPicture* fSubPicture;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000188
189 typedef SkView INHERITED;
190};
191
192//////////////////////////////////////////////////////////////////////////////
193
194static SkView* MyFactory() { return new PictureView; }
195static SkViewRegister reg(MyFactory);
196