plumb through arenaalloc
- simplifies the older pattern of storage/size
- removes a dynamic allocation in defaultbitmapcontroller

Bug: skia:
Change-Id: Ibc937d3e0c057e78cc0c8bf7d9ad2d824eb240d9
Reviewed-on: https://skia-review.googlesource.com/141321
Reviewed-by: Florin Malita <fmalita@chromium.org>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkBitmapController.cpp b/src/core/SkBitmapController.cpp
index 005c5a5..ed16f9b 100644
--- a/src/core/SkBitmapController.cpp
+++ b/src/core/SkBitmapController.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "SkArenaAlloc.h"
 #include "SkBitmap.h"
 #include "SkBitmapCache.h"
 #include "SkBitmapController.h"
@@ -18,11 +19,10 @@
 SkBitmapController::State* SkBitmapController::requestBitmap(const SkBitmapProvider& provider,
                                                              const SkMatrix& inv,
                                                              SkFilterQuality quality,
-                                                             void* storage, size_t storageSize) {
-    State* state = this->onRequestBitmap(provider, inv, quality, storage, storageSize);
+                                                             SkArenaAlloc* alloc) {
+    State* state = this->onRequestBitmap(provider, inv, quality, alloc);
     if (state) {
         if (nullptr == state->fPixmap.addr()) {
-            SkInPlaceDeleteCheck(state, storage);
             state = nullptr;
         }
     }
@@ -146,6 +146,6 @@
 SkBitmapController::State* SkDefaultBitmapController::onRequestBitmap(const SkBitmapProvider& bm,
                                                                       const SkMatrix& inverse,
                                                                       SkFilterQuality quality,
-                                                                      void* storage, size_t size) {
-    return SkInPlaceNewCheck<SkDefaultBitmapControllerState>(storage, size, bm, inverse, quality);
+                                                                      SkArenaAlloc* alloc) {
+    return alloc->make<SkDefaultBitmapControllerState>(bm, inverse, quality);
 }
diff --git a/src/core/SkBitmapController.h b/src/core/SkBitmapController.h
index 9eff2d2..394a7cf 100644
--- a/src/core/SkBitmapController.h
+++ b/src/core/SkBitmapController.h
@@ -40,15 +40,11 @@
     virtual ~SkBitmapController() {}
 
     State* requestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
-                         void* storage, size_t storageSize);
-
-    State* requestBitmap(const SkBitmapProvider& bp, const SkMatrix& inv, SkFilterQuality quality) {
-        return this->requestBitmap(bp, inv, quality, nullptr, 0);
-    }
+                         SkArenaAlloc*);
 
 protected:
     virtual State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inv, SkFilterQuality,
-                                   void* storage, size_t storageSize) = 0;
+                                   SkArenaAlloc*) = 0;
 };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -61,7 +57,7 @@
 
 protected:
     State* onRequestBitmap(const SkBitmapProvider&, const SkMatrix& inverse, SkFilterQuality,
-                           void* storage, size_t storageSize) override;
+                           SkArenaAlloc*) override;
 };
 
 #endif
diff --git a/src/core/SkBitmapProcState.cpp b/src/core/SkBitmapProcState.cpp
index 1056371..8fea0a3 100644
--- a/src/core/SkBitmapProcState.cpp
+++ b/src/core/SkBitmapProcState.cpp
@@ -37,9 +37,7 @@
     , fBMState(nullptr)
 {}
 
-SkBitmapProcInfo::~SkBitmapProcInfo() {
-    SkInPlaceDeleteCheck(fBMState, fBMStateStorage.get());
-}
+SkBitmapProcInfo::~SkBitmapProcInfo() {}
 
 ///////////////////////////////////////////////////////////////////////////////
 
@@ -87,8 +85,8 @@
     fFilterQuality = paint.getFilterQuality();
 
     SkDefaultBitmapController controller;
-    fBMState = controller.requestBitmap(fProvider, inv, paint.getFilterQuality(),
-                                        fBMStateStorage.get(), fBMStateStorage.size());
+    fBMState = controller.requestBitmap(fProvider, inv, paint.getFilterQuality(), &fAlloc);
+
     // Note : we allow the controller to return an empty (zero-dimension) result. Should we?
     if (nullptr == fBMState || fBMState->pixmap().info().isEmpty()) {
         return false;
diff --git a/src/core/SkBitmapProcState.h b/src/core/SkBitmapProcState.h
index 46e418cc..7d16ba6 100644
--- a/src/core/SkBitmapProcState.h
+++ b/src/core/SkBitmapProcState.h
@@ -8,6 +8,7 @@
 #ifndef SkBitmapProcState_DEFINED
 #define SkBitmapProcState_DEFINED
 
+#include "SkArenaAlloc.h"
 #include "SkBitmap.h"
 #include "SkBitmapController.h"
 #include "SkBitmapProvider.h"
@@ -49,7 +50,7 @@
     enum {
         kBMStateSize = 136  // found by inspection. if too small, we will call new/delete
     };
-    SkAlignedSStorage<kBMStateSize> fBMStateStorage;
+    SkSTArenaAlloc<kBMStateSize> fAlloc;
     SkBitmapController::State* fBMState;
 };
 
diff --git a/src/shaders/SkImageShader.cpp b/src/shaders/SkImageShader.cpp
index 22c3f95..cf85d85 100644
--- a/src/shaders/SkImageShader.cpp
+++ b/src/shaders/SkImageShader.cpp
@@ -276,9 +276,7 @@
 
     SkBitmapProvider provider(fImage.get());
     SkDefaultBitmapController controller;
-    std::unique_ptr<SkBitmapController::State> state {
-        controller.requestBitmap(provider, matrix, quality)
-    };
+    SkBitmapController::State* state = controller.requestBitmap(provider, matrix, quality, alloc);
     if (!state) {
         return false;
     }
@@ -311,11 +309,9 @@
     p->append(SkRasterPipeline::seed_shader);
 
     struct MiscCtx {
-        std::unique_ptr<SkBitmapController::State> state;
         SkColor4f paint_color;
     };
     auto misc = alloc->make<MiscCtx>();
-    misc->state = std::move(state);  // Extend lifetime to match the pipeline's.
     swizzle_rb(Sk4f_fromL32(rec.fPaint.getColor())).store(misc->paint_color.vec());  // sRGBA floats
     p->append_matrix(alloc, matrix);