diff options
author | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-02-07 15:30:46 +0000 |
---|---|---|
committer | reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2011-02-07 15:30:46 +0000 |
commit | 82065d667f64e232bcde2ad849756a6096fcbe6f (patch) | |
tree | b286676278e48522d5a1e153ff5696d3f2088cc8 /samplecode/SamplePatch.cpp | |
parent | 18908aacf360eaacf5e6a98dd57342adb98cf463 (diff) |
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
Diffstat (limited to 'samplecode/SamplePatch.cpp')
-rw-r--r-- | samplecode/SamplePatch.cpp | 70 |
1 files changed, 35 insertions, 35 deletions
diff --git a/samplecode/SamplePatch.cpp b/samplecode/SamplePatch.cpp index fb70dbaf97..4203391c18 100644 --- a/samplecode/SamplePatch.cpp +++ b/samplecode/SamplePatch.cpp @@ -23,17 +23,17 @@ static void drawtriangle(SkCanvas* canvas, const SkPaint& paint, const SkPoint pts[3]) { SkPath path; - + path.moveTo(pts[0]); path.lineTo(pts[1]); path.lineTo(pts[2]); - + canvas->drawPath(path, paint); } static SkShader* make_shader0(SkIPoint* size) { SkBitmap bm; - + // SkImageDecoder::DecodeFile("/skimages/progressivejpg.jpg", &bm); SkImageDecoder::DecodeFile("/skimages/logo.png", &bm); size->set(bm.width(), bm.height()); @@ -54,7 +54,7 @@ class Patch { public: Patch() { sk_bzero(fPts, sizeof(fPts)); } ~Patch() {} - + void setPatch(const SkPoint pts[12]) { memcpy(fPts, pts, 12 * sizeof(SkPoint)); fPts[12] = pts[0]; // the last shall be first @@ -63,7 +63,7 @@ public: void draw(SkCanvas*, const SkPaint&, int segsU, int segsV, bool doTextures, bool doColors); - + private: SkPoint fPts[13]; int fW, fH; @@ -89,12 +89,12 @@ static void eval_sheet(const SkPoint edge[], int nu, int nv, int iu, int iv, SkScalar u = SkIntToScalar(iu) / nu; SkScalar v = SkIntToScalar(iv) / nv; - + SkScalar uv = SkScalarMul(u, v); SkScalar Uv = SkScalarMul(SK_Scalar1 - u, v); SkScalar uV = SkScalarMul(u, SK_Scalar1 - v); SkScalar UV = SkScalarMul(SK_Scalar1 - u, SK_Scalar1 - v); - + SkScalar x0 = SkScalarMul(UV, edge[TL].fX) + SkScalarMul(uV, edge[TR].fX) + SkScalarMul(Uv, edge[BL].fX) + SkScalarMul(uv, edge[BR].fX); SkScalar y0 = SkScalarMul(UV, edge[TL].fY) + SkScalarMul(uV, edge[TR].fY) + @@ -123,7 +123,7 @@ static int ScalarTo255(SkScalar v) { static SkColor make_color(SkScalar s, SkScalar t) { int cs = ScalarTo255(s); - int ct = ScalarTo255(t); + int ct = ScalarTo255(t); return SkColorSetARGB(0xFF, cs, 0, 0) + SkColorSetARGB(0, 0, ct, 0); } @@ -139,22 +139,22 @@ void Patch::draw(SkCanvas* canvas, const SkPaint& paint, int nu, int nv, SkPoint* edge1 = edge0 + nu; SkPoint* edge2 = edge1 + nv; SkPoint* edge3 = edge2 + nu; - + // evaluate the edge points eval_patch_edge(fPts + 0, edge0, nu); eval_patch_edge(fPts + 3, edge1, nv); eval_patch_edge(fPts + 6, edge2, nu); eval_patch_edge(fPts + 9, edge3, nv); edge3[nv] = edge0[0]; // the last shall be first - + for (i = 0; i < npts; i++) { // canvas->drawLine(edge0[i].fX, edge0[i].fY, edge0[i+1].fX, edge0[i+1].fY, paint); } - + int row, vertCount = (nu + 1) * (nv + 1); SkAutoTMalloc<SkPoint> vertStorage(vertCount); SkPoint* verts = vertStorage.get(); - + // first row memcpy(verts, edge0, (nu + 1) * sizeof(SkPoint)); // rows @@ -172,9 +172,9 @@ void Patch::draw(SkCanvas* canvas, const SkPaint& paint, int nu, int nv, for (i = 0; i <= nu; i++) { last[i] = edge2[nu - i]; } - + // canvas->drawPoints(verts, vertCount, paint); - + int stripCount = (nu + 1) * 2; SkAutoTMalloc<SkPoint> stripStorage(stripCount * 2); SkAutoTMalloc<SkColor> colorStorage(stripCount); @@ -226,8 +226,8 @@ class PatchView : public SkView { SkShader* fShader1; SkIPoint fSize0, fSize1; SkPoint fPts[12]; - -public: + +public: PatchView() { fShader0 = make_shader0(&fSize0); fSize1 = fSize0; @@ -251,12 +251,12 @@ public: fPts[10].set(S*0, T*3); fPts[11].set(S*0, T*2); } - + virtual ~PatchView() { - fShader0->safeUnref(); - fShader1->safeUnref(); + SkSafeUnref(fShader0); + SkSafeUnref(fShader1); } - + protected: // overrides from SkEventSink virtual bool onQuery(SkEvent* evt) { @@ -268,22 +268,22 @@ protected: } return this->INHERITED::onQuery(evt); } - + void drawBG(SkCanvas* canvas) { canvas->drawColor(SK_ColorGRAY); } - + virtual void onDraw(SkCanvas* canvas) { this->drawBG(canvas); - + SkPaint paint; paint.setDither(true); paint.setFilterBitmap(true); - + canvas->translate(SkIntToScalar(20), 0); Patch patch; - + paint.setShader(fShader0); if (fSize0.fX == 0) { fSize0.fX = 1; @@ -292,33 +292,33 @@ protected: fSize0.fY = 1; } patch.setBounds(fSize0.fX, fSize0.fY); - - patch.setPatch(fPts); + + patch.setPatch(fPts); drawpatches(canvas, paint, 10, 10, &patch); - + paint.setShader(NULL); paint.setAntiAlias(true); paint.setStrokeWidth(SkIntToScalar(5)); canvas->drawPoints(SkCanvas::kPoints_PointMode, SK_ARRAY_COUNT(fPts), fPts, paint); - + canvas->translate(0, SkIntToScalar(300)); - + paint.setAntiAlias(false); paint.setShader(fShader1); patch.setBounds(fSize1.fX, fSize1.fY); drawpatches(canvas, paint, 10, 10, &patch); } - + class PtClick : public Click { public: int fIndex; PtClick(SkView* view, int index) : Click(view), fIndex(index) {} }; - + static bool hittest(const SkPoint& pt, SkScalar x, SkScalar y) { return SkPoint::Length(pt.fX - x, pt.fY - y) < SkIntToScalar(5); } - + virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y) { for (int i = 0; i < SK_ARRAY_COUNT(fPts); i++) { if (hittest(fPts[i], x, y)) { @@ -327,13 +327,13 @@ protected: } return this->INHERITED::onFindClickHandler(x, y); } - + virtual bool onClick(Click* click) { fPts[((PtClick*)click)->fIndex].set(click->fCurr.fX, click->fCurr.fY); this->inval(NULL); return true; } - + private: typedef SkView INHERITED; }; |