SamplePicture.cpp revision 03202c9c3dfbf8c4feb0a1ee9b3680817e633f58
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 "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
158