Use SkUniqueCFRef in SkImage*CG.

This clarifies ownership and makes the code more readable.

It is safe to use unique_ptr directly for UniqueCFRef, since
unique_ptr does not call the deleter with nullptr.

Change-Id: I4326a86059fb31488d1e163faca95a6c29960039
Reviewed-on: https://skia-review.googlesource.com/155612
Commit-Queue: Hal Canary <halcanary@google.com>
Reviewed-by: Hal Canary <halcanary@google.com>
diff --git a/src/ports/SkImageGeneratorCG.cpp b/src/ports/SkImageGeneratorCG.cpp
index 10ac5f3..a716cab 100644
--- a/src/ports/SkImageGeneratorCG.cpp
+++ b/src/ports/SkImageGeneratorCG.cpp
@@ -5,6 +5,7 @@
  * found in the LICENSE file.
  */
 
+#include "mac/SkUniqueCFRef.h"
 #include "SkCGUtils.h"
 #include "SkEncodedOrigin.h"
 #include "SkImageGeneratorCG.h"
@@ -24,8 +25,8 @@
 namespace {
 class ImageGeneratorCG : public SkImageGenerator {
 public:
-    /* Takes ownership of the imageSrc */
-    ImageGeneratorCG(const SkImageInfo&, const void* imageSrc, sk_sp<SkData> data, SkEncodedOrigin);
+    ImageGeneratorCG(const SkImageInfo&, SkUniqueCFRef<CGImageSourceRef> imageSrc,
+                     sk_sp<SkData> data, SkEncodedOrigin);
 
 protected:
     sk_sp<SkData> onRefEncodedData() override;
@@ -33,63 +34,59 @@
     bool onGetPixels(const SkImageInfo&, void* pixels, size_t rowBytes, const Options&) override;
 
 private:
-    SkAutoTCallVProc<const void, CFRelease> fImageSrc;
-    sk_sp<SkData>                           fData;
-    const SkEncodedOrigin                   fOrigin;
+    const SkUniqueCFRef<CGImageSourceRef> fImageSrc;
+    const sk_sp<SkData> fData;
+    const SkEncodedOrigin fOrigin;
 
     typedef SkImageGenerator INHERITED;
 };
 
-static CGImageSourceRef data_to_CGImageSrc(SkData* data) {
-    CGDataProviderRef cgData = CGDataProviderCreateWithData(data, data->data(), data->size(),
-                                                            nullptr);
+static SkUniqueCFRef<CGImageSourceRef> data_to_CGImageSrc(SkData* data) {
+    SkUniqueCFRef<CGDataProviderRef> cgData(
+            CGDataProviderCreateWithData(data, data->data(), data->size(), nullptr));
     if (!cgData) {
         return nullptr;
     }
-    CGImageSourceRef imageSrc = CGImageSourceCreateWithDataProvider(cgData, 0);
-    CGDataProviderRelease(cgData);
-    return imageSrc;
+    return SkUniqueCFRef<CGImageSourceRef>(
+            CGImageSourceCreateWithDataProvider(cgData.get(), nullptr));
 }
 
 }  // namespace
 
 std::unique_ptr<SkImageGenerator> SkImageGeneratorCG::MakeFromEncodedCG(sk_sp<SkData> data) {
-    CGImageSourceRef imageSrc = data_to_CGImageSrc(data.get());
+    SkUniqueCFRef<CGImageSourceRef> imageSrc = data_to_CGImageSrc(data.get());
     if (!imageSrc) {
         return nullptr;
     }
 
-    // Make sure we call CFRelease to free the imageSrc.  Since CFRelease actually takes
-    // a const void*, we must cast the imageSrc to a const void*.
-    SkAutoTCallVProc<const void, CFRelease> autoImageSrc(imageSrc);
-
-    CFDictionaryRef properties = CGImageSourceCopyPropertiesAtIndex(imageSrc, 0, nullptr);
+    SkUniqueCFRef<CFDictionaryRef> properties(
+            CGImageSourceCopyPropertiesAtIndex(imageSrc.get(), 0, nullptr));
     if (!properties) {
         return nullptr;
     }
 
-    CFNumberRef widthRef = (CFNumberRef) (CFDictionaryGetValue(properties,
-            kCGImagePropertyPixelWidth));
-    CFNumberRef heightRef = (CFNumberRef) (CFDictionaryGetValue(properties,
-            kCGImagePropertyPixelHeight));
+    CFNumberRef widthRef = static_cast<CFNumberRef>(
+            CFDictionaryGetValue(properties.get(), kCGImagePropertyPixelWidth));
+    CFNumberRef heightRef = static_cast<CFNumberRef>(
+            CFDictionaryGetValue(properties.get(), kCGImagePropertyPixelHeight));
     if (nullptr == widthRef || nullptr == heightRef) {
         return nullptr;
     }
 
     int width, height;
-    if (!CFNumberGetValue(widthRef, kCFNumberIntType, &width) ||
-            !CFNumberGetValue(heightRef, kCFNumberIntType, &height)) {
+    if (!CFNumberGetValue(widthRef , kCFNumberIntType, &width ) ||
+        !CFNumberGetValue(heightRef, kCFNumberIntType, &height))
+    {
         return nullptr;
     }
 
-    bool hasAlpha = (bool) (CFDictionaryGetValue(properties,
-            kCGImagePropertyHasAlpha));
+    bool hasAlpha = bool(CFDictionaryGetValue(properties.get(), kCGImagePropertyHasAlpha));
     SkAlphaType alphaType = hasAlpha ? kPremul_SkAlphaType : kOpaque_SkAlphaType;
     SkImageInfo info = SkImageInfo::MakeS32(width, height, alphaType);
 
-    auto origin = kDefault_SkEncodedOrigin;
-    auto orientationRef = (CFNumberRef) (CFDictionaryGetValue(properties,
-            kCGImagePropertyOrientation));
+    SkEncodedOrigin origin = kDefault_SkEncodedOrigin;
+    CFNumberRef orientationRef = static_cast<CFNumberRef>(
+            CFDictionaryGetValue(properties.get(), kCGImagePropertyOrientation));
     int originInt;
     if (orientationRef && CFNumberGetValue(orientationRef, kCFNumberIntType, &originInt)) {
         origin = (SkEncodedOrigin) originInt;
@@ -103,14 +100,14 @@
     //        though I think it makes sense to wait until we understand how
     //        we want to communicate it to the generator.
 
-    return std::unique_ptr<SkImageGenerator>(new ImageGeneratorCG(info, autoImageSrc.release(),
+    return std::unique_ptr<SkImageGenerator>(new ImageGeneratorCG(info, std::move(imageSrc),
                                                                   std::move(data), origin));
 }
 
-ImageGeneratorCG::ImageGeneratorCG(const SkImageInfo& info, const void* imageSrc,
+ImageGeneratorCG::ImageGeneratorCG(const SkImageInfo& info, SkUniqueCFRef<CGImageSourceRef> src,
                                    sk_sp<SkData> data, SkEncodedOrigin origin)
     : INHERITED(info)
-    , fImageSrc(imageSrc)
+    , fImageSrc(std::move(src))
     , fData(std::move(data))
     , fOrigin(origin)
 {}
@@ -139,12 +136,10 @@
             return false;
     }
 
-    CGImageRef image = CGImageSourceCreateImageAtIndex((CGImageSourceRef) fImageSrc.get(), 0,
-                                                       nullptr);
+    SkUniqueCFRef<CGImageRef> image(CGImageSourceCreateImageAtIndex(fImageSrc.get(), 0, nullptr));
     if (!image) {
         return false;
     }
-    SkAutoTCallVProc<CGImage, CGImageRelease> autoImage(image);
 
     SkPixmap dst(info, pixels, rowBytes);
     auto decode = [&image](const SkPixmap& pm) {
@@ -156,7 +151,7 @@
         //     kGray_8_SkColorType
         // Additionally, it would be interesting to compare the performance
         // of SkSwizzler with CG's built in swizzler.
-        return SkCopyPixelsFromCGImage(pm, image);
+        return SkCopyPixelsFromCGImage(pm, image.get());
     };
     return SkPixmapPriv::Orient(dst, fOrigin, decode);
 }