Fix leaks in blurrect benchs and gm.
Review URL: https://codereview.appspot.com/7071060

git-svn-id: http://skia.googlecode.com/svn/trunk@7142 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/bench/BlurRectBench.cpp b/bench/BlurRectBench.cpp
index e9234a8..b0b06e6 100644
--- a/bench/BlurRectBench.cpp
+++ b/bench/BlurRectBench.cpp
@@ -91,6 +91,7 @@
         SkMask mask;
         SkBlurMask::BlurRect(&mask, r, radius(), SkBlurMask::kNormal_Style,
                              SkBlurMask::kHigh_Quality);
+        SkMask::FreeImage(mask.fImage);
     }
 };
 
@@ -104,12 +105,18 @@
         } else {
             name.printf("blurrect_separable_%d", SkScalarRound(rad));
         }
-
         setName(name);
+        fSrcMask.fImage = NULL;
+    }
+
+    ~BlurRectSeparableBench() {
+        SkMask::FreeImage(fSrcMask.fImage);
     }
 
 protected:
     virtual void preBenchSetup(const SkRect& r) SK_OVERRIDE {
+        SkMask::FreeImage(fSrcMask.fImage);
+
         r.roundOut(&fSrcMask.fBounds);
         fSrcMask.fFormat = SkMask::kA8_Format;
         fSrcMask.fRowBytes = fSrcMask.fBounds.width();
@@ -123,6 +130,7 @@
         SkBlurMask::BlurSeparable(&mask, fSrcMask, radius(),
                                   SkBlurMask::kNormal_Style,
                                   SkBlurMask::kHigh_Quality);
+        SkMask::FreeImage(mask.fImage);
     }
 };
 
diff --git a/gm/blurrect.cpp b/gm/blurrect.cpp
index 88863e6..a06f62a 100644
--- a/gm/blurrect.cpp
+++ b/gm/blurrect.cpp
@@ -140,11 +140,11 @@
     unsigned int fRectWidth, fRectHeight;
     SkScalar fRadius;
 public:
-    BlurRectCompareGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, float radius) :
-        fName(name)
-        , fRectWidth( rectWidth )
-        , fRectHeight( rectHeight )
-        , fRadius( radius )
+    BlurRectCompareGM(const char name[], unsigned int rectWidth, unsigned int rectHeight, float radius)
+        : fName(name)
+        , fRectWidth(rectWidth)
+        , fRectHeight(rectHeight)
+        , fRadius(radius)
     {}
 
   int width() const { return fRectWidth; }
@@ -160,7 +160,7 @@
         return SkISize::Make(640, 480);
     }
 
-    virtual void makeMask( SkMask *m, const SkRect& ) = 0;
+    virtual void makeMask(SkMask *m, const SkRect&) = 0;
 
     virtual void onDraw(SkCanvas* canvas) {
       SkRect r;
@@ -168,7 +168,8 @@
 
       SkMask mask;
 
-      makeMask(&mask, r);
+      this->makeMask(&mask, r);
+      SkAutoMaskFreeImage amfi(mask.fImage);
 
       SkBitmap bm;
       bm.setConfig(SkBitmap::kA8_Config, mask.fBounds.width(), mask.fBounds.height());
@@ -186,10 +187,10 @@
 public:
     BlurRectFastGM(const char name[], unsigned int rect_width,
                    unsigned int rect_height, float blur_radius) :
-        BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
+        BlurRectCompareGM(name, rect_width, rect_height, blur_radius) {}
 protected:
-    virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
-        SkBlurMask::BlurRect( m, r, radius(), SkBlurMask::kNormal_Style,
+    virtual void makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
+        SkBlurMask::BlurRect(m, r, radius(), SkBlurMask::kNormal_Style,
                              SkBlurMask::kHigh_Quality );
     }
 };
@@ -199,17 +200,18 @@
   BlurRectSlowGM(const char name[], unsigned int rect_width, unsigned int rect_height, float blur_radius) :
     BlurRectCompareGM( name, rect_width, rect_height, blur_radius ) {}
 protected:
-    virtual void makeMask( SkMask *m, const SkRect& r) SK_OVERRIDE {
+    virtual void makeMask(SkMask *m, const SkRect& r) SK_OVERRIDE {
         SkMask src;
         r.roundOut(&src.fBounds);
         src.fBounds.offset(-src.fBounds.fLeft, -src.fBounds.fTop);  // move to origin
         src.fFormat = SkMask::kA8_Format;
         src.fRowBytes = src.fBounds.width();
         src.fImage = SkMask::AllocImage( src.computeTotalImageSize() );
+        SkAutoMaskFreeImage amfi(src.fImage);
 
-        memset( src.fImage, 0xff, src.computeTotalImageSize() );
+        memset(src.fImage, 0xff, src.computeTotalImageSize());
 
-        SkBlurMask::BlurSeparable( m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality );
+        SkBlurMask::BlurSeparable(m, src, radius()/2, SkBlurMask::kNormal_Style, SkBlurMask::kHigh_Quality);
     }
 };
 
diff --git a/src/effects/SkBlurMask.cpp b/src/effects/SkBlurMask.cpp
index a44f439..99bf2d5 100644
--- a/src/effects/SkBlurMask.cpp
+++ b/src/effects/SkBlurMask.cpp
@@ -852,7 +852,7 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-// we use a local funciton to wrap the class static method to work around
+// we use a local function to wrap the class static method to work around
 // a bug in gcc98
 void SkMask_FreeImage(uint8_t* image);
 void SkMask_FreeImage(uint8_t* image) {
@@ -1086,7 +1086,7 @@
     int size = SkScalarFloorToInt(radius * 3 + 1);
     int center = size >> 1;
 
-    unsigned int *profile = new unsigned int [size];
+    unsigned int *profile = SkNEW_ARRAY(unsigned int, size);
 
     float invr = 1.0f/radius;
 
@@ -1118,6 +1118,7 @@
     float radius = SkScalarToFloat( SkScalarMul( provided_radius, kBlurRadiusFudgeFactor ) );
 
     profile_size = compute_profile( radius, &profile );
+    SkAutoTDeleteArray<unsigned int> ada(profile);
 
     int pad = (int) (radius * 1.5f + 1);
     if (margin) {
@@ -1142,8 +1143,6 @@
 
     dst->fImage = dp;
 
-    SkAutoTCallVProc<uint8_t, SkMask_FreeImage> autoCall(dp);
-
     int dst_height = dst->fBounds.height();
     int dst_width = dst->fBounds.width();