From 82065d667f64e232bcde2ad849756a6096fcbe6f Mon Sep 17 00:00:00 2001 From: "reed@google.com" Date: Mon, 7 Feb 2011 15:30:46 +0000 Subject: remove SkRefCnt safeRef() and safeUnref(), and replace the call-sites with SkSafeRef() and SkSafeUnref(). This is basically a bug waiting to happen. An optimizing compiler can remove checks for null on "this" if it chooses. However, SkRefCnt::safeRef() relies on precisely this check... void SkRefCnt::safeRef() { if (this) { this->ref(); } } Since a compiler might skip the if-clause, it breaks the intention of this method, hence its removal. static inline void SkSafeRef(SkRefCnt* obj) { if (obj) { obj->ref(); } } This form is not ignored by an optimizing compile, so we use it instead. git-svn-id: http://skia.googlecode.com/svn/trunk@762 2bbb7eff-a529-9590-31e7-b0007b416f81 --- samplecode/SampleVertices.cpp | 72 +++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 36 deletions(-) (limited to 'samplecode/SampleVertices.cpp') diff --git a/samplecode/SampleVertices.cpp b/samplecode/SampleVertices.cpp index 96fa0daab6..7f5aa9665b 100644 --- a/samplecode/SampleVertices.cpp +++ b/samplecode/SampleVertices.cpp @@ -21,7 +21,7 @@ static SkShader* make_shader0(SkIPoint* size) { SkBitmap bm; - + SkImageDecoder::DecodeFile("/skimages/logo.png", &bm); size->set(bm.width(), bm.height()); return SkShader::CreateBitmapShader(bm, SkShader::kClamp_TileMode, @@ -39,25 +39,25 @@ class VerticesView : public SkView { SkShader* fShader0; SkShader* fShader1; -public: +public: VerticesView() { SkIPoint size; - + fShader0 = make_shader0(&size); fShader1 = make_shader1(size); make_strip(&fRecs[0], size.fX, size.fY); make_fan(&fRecs[1], size.fX, size.fY); make_tris(&fRecs[2]); - + fScale = SK_Scalar1; } - + virtual ~VerticesView() { - fShader0->safeUnref(); - fShader1->safeUnref(); + SkSafeUnref(fShader0); + SkSafeUnref(fShader1); } - + protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { @@ -69,65 +69,65 @@ protected: } return this->INHERITED::onQuery(evt); } - + void drawBG(SkCanvas* canvas) { canvas->drawColor(SK_ColorGRAY); } - + SkScalar fScale; - + virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); - + SkPaint paint; paint.setDither(true); paint.setFilterBitmap(true); - + for (int i = 0; i < SK_ARRAY_COUNT(fRecs); i++) { canvas->save(); - + paint.setShader(NULL); canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, fRecs[i].fVerts, fRecs[i].fTexs, NULL, NULL, NULL, 0, paint); - + canvas->translate(SkIntToScalar(250), 0); - + paint.setShader(fShader0); canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, fRecs[i].fVerts, fRecs[i].fTexs, NULL, NULL, NULL, 0, paint); canvas->translate(SkIntToScalar(250), 0); - + paint.setShader(fShader1); canvas->drawVertices(fRecs[i].fMode, fRecs[i].fCount, fRecs[i].fVerts, fRecs[i].fTexs, NULL, NULL, NULL, 0, paint); canvas->restore(); - + canvas->translate(0, SkIntToScalar(250)); } } - + virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { return new Click(this); } - + virtual bool onClick(Click* click) { // fCurrX = click->fICurr.fX; // fCurrY = click->fICurr.fY; this->inval(NULL); return true; } - + private: struct Rec { SkCanvas::VertexMode fMode; int fCount; SkPoint* fVerts; SkPoint* fTexs; - + Rec() : fCount(0), fVerts(NULL), fTexs(NULL) {} ~Rec() { delete[] fVerts; delete[] fTexs; } }; @@ -135,11 +135,11 @@ private: void make_tris(Rec* rec) { int n = 10; SkRandom rand; - + rec->fMode = SkCanvas::kTriangles_VertexMode; rec->fCount = n * 3; rec->fVerts = new SkPoint[rec->fCount]; - + for (int i = 0; i < n; i++) { SkPoint* v = &rec->fVerts[i*3]; for (int j = 0; j < 3; j++) { @@ -147,17 +147,17 @@ private: } } } - + void make_fan(Rec* rec, int texWidth, int texHeight) { const SkScalar tx = SkIntToScalar(texWidth); const SkScalar ty = SkIntToScalar(texHeight); const int n = 24; - + rec->fMode = SkCanvas::kTriangleFan_VertexMode; rec->fCount = n + 2; rec->fVerts = new SkPoint[rec->fCount]; rec->fTexs = new SkPoint[rec->fCount]; - + SkPoint* v = rec->fVerts; SkPoint* t = rec->fTexs; @@ -171,47 +171,47 @@ private: } v[n+1] = v[1]; t[n+1].set(tx, ty); - + SkMatrix m; m.setScale(SkIntToScalar(100), SkIntToScalar(100)); m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); m.mapPoints(v, rec->fCount); } - + void make_strip(Rec* rec, int texWidth, int texHeight) { const SkScalar tx = SkIntToScalar(texWidth); const SkScalar ty = SkIntToScalar(texHeight); const int n = 24; - + rec->fMode = SkCanvas::kTriangleStrip_VertexMode; rec->fCount = 2 * (n + 1); rec->fVerts = new SkPoint[rec->fCount]; rec->fTexs = new SkPoint[rec->fCount]; - + SkPoint* v = rec->fVerts; SkPoint* t = rec->fTexs; - + for (int i = 0; i < n; i++) { SkScalar cos; SkScalar sin = SkScalarSinCos(SK_ScalarPI * 2 * i / n, &cos); v[i*2 + 0].set(cos/2, sin/2); v[i*2 + 1].set(cos, sin); - + t[i*2 + 0].set(tx * i / n, ty); t[i*2 + 1].set(tx * i / n, 0); } v[2*n + 0] = v[0]; v[2*n + 1] = v[1]; - + t[2*n + 0].set(tx, ty); t[2*n + 1].set(tx, 0); - + SkMatrix m; m.setScale(SkIntToScalar(100), SkIntToScalar(100)); m.postTranslate(SkIntToScalar(110), SkIntToScalar(110)); m.mapPoints(v, rec->fCount); } - + Rec fRecs[3]; typedef SkView INHERITED; -- cgit v1.2.3