blob: 2f7d691d17af7b18aa64d556e59ffd9560b3982e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
2/*
3 * Copyright 2011 Google Inc.
4 *
5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
7 */
reed@android.com8a1c16f2008-12-17 15:59:43 +00008#include "SampleCode.h"
reed@android.comcb608442009-12-04 21:32:27 +00009#include "SkDumpCanvas.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000010#include "SkView.h"
11#include "SkCanvas.h"
12#include "Sk64.h"
13#include "SkGradientShader.h"
14#include "SkGraphics.h"
15#include "SkImageDecoder.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000016#include "SkPath.h"
17#include "SkPicture.h"
18#include "SkRandom.h"
19#include "SkRegion.h"
20#include "SkShader.h"
21#include "SkUtils.h"
reed@android.com8a1c16f2008-12-17 15:59:43 +000022#include "SkColorPriv.h"
23#include "SkColorFilter.h"
24#include "SkTime.h"
25#include "SkTypeface.h"
26#include "SkXfermode.h"
27
28#include "SkStream.h"
29#include "SkXMLParser.h"
30
reed@android.com7d970c72010-04-22 16:07:49 +000031///////////////////////////////////////////////////////////////////////////////
32
reed@android.comc6ddc112009-11-10 15:54:55 +000033#include "SkImageRef_GlobalPool.h"
34
35static SkBitmap load_bitmap() {
reed@android.comc6ddc112009-11-10 15:54:55 +000036 SkBitmap bm;
scroggo@google.comb5571b32013-09-25 21:34:24 +000037 SkStreamAsset* stream = SkStream::NewFromFile("/skimages/sesame_street_ensemble-hp.jpg");
reed@google.com84cfce12013-05-29 19:22:20 +000038 if (stream) {
39 SkAutoUnref aur(stream);
40
41 if (SkImageDecoder::DecodeStream(stream, &bm, SkBitmap::kNo_Config,
42 SkImageDecoder::kDecodeBounds_Mode)) {
reed@google.com473f0aa2013-12-06 20:31:45 +000043 SkImageInfo info;
44 bm.asImageInfo(&info);
45 SkPixelRef* pr = new SkImageRef_GlobalPool(info, stream, 1);
reed@google.com84cfce12013-05-29 19:22:20 +000046 bm.setPixelRef(pr)->unref();
47 }
reed@android.comc6ddc112009-11-10 15:54:55 +000048 }
49 return bm;
50}
51
reed@android.com8a1c16f2008-12-17 15:59:43 +000052static void drawCircle(SkCanvas* canvas, int r, SkColor color) {
53 SkPaint paint;
54 paint.setAntiAlias(true);
55 paint.setColor(color);
56
57 canvas->drawCircle(SkIntToScalar(r), SkIntToScalar(r), SkIntToScalar(r),
58 paint);
59}
60
mike@reedtribe.org5fd92432011-05-05 01:59:48 +000061class PictureView : public SampleView {
reed@android.comc6ddc112009-11-10 15:54:55 +000062 SkBitmap fBitmap;
reed@android.com8a1c16f2008-12-17 15:59:43 +000063public:
robertphillips@google.com6853e802012-04-16 15:50:18 +000064 PictureView() {
reed@android.comc6ddc112009-11-10 15:54:55 +000065 SkImageRef_GlobalPool::SetRAMBudget(16 * 1024);
66
67 fBitmap = load_bitmap();
68
reed@android.com8a1c16f2008-12-17 15:59:43 +000069 fPicture = new SkPicture;
70 SkCanvas* canvas = fPicture->beginRecording(100, 100);
71 SkPaint paint;
72 paint.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +000073
reed@android.comc6ddc112009-11-10 15:54:55 +000074 canvas->drawBitmap(fBitmap, 0, 0, NULL);
75
reed@android.com8a1c16f2008-12-17 15:59:43 +000076 drawCircle(canvas, 50, SK_ColorBLACK);
77 fSubPicture = new SkPicture;
78 canvas->drawPicture(*fSubPicture);
79 canvas->translate(SkIntToScalar(50), 0);
80 canvas->drawPicture(*fSubPicture);
81 canvas->translate(0, SkIntToScalar(50));
82 canvas->drawPicture(*fSubPicture);
83 canvas->translate(SkIntToScalar(-50), 0);
84 canvas->drawPicture(*fSubPicture);
85 // fPicture now has (4) references to us. We can release ours, and just
86 // unref fPicture in our destructor, and it will in turn take care of
87 // the other references to fSubPicture
88 fSubPicture->unref();
89 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000090
reed@android.com8a1c16f2008-12-17 15:59:43 +000091 virtual ~PictureView() {
92 fPicture->unref();
93 }
rmistry@google.comae933ce2012-08-23 18:19:56 +000094
reed@android.com8a1c16f2008-12-17 15:59:43 +000095protected:
96 // overrides from SkEventSink
97 virtual bool onQuery(SkEvent* evt) {
98 if (SampleCode::TitleQ(*evt)) {
99 SampleCode::TitleR(evt, "Picture");
100 return true;
101 }
102 return this->INHERITED::onQuery(evt);
103 }
104
reed@android.com8a1c16f2008-12-17 15:59:43 +0000105 void drawSomething(SkCanvas* canvas) {
106 SkPaint paint;
reed@android.comc6ddc112009-11-10 15:54:55 +0000107
108 canvas->save();
commit-bot@chromium.org4b413c82013-11-25 19:44:07 +0000109 canvas->scale(0.5f, 0.5f);
reed@android.comc6ddc112009-11-10 15:54:55 +0000110 canvas->drawBitmap(fBitmap, 0, 0, NULL);
111 canvas->restore();
112
reed@android.comcb608442009-12-04 21:32:27 +0000113 const char beforeStr[] = "before circle";
114 const char afterStr[] = "after circle";
115
reed@android.com8a1c16f2008-12-17 15:59:43 +0000116 paint.setAntiAlias(true);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000117
reed@android.com8a1c16f2008-12-17 15:59:43 +0000118 paint.setColor(SK_ColorRED);
reed@android.comcb608442009-12-04 21:32:27 +0000119 canvas->drawData(beforeStr, sizeof(beforeStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000120 canvas->drawCircle(SkIntToScalar(50), SkIntToScalar(50),
121 SkIntToScalar(40), paint);
reed@android.comcb608442009-12-04 21:32:27 +0000122 canvas->drawData(afterStr, sizeof(afterStr));
reed@android.com8a1c16f2008-12-17 15:59:43 +0000123 paint.setColor(SK_ColorBLACK);
124 paint.setTextSize(SkIntToScalar(40));
125 canvas->drawText("Picture", 7, SkIntToScalar(50), SkIntToScalar(62),
126 paint);
rmistry@google.comae933ce2012-08-23 18:19:56 +0000127
reed@android.com8a1c16f2008-12-17 15:59:43 +0000128 }
129
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000130 virtual void onDrawContent(SkCanvas* canvas) {
reed@android.com8a1c16f2008-12-17 15:59:43 +0000131 drawSomething(canvas);
reed@android.com149e2f62009-05-22 14:39:03 +0000132
reed@android.com8a1c16f2008-12-17 15:59:43 +0000133 SkPicture* pict = new SkPicture;
134 SkAutoUnref aur(pict);
135
136 drawSomething(pict->beginRecording(100, 100));
137 pict->endRecording();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000138
reed@android.com8a1c16f2008-12-17 15:59:43 +0000139 canvas->save();
140 canvas->translate(SkIntToScalar(300), SkIntToScalar(50));
141 canvas->scale(-SK_Scalar1, -SK_Scalar1);
142 canvas->translate(-SkIntToScalar(100), -SkIntToScalar(50));
143 canvas->drawPicture(*pict);
144 canvas->restore();
145
146 canvas->save();
147 canvas->translate(SkIntToScalar(200), SkIntToScalar(150));
148 canvas->scale(SK_Scalar1, -SK_Scalar1);
149 canvas->translate(0, -SkIntToScalar(50));
150 canvas->drawPicture(*pict);
151 canvas->restore();
rmistry@google.comae933ce2012-08-23 18:19:56 +0000152
reed@android.com8a1c16f2008-12-17 15:59:43 +0000153 canvas->save();
154 canvas->translate(SkIntToScalar(100), SkIntToScalar(100));
155 canvas->scale(-SK_Scalar1, SK_Scalar1);
156 canvas->translate(-SkIntToScalar(100), 0);
157 canvas->drawPicture(*pict);
158 canvas->restore();
reed@android.comcb608442009-12-04 21:32:27 +0000159
robertphillips@google.com76f9e932013-01-15 20:17:47 +0000160#ifdef SK_DEVELOPER
reed@android.comcb608442009-12-04 21:32:27 +0000161 if (false) {
162 SkDebugfDumper dumper;
163 SkDumpCanvas dumpCanvas(&dumper);
164 dumpCanvas.drawPicture(*pict);
165 }
robertphillips@google.com76f9e932013-01-15 20:17:47 +0000166#endif
rmistry@google.comae933ce2012-08-23 18:19:56 +0000167
reed@android.com8a1c16f2008-12-17 15:59:43 +0000168 // test that we can re-record a subpicture, and see the results
rmistry@google.comae933ce2012-08-23 18:19:56 +0000169
commit-bot@chromium.orge0e7cfe2013-09-09 20:09:12 +0000170 SkRandom rand(SampleCode::GetAnimTime());
reed@android.com8a1c16f2008-12-17 15:59:43 +0000171 canvas->translate(SkIntToScalar(10), SkIntToScalar(250));
172 drawCircle(fSubPicture->beginRecording(50, 50), 25,
reed@android.com44177402009-11-23 21:07:51 +0000173 rand.nextU() | 0xFF000000);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000174 canvas->drawPicture(*fPicture);
175 delayInval(500);
176 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000177
reed@android.com8a1c16f2008-12-17 15:59:43 +0000178private:
179 #define INVAL_ALL_TYPE "inval-all"
rmistry@google.comae933ce2012-08-23 18:19:56 +0000180
reed@android.com8a1c16f2008-12-17 15:59:43 +0000181 void delayInval(SkMSec delay) {
reed@google.com87fac4a2011-08-04 13:50:17 +0000182 (new SkEvent(INVAL_ALL_TYPE, this->getSinkID()))->postDelay(delay);
reed@android.com8a1c16f2008-12-17 15:59:43 +0000183 }
rmistry@google.comae933ce2012-08-23 18:19:56 +0000184
reed@android.com8a1c16f2008-12-17 15:59:43 +0000185 virtual bool onEvent(const SkEvent& evt) {
186 if (evt.isType(INVAL_ALL_TYPE)) {
187 this->inval(NULL);
188 return true;
189 }
190 return this->INHERITED::onEvent(evt);
191 }
192
193 SkPicture* fPicture;
194 SkPicture* fSubPicture;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000195
mike@reedtribe.org5fd92432011-05-05 01:59:48 +0000196 typedef SampleView INHERITED;
reed@android.com8a1c16f2008-12-17 15:59:43 +0000197};
198
199//////////////////////////////////////////////////////////////////////////////
200
201static SkView* MyFactory() { return new PictureView; }
202static SkViewRegister reg(MyFactory);