Make sure SkDrawLooper objects can only be allocated on the heap.

Make constructors of SkLayerDrawLooper and SkBlurDrawLooper non-public.
Remove addLayer* methods from SkLayerDrawLooper. SkLayerDrawLooper::Builder is
used to create new objects.
Provide factory method for creating SkBlurDrawLooper.

BUG=2141
R=scroggo@google.com, reed@google.com, djsollen@google.com

Author: dominikg@chromium.org

Review URL: https://codereview.chromium.org/232913003

git-svn-id: http://skia.googlecode.com/svn/trunk@14200 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/gm/blurroundrect.cpp b/gm/blurroundrect.cpp
index 6c3903f..f688380 100644
--- a/gm/blurroundrect.cpp
+++ b/gm/blurroundrect.cpp
@@ -53,7 +53,7 @@
     }
 
     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
-        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
+        SkLayerDrawLooper::Builder looperBuilder;
         {
             SkLayerDrawLooper::LayerInfo info;
             info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
@@ -61,7 +61,7 @@
             info.fColorMode = SkXfermode::kSrc_Mode;
             info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
             info.fPostTranslate = false;
-            SkPaint* paint = looper->addLayerOnTop(info);
+            SkPaint* paint = looperBuilder.addLayerOnTop(info);
             SkMaskFilter* maskFilter = SkBlurMaskFilter::Create(
                     SkBlurMaskFilter::kNormal_BlurStyle,
                     SkBlurMask::ConvertRadiusToSigma(SK_ScalarHalf),
@@ -74,12 +74,12 @@
         }
         {
             SkLayerDrawLooper::LayerInfo info;
-            looper->addLayerOnTop(info);
+            looperBuilder.addLayerOnTop(info);
         }
         SkPaint paint;
         canvas->drawRect(fRRect.rect(), paint);
 
-        paint.setLooper(looper)->unref();
+        paint.setLooper(looperBuilder.detachLooper())->unref();
         paint.setColor(SK_ColorCYAN);
         paint.setAntiAlias(true);
 
diff --git a/gm/circles.cpp b/gm/circles.cpp
index b4cfef2..ce833db 100644
--- a/gm/circles.cpp
+++ b/gm/circles.cpp
@@ -81,12 +81,12 @@
         SkPaint p;
         p.setAntiAlias(true);
         SkBlurDrawLooper* shadowLooper =
-            new SkBlurDrawLooper (SK_ColorBLUE,
-                                  SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
-                                  SkIntToScalar(5), SkIntToScalar(10),
-                                  SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                                  SkBlurDrawLooper::kOverrideColor_BlurFlag |
-                                  SkBlurDrawLooper::kHighQuality_BlurFlag);
+            SkBlurDrawLooper::Create(SK_ColorBLUE,
+                                     SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
+                                     SkIntToScalar(5), SkIntToScalar(10),
+                                     SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                     SkBlurDrawLooper::kOverrideColor_BlurFlag |
+                                     SkBlurDrawLooper::kHighQuality_BlurFlag);
         SkAutoUnref aurL0(shadowLooper);
         p.setLooper(shadowLooper);
         fPaints.push_back(p);
diff --git a/gm/drawlooper.cpp b/gm/drawlooper.cpp
index 678d2ad..d3a4475 100644
--- a/gm/drawlooper.cpp
+++ b/gm/drawlooper.cpp
@@ -72,7 +72,7 @@
             { 0x88000000, SkPaint::kFill_Style, 0, SkIntToScalar(10), SkIntToScalar(3) }
         };
 
-        fLooper = new SkLayerDrawLooper;
+        SkLayerDrawLooper::Builder looperBuilder;
 
         SkLayerDrawLooper::LayerInfo info;
         info.fPaintBits = SkLayerDrawLooper::kStyle_Bit | SkLayerDrawLooper::kMaskFilter_Bit;
@@ -80,7 +80,7 @@
 
         for (size_t i = 0; i < SK_ARRAY_COUNT(gParams); i++) {
             info.fOffset.set(gParams[i].fOffset, gParams[i].fOffset);
-            SkPaint* paint = fLooper->addLayer(info);
+            SkPaint* paint = looperBuilder.addLayer(info);
             paint->setColor(gParams[i].fColor);
             paint->setStyle(gParams[i].fStyle);
             paint->setStrokeWidth(gParams[i].fWidth);
@@ -90,6 +90,7 @@
                 paint->setMaskFilter(mf)->unref();
             }
         }
+        fLooper = looperBuilder.detachLooper();
     }
 
     typedef GM INHERITED;
diff --git a/gm/megalooper.cpp b/gm/megalooper.cpp
index 12ccf2d..e825550 100644
--- a/gm/megalooper.cpp
+++ b/gm/megalooper.cpp
@@ -163,7 +163,7 @@
 
     // Create a 1-tier drawlooper
     SkLayerDrawLooper* create1Looper(SkScalar xOff, SkScalar yOff, SkColor color) {
-        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
+        SkLayerDrawLooper::Builder looperBuilder;
         SkLayerDrawLooper::LayerInfo info;
 
         info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
@@ -172,14 +172,14 @@
         info.fOffset.set(xOff, yOff);
         info.fPostTranslate = false;
 
-        SkPaint* paint = looper->addLayer(info);
+        SkPaint* paint = looperBuilder.addLayer(info);
 
         paint->setMaskFilter(this->createBlur())->unref();
 
         SkColorFilter* cf = SkColorFilter::CreateModeFilter(color, SkXfermode::kSrcIn_Mode);
         paint->setColorFilter(cf)->unref();
 
-        return looper;
+        return looperBuilder.detachLooper();
     }
 
     void draw1x4(SkCanvas* canvas, SkScalar x, SkScalar y) {
@@ -207,7 +207,7 @@
 
     // Create a 4-tier draw looper
     SkLayerDrawLooper* create4Looper(SkScalar xOff, SkScalar yOff) {
-        SkLayerDrawLooper* looper = new SkLayerDrawLooper;
+        SkLayerDrawLooper::Builder looperBuilder;
         SkLayerDrawLooper::LayerInfo info;
 
         info.fPaintBits = SkLayerDrawLooper::kColorFilter_Bit |
@@ -219,7 +219,7 @@
 
         for (int i = 3; i >= 0; --i) {
             info.fOffset.set(xOff+gBlurOffsets[i].fX, yOff+gBlurOffsets[i].fY);
-            paint = looper->addLayer(info);
+            paint = looperBuilder.addLayer(info);
 
             paint->setMaskFilter(this->createBlur())->unref();
 
@@ -227,7 +227,7 @@
             paint->setColorFilter(cf)->unref();
         }
 
-        return looper;
+        return looperBuilder.detachLooper();
     }
 
     typedef GM INHERITED;
diff --git a/gm/rects.cpp b/gm/rects.cpp
index febf553..9600dd5 100644
--- a/gm/rects.cpp
+++ b/gm/rects.cpp
@@ -95,12 +95,12 @@
             p.setColor(SK_ColorWHITE);
             p.setAntiAlias(true);
             SkBlurDrawLooper* shadowLooper =
-                new SkBlurDrawLooper (SK_ColorWHITE,
-                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
-                                      SkIntToScalar(5), SkIntToScalar(10),
-                                      SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                                      SkBlurDrawLooper::kOverrideColor_BlurFlag |
-                                      SkBlurDrawLooper::kHighQuality_BlurFlag);
+                SkBlurDrawLooper::Create(SK_ColorWHITE,
+                                         SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
+                                         SkIntToScalar(5), SkIntToScalar(10),
+                                         SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                         SkBlurDrawLooper::kOverrideColor_BlurFlag |
+                                         SkBlurDrawLooper::kHighQuality_BlurFlag);
             SkAutoUnref aurL0(shadowLooper);
             p.setLooper(shadowLooper);
             fPaints.push_back(p);
diff --git a/gm/shadows.cpp b/gm/shadows.cpp
index d0d23a8..44fa8e2 100644
--- a/gm/shadows.cpp
+++ b/gm/shadows.cpp
@@ -47,42 +47,42 @@
     virtual void onDraw(SkCanvas* canvas) {
     SkBlurDrawLooper* shadowLoopers[5];
     shadowLoopers[0] =
-        new SkBlurDrawLooper (SK_ColorBLUE,
-                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
-                              SkIntToScalar(5), SkIntToScalar(10),
-                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
-                              SkBlurDrawLooper::kHighQuality_BlurFlag);
+        SkBlurDrawLooper::Create(SK_ColorBLUE,
+                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
+                                 SkIntToScalar(5), SkIntToScalar(10),
+                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
+                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
     SkAutoUnref aurL0(shadowLoopers[0]);
     shadowLoopers[1] =
-        new SkBlurDrawLooper (SK_ColorBLUE,
-                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
-                              SkIntToScalar(5), SkIntToScalar(10),
-                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                              SkBlurDrawLooper::kOverrideColor_BlurFlag);
+        SkBlurDrawLooper::Create(SK_ColorBLUE,
+                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
+                                 SkIntToScalar(5), SkIntToScalar(10),
+                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                 SkBlurDrawLooper::kOverrideColor_BlurFlag);
     SkAutoUnref aurL1(shadowLoopers[1]);
     shadowLoopers[2] =
-        new SkBlurDrawLooper (SK_ColorBLACK,
-                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
-                              SkIntToScalar(5),
-                              SkIntToScalar(10),
-                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                              SkBlurDrawLooper::kHighQuality_BlurFlag);
+        SkBlurDrawLooper::Create(SK_ColorBLACK,
+                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
+                                 SkIntToScalar(5),
+                                 SkIntToScalar(10),
+                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
     SkAutoUnref aurL2(shadowLoopers[2]);
     shadowLoopers[3] =
-        new SkBlurDrawLooper (0x7FFF0000,
-                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
-                              SkIntToScalar(-5), SkIntToScalar(-10),
-                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
-                              SkBlurDrawLooper::kHighQuality_BlurFlag);
+        SkBlurDrawLooper::Create(0x7FFF0000,
+                                 SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
+                                 SkIntToScalar(-5), SkIntToScalar(-10),
+                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
+                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
     SkAutoUnref aurL3(shadowLoopers[3]);
     shadowLoopers[4] =
-        new SkBlurDrawLooper (SK_ColorBLACK, SkIntToScalar(0),
-                              SkIntToScalar(5), SkIntToScalar(5),
-                              SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
-                              SkBlurDrawLooper::kOverrideColor_BlurFlag |
-                              SkBlurDrawLooper::kHighQuality_BlurFlag);
+        SkBlurDrawLooper::Create(SK_ColorBLACK, SkIntToScalar(0),
+                                 SkIntToScalar(5), SkIntToScalar(5),
+                                 SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
+                                 SkBlurDrawLooper::kOverrideColor_BlurFlag |
+                                 SkBlurDrawLooper::kHighQuality_BlurFlag);
     SkAutoUnref aurL4(shadowLoopers[4]);
 
     static const struct {
diff --git a/gm/tilemodes_scaled.cpp b/gm/tilemodes_scaled.cpp
index bbb86a7..e9c6c99 100644
--- a/gm/tilemodes_scaled.cpp
+++ b/gm/tilemodes_scaled.cpp
@@ -13,6 +13,7 @@
 #include "SkColorPriv.h"
 #include "SkColorFilter.h"
 #include "SkTypeface.h"
+#include "SkBlurMask.h"
 
 // effects
 #include "SkGradientShader.h"
@@ -55,10 +56,12 @@
 };
 
 class ScaledTilingGM : public skiagm::GM {
-    SkBlurDrawLooper    fLooper;
+    SkAutoTUnref<SkBlurDrawLooper> fLooper;
 public:
     ScaledTilingGM(bool powerOfTwoSize)
-            : fLooper(SkIntToScalar(1), SkIntToScalar(2), SkIntToScalar(2), 0x88000000)
+            : fLooper(SkBlurDrawLooper::Create(0x88000000,
+                                               SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)),
+                                               SkIntToScalar(2), SkIntToScalar(2)))
             , fPowerOfTwoSize(powerOfTwoSize) {
     }
 
@@ -117,7 +120,7 @@
                 SkString str;
                 p.setAntiAlias(true);
                 p.setDither(true);
-                p.setLooper(&fLooper);
+                p.setLooper(fLooper);
                 str.printf("[%s,%s]", gModeNames[kx], gModeNames[ky]);
 
                 p.setTextAlign(SkPaint::kCenter_Align);
@@ -157,7 +160,7 @@
                     SkPaint p;
                     SkString str;
                     p.setAntiAlias(true);
-                    p.setLooper(&fLooper);
+                    p.setLooper(fLooper);
                     str.printf("%s, %s", gColorTypeNames[i], gFilterNames[j]);
                     canvas->drawText(str.c_str(), str.size(), scale*x, scale*(y + r.height() * 2 / 3), p);
                 }