SamplePicture.cpp revision da342a891779e0839a645d6634a2f0100bf2c0d6
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