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
diff --git a/samplecode/SampleShaders.cpp b/samplecode/SampleShaders.cpp
index 115f9f5..86c8b17 100644
--- a/samplecode/SampleShaders.cpp
+++ b/samplecode/SampleShaders.cpp
@@ -36,7 +36,7 @@
shaderA->unref();
shaderB->unref();
mode->unref();
-
+
return shader;
}
@@ -51,19 +51,19 @@
SkPoint pts[2];
SkColor colors[2];
-
+
pts[0].set(0, 0);
pts[1].set(SkIntToScalar(100), 0);
colors[0] = SK_ColorRED;
colors[1] = SK_ColorBLUE;
SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
-
+
pts[0].set(0, 0);
pts[1].set(0, SkIntToScalar(100));
colors[0] = SK_ColorBLACK;
colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, NULL, 2, SkShader::kClamp_TileMode);
-
+
SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
fShader = new SkComposeShader(shaderA, shaderB, mode);
@@ -73,9 +73,9 @@
}
virtual ~ShaderView()
{
- fShader->safeUnref();
+ SkSafeUnref(fShader);
}
-
+
protected:
// overrides from SkEventSink
virtual bool onQuery(SkEvent* evt) {
@@ -85,21 +85,21 @@
}
return this->INHERITED::onQuery(evt);
}
-
+
void drawBG(SkCanvas* canvas)
{
// canvas->drawColor(0xFFDDDDDD);
canvas->drawColor(SK_ColorWHITE);
}
-
+
virtual void onDraw(SkCanvas* canvas)
{
this->drawBG(canvas);
-
+
canvas->drawBitmap(fBitmap, 0, 0);
-
+
canvas->translate(SkIntToScalar(20), SkIntToScalar(120));
-
+
SkPaint paint;
SkRect r;
@@ -120,22 +120,22 @@
canvas->drawRect(r, paint);
paint.setShader(make_bitmapfade(fBitmap))->unref();
canvas->drawRect(r, paint);
-
+
paint.setShader(new SkTransparentShader)->unref();
canvas->drawRect(r, paint);
}
-
- virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
+
+ virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y)
{
this->inval(NULL);
return this->INHERITED::onFindClickHandler(x, y);
}
-
- virtual bool onClick(Click* click)
+
+ virtual bool onClick(Click* click)
{
return this->INHERITED::onClick(click);
}
-
+
private:
typedef SkView INHERITED;
};