aboutsummaryrefslogtreecommitdiffhomepage
path: root/samplecode/SamplePatch.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-02-07 15:30:46 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-02-07 15:30:46 +0000
commit82065d667f64e232bcde2ad849756a6096fcbe6f (patch)
treeb286676278e48522d5a1e153ff5696d3f2088cc8 /samplecode/SamplePatch.cpp
parent18908aacf360eaacf5e6a98dd57342adb98cf463 (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.cpp70
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;
};