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