Gradient cleanup pass

1) replace manual storage management with SkAutoSTMalloc

2) simplify explicit positions processing (remove redundant branch)

Change-Id: I7841e2018ac421768ed1d61c4e3ef6a1d28f6244
Reviewed-on: https://skia-review.googlesource.com/66146
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Florin Malita <fmalita@chromium.org>
diff --git a/src/shaders/gradients/SkGradientShader.cpp b/src/shaders/gradients/SkGradientShader.cpp
index 8b22430..3d4b255 100644
--- a/src/shaders/gradients/SkGradientShader.cpp
+++ b/src/shaders/gradients/SkGradientShader.cpp
@@ -149,16 +149,10 @@
         fColorCount += dummyFirst + dummyLast;
     }
 
-    if (fColorCount > kColorStorageCount) {
-        size_t size = sizeof(SkColor4f);
-        if (desc.fPos) {
-            size += sizeof(SkScalar);
-        }
-        fOrigColors4f = reinterpret_cast<SkColor4f*>(sk_malloc_throw(size * fColorCount));
-    }
-    else {
-        fOrigColors4f = fStorage;
-    }
+    size_t storageSize = fColorCount * (sizeof(SkColor4f) + (desc.fPos ? sizeof(SkScalar) : 0));
+    fOrigColors4f      = reinterpret_cast<SkColor4f*>(fStorage.reset(storageSize));
+    fOrigPos           = desc.fPos ? reinterpret_cast<SkScalar*>(fOrigColors4f + fColorCount)
+                                   : nullptr;
 
     // Now copy over the colors, adding the dummies as needed
     SkColor4f* origColors = fOrigColors4f;
@@ -184,45 +178,20 @@
         fColorSpace = desc.fColorSpace;
     }
 
-    if (desc.fPos && fColorCount) {
-        fOrigPos = (SkScalar*)(fOrigColors4f + fColorCount);
-    } else {
-        fOrigPos = nullptr;
-    }
+    if (desc.fPos) {
+        SkScalar* origPosPtr = fOrigPos;
+        *origPosPtr++ = 0; // force the first pos to 0
 
-    if (fColorCount > 2) {
-        if (desc.fPos) {
-            SkScalar* origPosPtr = fOrigPos;
-            *origPosPtr++ = 0;
-
-            int startIndex = dummyFirst ? 0 : 1;
-            int count = desc.fCount + dummyLast;
-            for (int i = startIndex; i < count; i++) {
-                // force the last value to be 1.0
-                SkScalar curr;
-                if (i == desc.fCount) {  // we're really at the dummyLast
-                    curr = 1;
-                } else {
-                    curr = SkScalarPin(desc.fPos[i], 0, 1);
-                }
-                *origPosPtr++ = curr;
-            }
-        }
-    } else if (desc.fPos) {
-        SkASSERT(2 == fColorCount);
-        fOrigPos[0] = SkScalarPin(desc.fPos[0], 0, 1);
-        fOrigPos[1] = SkScalarPin(desc.fPos[1], fOrigPos[0], 1);
-        if (0 == fOrigPos[0] && 1 == fOrigPos[1]) {
-            fOrigPos = nullptr;
+        int startIndex = dummyFirst ? 0 : 1;
+        int count = desc.fCount + dummyLast;
+        for (int i = startIndex; i < count; i++) {
+            // force the last value to be 1.0
+            *origPosPtr++ = (i == desc.fCount) ? 1 : SkScalarPin(desc.fPos[i], 0, 1);
         }
     }
 }
 
-SkGradientShaderBase::~SkGradientShaderBase() {
-    if (fOrigColors4f != fStorage) {
-        sk_free(fOrigColors4f);
-    }
-}
+SkGradientShaderBase::~SkGradientShaderBase() {}
 
 void SkGradientShaderBase::flatten(SkWriteBuffer& buffer) const {
     Descriptor desc;
diff --git a/src/shaders/gradients/SkGradientShaderPriv.h b/src/shaders/gradients/SkGradientShaderPriv.h
index 7084dc6..0ef8626 100644
--- a/src/shaders/gradients/SkGradientShaderPriv.h
+++ b/src/shaders/gradients/SkGradientShaderPriv.h
@@ -117,14 +117,6 @@
     TileMode       fTileMode;
     uint8_t        fGradFlags;
 
-private:
-    enum {
-        kColorStorageCount = 4, // more than this many colors, and we'll use sk_malloc for the space
-
-        kStorageSize = kColorStorageCount * (sizeof(SkColor4f) + sizeof(SkScalar))
-    };
-    SkColor4f fStorage[(kStorageSize + sizeof(SkColor4f) - 1) / sizeof(SkColor4f)];
-
 public:
     SkScalar getPos(int i) const {
         SkASSERT(i < fColorCount);
@@ -146,7 +138,13 @@
     TileMode getTileMode() const { return fTileMode; }
 
 private:
-    bool                fColorsAreOpaque;
+    // Reserve inline space for up to 4 stops.
+    static constexpr size_t kInlineStopCount   = 4;
+    static constexpr size_t kInlineStorageSize = (sizeof(SkColor4f) + sizeof(SkScalar))
+                                               * kInlineStopCount;
+    SkAutoSTMalloc<kInlineStorageSize, uint8_t> fStorage;
+
+    bool                                        fColorsAreOpaque;
 
     typedef SkShaderBase INHERITED;
 };