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