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);
}