blob: 4ca5b2a7d6a19f98daf4024f7e3aea5a5c5d8785 [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"
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.com8a1c16f2008-12-17 15:59:43 +0000106 paint.setAntiAlias(true);
107
108 paint.setColor(SK_ColorRED);
109 canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
110 SkIntToScalar(40), paint);
111 paint.setColor(SK_ColorBLACK);
112 paint.setTextSize(SkIntToScalar(40));
113 canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
114 paint);
115 }
116
117 virtual void onDraw(SkCanvas* canvas) {
118 this->drawBG(canvas);
119
120 drawSomething(canvas);
reed@android.com149e2f62009-05-22 14:39:03 +0000121
reed@android.com8a1c16f2008-12-17 15:59:43 +0000122 SkPicture* pict = new SkPicture;
123 SkAutoUnref aur(pict);
124
125 drawSomething(pict->beginRecording(100, 100));
126 pict->endRecording();
reed@android.com149e2f62009-05-22 14:39:03 +0000127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128 canvas->save();
129 canvas->translate(SkIntToScalar(300), SkIntToScalar(50));
130 canvas->scale(-SK_Scalar1, -SK_Scalar1);
131 canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50));
132 canvas->drawPicture(*pict);
133 canvas->restore();
134
135 canvas->save();
136 canvas->translate(SkIntToScalar(200), SkIntToScalar(150));
137 canvas->scale(SK_Scalar1, -SK_Scalar1);
138 canvas->translate(0, -SkIntToScalar(50));
139 canvas->drawPicture(*pict);
140 canvas->restore();
141
142 canvas->save();
143 canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
144 canvas->scale(-SK_Scalar1, SK_Scalar1);
145 canvas->translate(-SkIntToScalar(100), 0);
146 canvas->drawPicture(*pict);
147 canvas->restore();
148
149 // test that we can re-record a subpicture, and see the results
150
151 canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
152 drawCircle(fSubPicture->beginRecording(50, 50), 25,
153 fRand.nextU() | 0xFF000000);
154 canvas->drawPicture(*fPicture);
155 delayInval(500);
156 }
157
158private:
159 #define INVAL_ALL_TYPE "inval-all"
160
161 void delayInval(SkMSec delay) {
162 (new SkEvent(INVAL_ALL_TYPE))->post(this->getSinkID(), delay);
163 }
164
165 virtual bool onEvent(const SkEvent& evt) {
166 if (evt.isType(INVAL_ALL_TYPE)) {
167 this->inval(NULL);
168 return true;
169 }
170 return this->INHERITED::onEvent(evt);
171 }
172
173 SkPicture* fPicture;
174 SkPicture* fSubPicture;
175 SkRandom fRand;
176
177 typedef SkView INHERITED;
178};
179
180//////////////////////////////////////////////////////////////////////////////
181
182static SkView* MyFactory() { return new PictureView; }
183static SkViewRegister reg(MyFactory);
184