return and take SkImageGenerator as unique_ptr

BUG=skia:

Change-Id: I4bc11042dd1dbf1eabd40af206027bc65acc3186
Reviewed-on: https://skia-review.googlesource.com/8444
Commit-Queue: Mike Reed <reed@google.com>
Reviewed-by: Matt Sarett <msarett@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/codec/SkCodecImageGenerator.cpp b/src/codec/SkCodecImageGenerator.cpp
index 447332b..56ca21e 100644
--- a/src/codec/SkCodecImageGenerator.cpp
+++ b/src/codec/SkCodecImageGenerator.cpp
@@ -6,14 +6,15 @@
  */
 
 #include "SkCodecImageGenerator.h"
+#include "SkMakeUnique.h"
 
-SkImageGenerator* SkCodecImageGenerator::NewFromEncodedCodec(sk_sp<SkData> data) {
+std::unique_ptr<SkImageGenerator> SkCodecImageGenerator::MakeFromEncodedCodec(sk_sp<SkData> data) {
     SkCodec* codec = SkCodec::NewFromData(data);
     if (nullptr == codec) {
         return nullptr;
     }
 
-    return new SkCodecImageGenerator(codec, data);
+    return std::unique_ptr<SkImageGenerator>(new SkCodecImageGenerator(codec, data));
 }
 
 static SkImageInfo make_premul(const SkImageInfo& info) {
diff --git a/src/codec/SkCodecImageGenerator.h b/src/codec/SkCodecImageGenerator.h
index d771f49..727a747 100644
--- a/src/codec/SkCodecImageGenerator.h
+++ b/src/codec/SkCodecImageGenerator.h
@@ -18,10 +18,7 @@
      * If this data represents an encoded image that we know how to decode,
      * return an SkCodecImageGenerator.  Otherwise return nullptr.
      */
-    static SkImageGenerator* NewFromEncodedCodec(sk_sp<SkData>);
-    static SkImageGenerator* NewFromEncodedCodec(SkData* data) {
-        return NewFromEncodedCodec(sk_ref_sp(data));
-    }
+    static std::unique_ptr<SkImageGenerator> MakeFromEncodedCodec(sk_sp<SkData>);
 
 protected:
     SkData* onRefEncodedData(GrContext* ctx) override;
diff --git a/src/core/SkImageCacherator.cpp b/src/core/SkImageCacherator.cpp
index 4534851..e971883 100644
--- a/src/core/SkImageCacherator.cpp
+++ b/src/core/SkImageCacherator.cpp
@@ -101,9 +101,9 @@
     }
 }
 
-SkImageCacherator* SkImageCacherator::NewFromGenerator(SkImageGenerator* gen,
+SkImageCacherator* SkImageCacherator::NewFromGenerator(std::unique_ptr<SkImageGenerator> gen,
                                                        const SkIRect* subset) {
-    Validator validator(SharedGenerator::Make(gen), subset);
+    Validator validator(SharedGenerator::Make(std::move(gen)), subset);
 
     return validator ? new SkImageCacherator(&validator) : nullptr;
 }
diff --git a/src/core/SkImageCacherator.h b/src/core/SkImageCacherator.h
index 528dc0e..9733936 100644
--- a/src/core/SkImageCacherator.h
+++ b/src/core/SkImageCacherator.h
@@ -24,8 +24,8 @@
  */
 class SkImageCacherator {
 public:
-    // Takes ownership of the generator
-    static SkImageCacherator* NewFromGenerator(SkImageGenerator*, const SkIRect* subset = nullptr);
+    static SkImageCacherator* NewFromGenerator(std::unique_ptr<SkImageGenerator>,
+                                               const SkIRect* subset = nullptr);
 
     ~SkImageCacherator();
 
@@ -90,12 +90,16 @@
     // among several cacherators.
     class SharedGenerator final : public SkNVRefCnt<SharedGenerator> {
     public:
-        static sk_sp<SharedGenerator> Make(SkImageGenerator* gen) {
-            return gen ? sk_sp<SharedGenerator>(new SharedGenerator(gen)) : nullptr;
+        static sk_sp<SharedGenerator> Make(std::unique_ptr<SkImageGenerator> gen) {
+            return gen ? sk_sp<SharedGenerator>(new SharedGenerator(std::move(gen))) : nullptr;
         }
 
     private:
-        explicit SharedGenerator(SkImageGenerator* gen) : fGenerator(gen) { SkASSERT(gen); }
+        explicit SharedGenerator(std::unique_ptr<SkImageGenerator> gen)
+            : fGenerator(std::move(gen))
+        {
+            SkASSERT(fGenerator);
+        }
 
         friend class ScopedGenerator;
         friend class SkImageCacherator;
diff --git a/src/core/SkImageGenerator.cpp b/src/core/SkImageGenerator.cpp
index b815fbf..d4d42ba 100644
--- a/src/core/SkImageGenerator.cpp
+++ b/src/core/SkImageGenerator.cpp
@@ -174,24 +174,57 @@
 
 #include "SkGraphics.h"
 
-static SkGraphics::ImageGeneratorFromEncodedFactory gFactory;
+static SkGraphics::ImageGeneratorFromEncodedDataFactory gFactory;
 
-SkGraphics::ImageGeneratorFromEncodedFactory
-SkGraphics::SetImageGeneratorFromEncodedFactory(ImageGeneratorFromEncodedFactory factory)
+SkGraphics::ImageGeneratorFromEncodedDataFactory
+SkGraphics::SetImageGeneratorFromEncodedDataFactory(ImageGeneratorFromEncodedDataFactory factory)
 {
-    ImageGeneratorFromEncodedFactory prev = gFactory;
+    ImageGeneratorFromEncodedDataFactory prev = gFactory;
     gFactory = factory;
     return prev;
 }
 
-SkImageGenerator* SkImageGenerator::NewFromEncoded(SkData* data) {
-    if (nullptr == data) {
+#ifdef SK_SUPPORT_BARE_PTR_IMAGEGENERATOR
+static SkGraphics::ImageGeneratorFromEncodedFactory gLegacyFactory;
+SkGraphics::ImageGeneratorFromEncodedFactory
+SkGraphics::SetImageGeneratorFromEncodedFactory(ImageGeneratorFromEncodedFactory factory)
+{
+    ImageGeneratorFromEncodedFactory prev = gLegacyFactory;
+    gLegacyFactory = factory;
+    return prev;
+}
+#endif
+
+std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncoded(sk_sp<SkData> data) {
+    if (!data) {
         return nullptr;
     }
     if (gFactory) {
-        if (SkImageGenerator* generator = gFactory(data)) {
+        if (std::unique_ptr<SkImageGenerator> generator = gFactory(data)) {
             return generator;
         }
     }
-    return SkImageGenerator::NewFromEncodedImpl(data);
+#ifdef SK_SUPPORT_BARE_PTR_IMAGEGENERATOR
+    if (gLegacyFactory) {
+        if (SkImageGenerator* generator = gLegacyFactory(data.get())) {
+            return std::unique_ptr<SkImageGenerator>(generator);
+        }
+    }
+#endif
+    return SkImageGenerator::MakeFromEncodedImpl(std::move(data));
 }
+
+#ifdef SK_SUPPORT_BARE_PTR_IMAGEGENERATOR
+#include "SkPicture.h"
+
+SkImageGenerator* SkImageGenerator::NewFromPicture(const SkISize& size, const SkPicture* picture,
+                                                   const SkMatrix* matrix, const SkPaint* paint,
+                                                   SkImage::BitDepth depth,
+                                                   sk_sp<SkColorSpace> cs) {
+    return MakeFromPicture(size, sk_ref_sp(const_cast<SkPicture*>(picture)), matrix, paint,
+                           depth, std::move(cs)).release();
+}
+SkImageGenerator* SkImageGenerator::NewFromEncoded(SkData* data) {
+    return MakeFromEncoded(sk_ref_sp(data)).release();
+}
+#endif
diff --git a/src/core/SkPictureImageGenerator.cpp b/src/core/SkPictureImageGenerator.cpp
index 618312e..44a6b82 100644
--- a/src/core/SkPictureImageGenerator.cpp
+++ b/src/core/SkPictureImageGenerator.cpp
@@ -7,16 +7,17 @@
 
 #include "SkImage_Base.h"
 #include "SkCanvas.h"
+#include "SkMakeUnique.h"
 #include "SkMatrix.h"
 #include "SkPaint.h"
 #include "SkPicture.h"
 #include "SkPictureImageGenerator.h"
 #include "SkSurface.h"
 
-SkImageGenerator* SkPictureImageGenerator::Create(const SkISize& size, const SkPicture* picture,
-                                                  const SkMatrix* matrix, const SkPaint* paint,
-                                                  SkImage::BitDepth bitDepth,
-                                                  sk_sp<SkColorSpace> colorSpace) {
+std::unique_ptr<SkImageGenerator>
+SkPictureImageGenerator::Make(const SkISize& size, sk_sp<SkPicture> picture, const SkMatrix* matrix,
+                              const SkPaint* paint, SkImage::BitDepth bitDepth,
+                              sk_sp<SkColorSpace> colorSpace) {
     if (!picture || size.isEmpty()) {
         return nullptr;
     }
@@ -36,13 +37,14 @@
 
     SkImageInfo info = SkImageInfo::Make(size.width(), size.height(), colorType,
                                          kPremul_SkAlphaType, std::move(colorSpace));
-    return new SkPictureImageGenerator(info, picture, matrix, paint);
+    return std::unique_ptr<SkImageGenerator>(
+                             new SkPictureImageGenerator(info, std::move(picture), matrix, paint));
 }
 
-SkPictureImageGenerator::SkPictureImageGenerator(const SkImageInfo& info, const SkPicture* picture,
+SkPictureImageGenerator::SkPictureImageGenerator(const SkImageInfo& info, sk_sp<SkPicture> picture,
                                                  const SkMatrix* matrix, const SkPaint* paint)
     : INHERITED(info)
-    , fPicture(SkRef(picture)) {
+    , fPicture(std::move(picture)) {
 
     if (matrix) {
         fMatrix = *matrix;
@@ -75,18 +77,18 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-SkImageGenerator* SkImageGenerator::NewFromPicture(const SkISize& size, const SkPicture* picture,
-                                                   const SkMatrix* matrix, const SkPaint* paint,
-                                                   SkImage::BitDepth bitDepth,
-                                                   sk_sp<SkColorSpace> colorSpace) {
+std::unique_ptr<SkImageGenerator>
+SkImageGenerator::MakeFromPicture(const SkISize& size, sk_sp<SkPicture> picture,
+                                  const SkMatrix* matrix, const SkPaint* paint,
+                                  SkImage::BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace) {
     // Check this here (rather than in SkPictureImageGenerator::Create) so SkPictureShader
     // has a private entry point to create legacy picture backed images.
     if (!colorSpace) {
         return nullptr;
     }
 
-    return SkPictureImageGenerator::Create(size, picture, matrix, paint, bitDepth,
-                                           std::move(colorSpace));
+    return SkPictureImageGenerator::Make(size, std::move(picture), matrix, paint, bitDepth,
+                                         std::move(colorSpace));
 }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/core/SkPictureImageGenerator.h b/src/core/SkPictureImageGenerator.h
index 4728d21..ec63e30 100644
--- a/src/core/SkPictureImageGenerator.h
+++ b/src/core/SkPictureImageGenerator.h
@@ -10,10 +10,11 @@
 #include "SkImageGenerator.h"
 #include "SkTLazy.h"
 
-class SkPictureImageGenerator : SkImageGenerator {
+class SkPictureImageGenerator : public SkImageGenerator {
 public:
-    static SkImageGenerator* Create(const SkISize&, const SkPicture*, const SkMatrix*,
-                                    const SkPaint*, SkImage::BitDepth, sk_sp<SkColorSpace>);
+    static std::unique_ptr<SkImageGenerator> Make(const SkISize&, sk_sp<SkPicture>, const SkMatrix*,
+                                                  const SkPaint*, SkImage::BitDepth,
+                                                  sk_sp<SkColorSpace>);
 
 protected:
     bool onGetPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, SkPMColor ctable[],
@@ -24,12 +25,12 @@
 #endif
 
 private:
-    SkPictureImageGenerator(const SkImageInfo& info, const SkPicture*, const SkMatrix*,
+    SkPictureImageGenerator(const SkImageInfo& info, sk_sp<SkPicture>, const SkMatrix*,
                             const SkPaint*);
 
-    sk_sp<const SkPicture> fPicture;
-    SkMatrix               fMatrix;
-    SkTLazy<SkPaint>       fPaint;
+    sk_sp<SkPicture>    fPicture;
+    SkMatrix            fMatrix;
+    SkTLazy<SkPaint>    fPaint;
 
     typedef SkImageGenerator INHERITED;
 };
diff --git a/src/core/SkPictureShader.cpp b/src/core/SkPictureShader.cpp
index a957613..69f92ec 100644
--- a/src/core/SkPictureShader.cpp
+++ b/src/core/SkPictureShader.cpp
@@ -228,8 +228,8 @@
                                  SkMatrix::kFill_ScaleToFit);
 
         sk_sp<SkImage> tileImage = SkImage::MakeFromGenerator(
-                SkPictureImageGenerator::Create(tileSize, fPicture.get(), &tileMatrix, nullptr,
-                                                SkImage::BitDepth::kU8, sk_ref_sp(dstColorSpace)));
+                SkPictureImageGenerator::Make(tileSize, fPicture, &tileMatrix, nullptr,
+                                              SkImage::BitDepth::kU8, sk_ref_sp(dstColorSpace)));
         if (!tileImage) {
             return nullptr;
         }
diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
index b4fc168..33e1d02 100644
--- a/src/core/SkReadBuffer.cpp
+++ b/src/core/SkReadBuffer.cpp
@@ -10,6 +10,7 @@
 #include "SkImage.h"
 #include "SkImageDeserializer.h"
 #include "SkImageGenerator.h"
+#include "SkMakeUnique.h"
 #include "SkReadBuffer.h"
 #include "SkStream.h"
 #include "SkTypeface.h"
@@ -28,7 +29,7 @@
 
     static sk_sp<SkImage> MakeEmptyImage(int width, int height) {
         return SkImage::MakeFromGenerator(
-            new EmptyImageGenerator(SkImageInfo::MakeN32Premul(width, height)));
+              skstd::make_unique<EmptyImageGenerator>(SkImageInfo::MakeN32Premul(width, height)));
     }
 
 } // anonymous namespace
diff --git a/src/image/SkImage.cpp b/src/image/SkImage.cpp
index 7619acd..2ae01b8 100644
--- a/src/image/SkImage.cpp
+++ b/src/image/SkImage.cpp
@@ -129,8 +129,7 @@
     if (nullptr == encoded || 0 == encoded->size()) {
         return nullptr;
     }
-    SkImageGenerator* generator = SkImageGenerator::NewFromEncoded(encoded.get());
-    return SkImage::MakeFromGenerator(generator, subset);
+    return SkImage::MakeFromGenerator(SkImageGenerator::MakeFromEncoded(encoded), subset);
 }
 
 const char* SkImage::toString(SkString* str) const {
@@ -263,9 +262,9 @@
 sk_sp<SkImage> SkImage::MakeFromPicture(sk_sp<SkPicture> picture, const SkISize& dimensions,
                                         const SkMatrix* matrix, const SkPaint* paint,
                                         BitDepth bitDepth, sk_sp<SkColorSpace> colorSpace) {
-    return MakeFromGenerator(SkImageGenerator::NewFromPicture(dimensions, picture.get(), matrix,
-                                                              paint, bitDepth,
-                                                              std::move(colorSpace)));
+    return MakeFromGenerator(SkImageGenerator::MakeFromPicture(dimensions, std::move(picture),
+                                                               matrix, paint, bitDepth,
+                                                               std::move(colorSpace)));
 }
 sk_sp<SkImage> SkImage::makeWithFilter(const SkImageFilter* filter, const SkIRect& subset,
                                        const SkIRect& clipBounds, SkIRect* outSubset,
diff --git a/src/image/SkImage_Generator.cpp b/src/image/SkImage_Generator.cpp
index da9d61a..7e47523 100644
--- a/src/image/SkImage_Generator.cpp
+++ b/src/image/SkImage_Generator.cpp
@@ -93,9 +93,16 @@
     return validator ? sk_sp<SkImage>(new SkImage_Generator(&validator)) : nullptr;
 }
 
-sk_sp<SkImage> SkImage::MakeFromGenerator(SkImageGenerator* generator, const SkIRect* subset) {
-    SkImageCacherator::Validator validator(SkImageCacherator::SharedGenerator::Make(generator),
-                                           subset);
+sk_sp<SkImage> SkImage::MakeFromGenerator(std::unique_ptr<SkImageGenerator> generator,
+                                          const SkIRect* subset) {
+    SkImageCacherator::Validator validator(
+                       SkImageCacherator::SharedGenerator::Make(std::move(generator)), subset);
 
     return validator ? sk_make_sp<SkImage_Generator>(&validator) : nullptr;
 }
+
+#ifdef SK_SUPPORT_BARE_PTR_IMAGEGENERATOR
+sk_sp<SkImage> SkImage::MakeFromGenerator(SkImageGenerator* gen, const SkIRect* subset) {
+    return MakeFromGenerator(std::unique_ptr<SkImageGenerator>(gen), subset);
+}
+#endif
diff --git a/src/ports/SkImageGenerator_none.cpp b/src/ports/SkImageGenerator_none.cpp
index 2dce1c2..5aeb5cb 100644
--- a/src/ports/SkImageGenerator_none.cpp
+++ b/src/ports/SkImageGenerator_none.cpp
@@ -7,6 +7,6 @@
 
 #include "SkImageGenerator.h"
 
-SkImageGenerator* SkImageGenerator::NewFromEncodedImpl(SkData*) {
+std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncodedImpl(sk_sp<SkData>) {
     return nullptr;
 }
diff --git a/src/ports/SkImageGenerator_skia.cpp b/src/ports/SkImageGenerator_skia.cpp
index b6ddee9..e310b7f 100644
--- a/src/ports/SkImageGenerator_skia.cpp
+++ b/src/ports/SkImageGenerator_skia.cpp
@@ -8,6 +8,6 @@
 #include "SkData.h"
 #include "SkCodecImageGenerator.h"
 
-SkImageGenerator* SkImageGenerator::NewFromEncodedImpl(SkData* data) {
-    return SkCodecImageGenerator::NewFromEncodedCodec(data);
+std::unique_ptr<SkImageGenerator> SkImageGenerator::MakeFromEncodedImpl(sk_sp<SkData> data) {
+    return SkCodecImageGenerator::MakeFromEncodedCodec(std::move(data));
 }