blob: 585b2f20f163493c8abb0cfe44fcbd7eb4c16e45 [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.com7d970c72010-04-22 16:07:49 +000024///////////////////////////////////////////////////////////////////////////////
25
reed@android.comc6ddc112009-11-10 15:54:55 +000026#include "SkImageRef_GlobalPool.h"
27
28static SkBitmap load_bitmap() {
29 SkStream* stream = new SkFILEStream("/skimages/sesame_street_ensemble-hp.jpg");
30 SkAutoUnref aur(stream);
31
32 SkBitmap bm;
33 if (SkImageDecoder::DecodeStream(stream, &bm, SkBitmap::kNo_Config,
34 SkImageDecoder::kDecodeBounds_Mode)) {
35 SkPixelRef* pr = new SkImageRef_GlobalPool(stream, bm.config(), 1);
36 bm.setPixelRef(pr)->unref();
37 }
38 return bm;
39}
40
reed@android.com8a1c16f2008-12-17 15:59:43 +000041static void drawCircle(SkCanvas* canvas, int r, SkColor color) {
42 SkPaint paint;
43 paint.setAntiAlias(true);
44 paint.setColor(color);
45
46 canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r),
47 paint);
48}
49
mike@reedtribe.org5fd92432011-05-05 01:59:48 +000050class PictureView : public SampleView {
reed@android.comc6ddc112009-11-10 15:54:55 +000051 SkBitmap fBitmap;
reed@android.com8a1c16f2008-12-17 15:59:43 +000052public:
53 PictureView() {
reed@android.comc6ddc112009-11-10 15:54:55 +000054 SkImageRef_GlobalPool::SetRAMBudget(16 * 1024);
55
56 fBitmap = load_bitmap();
57
reed@android.com8a1c16f2008-12-17 15:59:43 +000058 fPicture = new SkPicture;
59 SkCanvas* canvas = fPicture->beginRecording(100, 100);
60 SkPaint paint;
61 paint.setAntiAlias(true);
62
reed@android.comc6ddc112009-11-10 15:54:55 +000063 canvas->drawBitmap(fBitmap, 0, 0, NULL);
64
reed@android.com8a1c16f2008-12-17 15:59:43 +000065 drawCircle(canvas, 50, SK_ColorBLACK);
66 fSubPicture = new SkPicture;
67 canvas->drawPicture(*fSubPicture);
68 canvas->translate(SkIntToScalar(50), 0);
69 canvas->drawPicture(*fSubPicture);
70 canvas->translate(0, SkIntToScalar(50));
71 canvas->drawPicture(*fSubPicture);
72 canvas->translate(SkIntToScalar(-50), 0);
73 canvas->drawPicture(*fSubPicture);
74 // fPicture now has (4) references to us. We can release ours, and just
75 // unref fPicture in our destructor, and it will in turn take care of
76 // the other references to fSubPicture
77 fSubPicture->unref();
78 }
79
80 virtual ~PictureView() {
81 fPicture->unref();
82 }
83
84protected:
85 // overrides from SkEventSink
86 virtual bool onQuery(SkEvent* evt) {
87 if (SampleCode::TitleQ(*evt)) {
88 SampleCode::TitleR(evt, "Picture");
89 return true;
90 }
91 return this->INHERITED::onQuery(evt);
92 }
93
reed@android.com8a1c16f2008-12-17 15:59:43 +000094 void drawSomething(SkCanvas* canvas) {
95 SkPaint paint;
reed@android.comc6ddc112009-11-10 15:54:55 +000096
97 canvas->save();
98 canvas->scale(0.5f, 0.5f);
99 canvas->drawBitmap(fBitmap, 0, 0, NULL);
100 canvas->restore();
101
reed@android.comcb608442009-12-04 21:32:27 +0000102 const char beforeStr[] = "before circle";
103 const char afterStr[] = "after circle";
104
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 paint.setAntiAlias(true);
106
107 paint.setColor(SK_ColorRED);
reed@android.comcb608442009-12-04 21:32:27 +0000108 canvas->drawData(beforeStr, sizeof(beforeStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000109 canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
110 SkIntToScalar(40), paint);
reed@android.comcb608442009-12-04 21:32:27 +0000111 canvas->drawData(afterStr, sizeof(afterStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000112 paint.setColor(SK_ColorBLACK);
113 paint.setTextSize(SkIntToScalar(40));
114 canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
115 paint);
reed@android.comcb608442009-12-04 21:32:27 +0000116
reed@android.com8a1c16f2008-12-17 15:59:43 +0000117 }
118
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000119 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120 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();
reed@android.comcb608442009-12-04 21:32:27 +0000148
149 if (false) {
150 SkDebugfDumper dumper;
151 SkDumpCanvas dumpCanvas(&dumper);
152 dumpCanvas.drawPicture(*pict);
153 }
reed@android.com8a1c16f2008-12-17 15:59:43 +0000154
155 // test that we can re-record a subpicture, and see the results
156
reed@android.com44177402009-11-23 21:07:51 +0000157 SkRandom rand(SampleCode::GetAnimTime());
reed@android.com8a1c16f2008-12-17 15:59:43 +0000158 canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
159 drawCircle(fSubPicture->beginRecording(50, 50), 25,
reed@android.com44177402009-11-23 21:07:51 +0000160 rand.nextU() | 0xFF000000);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000161 canvas->drawPicture(*fPicture);
162 delayInval(500);
163 }
164
165private:
166 #define INVAL_ALL_TYPE "inval-all"
167
168 void delayInval(SkMSec delay) {
169 (new SkEvent(INVAL_ALL_TYPE))->post(this->getSinkID(), delay);
170 }
171
172 virtual bool onEvent(const SkEvent& evt) {
173 if (evt.isType(INVAL_ALL_TYPE)) {
174 this->inval(NULL);
175 return true;
176 }
177 return this->INHERITED::onEvent(evt);
178 }
179
180 SkPicture* fPicture;
181 SkPicture* fSubPicture;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000182
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000183 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000184};
185
186//////////////////////////////////////////////////////////////////////////////
187
188static SkView* MyFactory() { return new PictureView; }
189static SkViewRegister reg(MyFactory);
190