Builder class for SkLayerDrawLooper.

SkLayerDrawLooper provides methods like addLayer() to build up a linked list
of layers. Working towards making this class immutable, this patch introduces
the SkLayerDrawLooperBuilder class which is used to accumulate all the layers
first. Once all layers are in place, it creates a new SkLayerDrawLooper object
and hands over the list of layers to that object.

For now we keep the addLayer methods in SkLayerDrawLooper so we don't break
Chrome and Blink when this is landed. Once we've updated all users, we can
remove the methods.

BUG=skia:2141
R=reed@google.com, scroggo@google.com, mtklein@google.com, reed@chromium.org

Author: dominikg@chromium.org

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

git-svn-id: http://skia.googlecode.com/svn/trunk@13448 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/LayerDrawLooperTest.cpp b/tests/LayerDrawLooperTest.cpp
index a1319a5..8f8a6b6 100644
--- a/tests/LayerDrawLooperTest.cpp
+++ b/tests/LayerDrawLooperTest.cpp
@@ -35,21 +35,22 @@
 };
 
 static void test_frontToBack(skiatest::Reporter* reporter) {
-    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
+    SkLayerDrawLooper::Builder looperBuilder;
     SkLayerDrawLooper::LayerInfo layerInfo;
 
     // Add the front layer, with the defaults.
-    (void)looper->addLayer(layerInfo);
+    (void)looperBuilder.addLayer(layerInfo);
 
     // Add the back layer, with some layer info set.
     layerInfo.fOffset.set(10.0f, 20.0f);
     layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
-    SkPaint* layerPaint = looper->addLayer(layerInfo);
+    SkPaint* layerPaint = looperBuilder.addLayer(layerInfo);
     layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
 
     FakeDevice device;
     SkCanvas canvas(&device);
     SkPaint paint;
+    SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
     looper->init(&canvas);
 
     // The back layer should come first.
@@ -72,21 +73,22 @@
 }
 
 static void test_backToFront(skiatest::Reporter* reporter) {
-    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
+    SkLayerDrawLooper::Builder looperBuilder;
     SkLayerDrawLooper::LayerInfo layerInfo;
 
     // Add the back layer, with the defaults.
-    (void)looper->addLayerOnTop(layerInfo);
+    (void)looperBuilder.addLayerOnTop(layerInfo);
 
     // Add the front layer, with some layer info set.
     layerInfo.fOffset.set(10.0f, 20.0f);
     layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
-    SkPaint* layerPaint = looper->addLayerOnTop(layerInfo);
+    SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo);
     layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
 
     FakeDevice device;
     SkCanvas canvas(&device);
     SkPaint paint;
+    SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
     looper->init(&canvas);
 
     // The back layer should come first.
@@ -109,21 +111,22 @@
 }
 
 static void test_mixed(skiatest::Reporter* reporter) {
-    SkAutoTUnref<SkLayerDrawLooper> looper(SkNEW(SkLayerDrawLooper));
+    SkLayerDrawLooper::Builder looperBuilder;
     SkLayerDrawLooper::LayerInfo layerInfo;
 
     // Add the back layer, with the defaults.
-    (void)looper->addLayer(layerInfo);
+    (void)looperBuilder.addLayer(layerInfo);
 
     // Add the front layer, with some layer info set.
     layerInfo.fOffset.set(10.0f, 20.0f);
     layerInfo.fPaintBits |= SkLayerDrawLooper::kXfermode_Bit;
-    SkPaint* layerPaint = looper->addLayerOnTop(layerInfo);
+    SkPaint* layerPaint = looperBuilder.addLayerOnTop(layerInfo);
     layerPaint->setXfermodeMode(SkXfermode::kSrc_Mode);
 
     FakeDevice device;
     SkCanvas canvas(&device);
     SkPaint paint;
+    SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
     looper->init(&canvas);
 
     // The back layer should come first.