diff --git a/samplecode/SampleSlides.cpp b/samplecode/SampleSlides.cpp
index 914283a..ece9684 100644
--- a/samplecode/SampleSlides.cpp
+++ b/samplecode/SampleSlides.cpp
@@ -476,92 +476,92 @@
 
 ///////////////////////////////////////////////////////////////////////////////
 
-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))))->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)
+static void r1(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    rast->addLayer(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);
 }
 
 #include "SkDiscretePathEffect.h"
 
-static void r5(SkLayerRasterizer* rast, SkPaint& p)
+static void r5(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    rast->addLayer(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)
+static void r6(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    rast->addLayer(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);
 }
 
 #include "Sk2DPathEffect.h"
@@ -572,52 +572,52 @@
     return SkPath2DPathEffect::Create(matrix, path);
 }
 
-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(MakeDotEffect(SK_Scalar1*4, lattice))->unref();
-    rast->addLayer(p);
+    rastBuilder->addLayer(p);
 }
 
-static void r8(SkLayerRasterizer* rast, SkPaint& p)
+static void r8(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    rast->addLayer(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(MakeDotEffect(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)
+static void r9(SkLayerRasterizer::Builder* rastBuilder, SkPaint& p)
 {
-    rast->addLayer(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
@@ -626,11 +626,11 @@
 static void apply_shader(SkPaint* paint, int index) {
     raster_proc proc = gRastProcs[index];
     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();
     paint->setColor(SK_ColorBLUE);
 }
 
