Change SkAutoMaskImage so that we're less likely to write leaky code.
http://codereview.appspot.com/5180047/


git-svn-id: http://skia.googlecode.com/svn/trunk@2409 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/include/core/SkMaskFilter.h b/include/core/SkMaskFilter.h
index b32f4d3..0f1321e0 100644
--- a/include/core/SkMaskFilter.h
+++ b/include/core/SkMaskFilter.h
@@ -97,16 +97,13 @@
     Stack class used to manage the fImage buffer in a SkMask.
     When this object loses scope, the buffer is freed with SkMask::FreeImage().
 */
-class SkAutoMaskImage {
+class SkAutoMaskFreeImage {
 public:
-    SkAutoMaskImage(SkMask* mask, bool alloc) {
-        if (alloc) {
-            mask->fImage = SkMask::AllocImage(mask->computeImageSize());
-        }
-        fImage = mask->fImage;
+    SkAutoMaskFreeImage(uint8_t* maskImage) {
+        fImage = maskImage;
     }
 
-    ~SkAutoMaskImage() {
+    ~SkAutoMaskFreeImage() {
         SkMask::FreeImage(fImage);
     }
 private:
diff --git a/src/core/SkBitmap.cpp b/src/core/SkBitmap.cpp
index 581047e..6e4639f 100644
--- a/src/core/SkBitmap.cpp
+++ b/src/core/SkBitmap.cpp
@@ -1326,15 +1326,14 @@
         tmpBitmap.swap(*dst);
         return true;
     }
-
-    SkAutoMaskImage srcCleanup(&srcM, true);
+    srcM.fImage = SkMask::AllocImage(srcM.computeImageSize());
+    SkAutoMaskFreeImage srcCleanup(srcM.fImage);
 
     GetBitmapAlpha(*this, srcM.fImage, srcM.fRowBytes);
     if (!filter->filterMask(&dstM, srcM, identity, NULL)) {
         goto NO_FILTER_CASE;
     }
-
-    SkAutoMaskImage dstCleanup(&dstM, false);
+    SkAutoMaskFreeImage dstCleanup(dstM.fImage);
 
     tmpBitmap.setConfig(SkBitmap::kA8_Config, dstM.fBounds.width(),
                    dstM.fBounds.height(), dstM.fRowBytes);
diff --git a/src/core/SkDraw.cpp b/src/core/SkDraw.cpp
index 1bfac70..ed21f65 100644
--- a/src/core/SkDraw.cpp
+++ b/src/core/SkDraw.cpp
@@ -791,7 +791,7 @@
     } else {
         dstM.fImage = NULL;
     }
-    SkAutoMaskImage ami(&dstM, false);
+    SkAutoMaskFreeImage ami(dstM.fImage);
 
     if (fBounder && !fBounder->doIRect(mask->fBounds)) {
         return;
diff --git a/src/core/SkMaskFilter.cpp b/src/core/SkMaskFilter.cpp
index 334de5e..980c350 100644
--- a/src/core/SkMaskFilter.cpp
+++ b/src/core/SkMaskFilter.cpp
@@ -28,14 +28,13 @@
                             SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
         return false;
     }
-
-    SkAutoMaskImage autoSrc(&srcM, false);
+    SkAutoMaskFreeImage autoSrc(srcM.fImage);
 
     if (!this->filterMask(&dstM, srcM, matrix, NULL)) {
         return false;
     }
+    SkAutoMaskFreeImage autoDst(dstM.fImage);
 
-    SkAutoMaskImage         autoDst(&dstM, false);
     SkRegion::Cliperator    clipper(clip, dstM.fBounds);
 
     if (!clipper.done() && (bounder == NULL || bounder->doIRect(dstM.fBounds))) {
diff --git a/src/gpu/SkGpuDevice.cpp b/src/gpu/SkGpuDevice.cpp
index 8dadc0b..9923c8c 100644
--- a/src/gpu/SkGpuDevice.cpp
+++ b/src/gpu/SkGpuDevice.cpp
@@ -926,14 +926,13 @@
                             SkMask::kComputeBoundsAndRenderImage_CreateMode)) {
         return false;
     }
-
-    SkAutoMaskImage autoSrc(&srcM, false);
+    SkAutoMaskFreeImage autoSrc(srcM.fImage);
 
     if (!filter->filterMask(&dstM, srcM, matrix, NULL)) {
         return false;
     }
     // this will free-up dstM when we're done (allocated in filterMask())
-    SkAutoMaskImage autoDst(&dstM, false);
+    SkAutoMaskFreeImage autoDst(dstM.fImage);
 
     if (clip.quickReject(dstM.fBounds)) {
         return false;