[WIP] Add Context to SkDrawLooper.

SkDrawLooper carries some state during draws. This CL extracts this state into
a separate class Context, which is then passed by the users of SkDrawLooper
into the appropriate methods.
This is a step towards making SkDrawLooper immutable.

BUG=skia:2141
R=scroggo@google.com, reed@google.com, sugoi@google.com

Author: dominikg@chromium.org

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

git-svn-id: http://skia.googlecode.com/svn/trunk@13760 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/tests/LayerDrawLooperTest.cpp b/tests/LayerDrawLooperTest.cpp
index 68dd5e0..1facb23 100644
--- a/tests/LayerDrawLooperTest.cpp
+++ b/tests/LayerDrawLooperTest.cpp
@@ -15,6 +15,7 @@
 #include "SkRect.h"
 #include "SkRefCnt.h"
 #include "SkScalar.h"
+#include "SkSmallAllocator.h"
 #include "SkXfermode.h"
 #include "Test.h"
 
@@ -57,10 +58,12 @@
     SkCanvas canvas(&device);
     SkPaint paint;
     SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
-    looper->init(&canvas);
+    SkSmallAllocator<1, 32> allocator;
+    void* buffer = allocator.reserveT<SkDrawLooper::Context>(looper->contextSize());
+    SkDrawLooper::Context* context = looper->createContext(&canvas, buffer);
 
     // The back layer should come first.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
@@ -68,14 +71,14 @@
     paint.reset();
 
     // Then the front layer.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
     REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateY());
 
     // Only two layers were added, so that should be the end.
-    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
 }
 
 static void test_backToFront(skiatest::Reporter* reporter) {
@@ -95,10 +98,12 @@
     SkCanvas canvas(&device);
     SkPaint paint;
     SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
-    looper->init(&canvas);
+    SkSmallAllocator<1, 32> allocator;
+    void* buffer = allocator.reserveT<SkDrawLooper::Context>(looper->contextSize());
+    SkDrawLooper::Context* context = looper->createContext(&canvas, buffer);
 
     // The back layer should come first.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
@@ -106,14 +111,14 @@
     paint.reset();
 
     // Then the front layer.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
     REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
 
     // Only two layers were added, so that should be the end.
-    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
 }
 
 static void test_mixed(skiatest::Reporter* reporter) {
@@ -133,10 +138,12 @@
     SkCanvas canvas(&device);
     SkPaint paint;
     SkAutoTUnref<SkLayerDrawLooper> looper(looperBuilder.detachLooper());
-    looper->init(&canvas);
+    SkSmallAllocator<1, 32> allocator;
+    void* buffer = allocator.reserveT<SkDrawLooper::Context>(looper->contextSize());
+    SkDrawLooper::Context* context = looper->createContext(&canvas, buffer);
 
     // The back layer should come first.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrcOver_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 0.0f == device.fLastMatrix.getTranslateX());
@@ -144,14 +151,14 @@
     paint.reset();
 
     // Then the front layer.
-    REPORTER_ASSERT(reporter, looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, context->next(&canvas, &paint));
     REPORTER_ASSERT(reporter, SkXfermode::IsMode(paint.getXfermode(), SkXfermode::kSrc_Mode));
     canvas.drawRect(SkRect::MakeWH(50.0f, 50.0f), paint);
     REPORTER_ASSERT(reporter, 10.0f == device.fLastMatrix.getTranslateX());
     REPORTER_ASSERT(reporter, 20.0f == device.fLastMatrix.getTranslateY());
 
     // Only two layers were added, so that should be the end.
-    REPORTER_ASSERT(reporter, !looper->next(&canvas, &paint));
+    REPORTER_ASSERT(reporter, !context->next(&canvas, &paint));
 }
 
 DEF_TEST(LayerDrawLooper, reporter) {