Builder class for SkLayerRasterizer.

Provide builder class to make SkLayerRasterizer immutable. We have to keep the
addLayer() methods for now because they are used in Chrome. They will be removed
once this changed has been rolled into Chrome.
An added benefit of this is that this class can only be allocated on the heap.

BUG=skia:2187
R=reed@google.com, scroggo@google.com, mtklein@google.com

Author: dominikg@chromium.org

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

git-svn-id: http://skia.googlecode.com/svn/trunk@13590 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/samplecode/SampleAll.cpp b/samplecode/SampleAll.cpp
index eb988f1..e0058c4 100644
--- a/samplecode/SampleAll.cpp
+++ b/samplecode/SampleAll.cpp
@@ -80,84 +80,84 @@
 
 ///////////////////////////////////////////////////////////
 
-static void r0(SkLayerRasterizer* rast, SkPaint& p) {
+static void r0(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
     p.setMaskFilter(SkBlurMaskFilter::Create(SkBlurMaskFilter::kNormal_BlurStyle,
                                              SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(3)),
                                              SkBlurMaskFilter::kNone_BlurFlag))->unref();
-    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
+    rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setMaskFilter(NULL);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 
     p.setAlpha(0x11);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r1(SkLayerRasterizer* rast, SkPaint& p) {
-    rast->addLayer(p);
+static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
+    rastBuilder->addLayer(p);
 
     p.setAlpha(0x40);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*2);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r2(SkLayerRasterizer* rast, SkPaint& p) {
+static void r2(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
     p.setStyle(SkPaint::kStrokeAndFill_Style);
     p.setStrokeWidth(SK_Scalar1*4);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3/2);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r3(SkLayerRasterizer* rast, SkPaint& p) {
+static void r3(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1*3);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 
     p.setAlpha(0x20);
     p.setStyle(SkPaint::kFill_Style);
     p.setXfermodeMode(SkXfermode::kSrc_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r4(SkLayerRasterizer* rast, SkPaint& p) {
+static void r4(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
     p.setAlpha(0x60);
-    rast->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
+    rastBuilder->addLayer(p, SkIntToScalar(3), SkIntToScalar(3));
 
     p.setAlpha(0xFF);
     p.setXfermodeMode(SkXfermode::kClear_Mode);
-    rast->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
+    rastBuilder->addLayer(p, SK_Scalar1*3/2, SK_Scalar1*3/2);
 
     p.setXfermode(NULL);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r5(SkLayerRasterizer* rast, SkPaint& p) {
-    rast->addLayer(p);
+static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
+    rastBuilder->addLayer(p);
 
     p.setPathEffect(SkDiscretePathEffect::Create(SK_Scalar1*4, SK_Scalar1*3))->unref();
     p.setXfermodeMode(SkXfermode::kSrcOut_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r6(SkLayerRasterizer* rast, SkPaint& p) {
-    rast->addLayer(p);
+static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
+    rastBuilder->addLayer(p);
 
     p.setAntiAlias(false);
-    SkLayerRasterizer* rast2 = new SkLayerRasterizer;
-    r5(rast2, p);
-    p.setRasterizer(rast2)->unref();
+    SkLayerRasterizer::Builder rastBuilder2;
+    r5(&rastBuilder2, p);
+    p.setRasterizer(rastBuilder2.detachRasterizer())->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
 class Dot2DPathEffect : public Sk2DPathEffect {
@@ -186,49 +186,49 @@
     typedef Sk2DPathEffect INHERITED;
 };
 
-static void r7(SkLayerRasterizer* rast, SkPaint& p) {
+static void r7(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
     lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
     p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*4, lattice))->unref();
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r8(SkLayerRasterizer* rast, SkPaint& p) {
-    rast->addLayer(p);
+static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
+    rastBuilder->addLayer(p);
 
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1*6, SK_Scalar1*6, 0, 0);
     lattice.postSkew(SK_Scalar1/3, 0, 0, 0);
     p.setPathEffect(new Dot2DPathEffect(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r9(SkLayerRasterizer* rast, SkPaint& p) {
-    rast->addLayer(p);
+static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p) {
+    rastBuilder->addLayer(p);
 
     SkMatrix    lattice;
     lattice.setScale(SK_Scalar1, SK_Scalar1*6, 0, 0);
     lattice.postRotate(SkIntToScalar(30), 0, 0);
     p.setPathEffect(SkLine2DPathEffect::Create(SK_Scalar1*2, lattice))->unref();
     p.setXfermodeMode(SkXfermode::kClear_Mode);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 
     p.setPathEffect(NULL);
     p.setXfermode(NULL);
     p.setStyle(SkPaint::kStroke_Style);
     p.setStrokeWidth(SK_Scalar1);
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-typedef void (*raster_proc)(SkLayerRasterizer*, SkPaint&);
+typedef void (*raster_proc)(SkLayerRasterizer::Builder*, SkPaint&);
 
 static const raster_proc gRastProcs[] = {
     r0, r1, r2, r3, r4, r5, r6, r7, r8, r9
@@ -248,11 +248,11 @@
     raster_proc proc = gRastProcs[index];
     if (proc) {
         SkPaint p;
-        SkLayerRasterizer*  rast = new SkLayerRasterizer;
+        SkLayerRasterizer::Builder rastBuilder;
 
         p.setAntiAlias(true);
-        proc(rast, p);
-        paint->setRasterizer(rast)->unref();
+        proc(&rastBuilder, p);
+        paint->setRasterizer(rastBuilder.detachRasterizer())->unref();
     }
 
 #if 1