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