Expose helper for decoding images on mac

Fissioning from larger PR for coregraphics renderer ...

Diffs=
7093089a7 Expose helper for decoding images on mac
diff --git a/.rive_head b/.rive_head
index b55209e..7931a13 100644
--- a/.rive_head
+++ b/.rive_head
@@ -1 +1 @@
-4055c3cd6b9725495715fc1121ac611ad9243d28
+7093089a798479fc840dba7aadc88ce27b10ca44
diff --git a/skia/renderer/include/mac_utils.hpp b/skia/renderer/include/mac_utils.hpp
index 2f53e79..8c4a6f5 100644
--- a/skia/renderer/include/mac_utils.hpp
+++ b/skia/renderer/include/mac_utils.hpp
@@ -2,12 +2,16 @@
 #define _RIVE_MAC_UTILS_HPP_
 
 #include "rive/rive_types.hpp"
+#include "rive/span.hpp"
 #include <string>
 
+#ifdef RIVE_BUILD_FOR_APPLE
+
 #if defined(RIVE_BUILD_FOR_OSX)
 #include <ApplicationServices/ApplicationServices.h>
 #elif defined(RIVE_BUILD_FOR_IOS)
 #include <CoreFoundation/CoreFoundation.h>
+#include <CoreGraphics/CGImage.h>
 #endif
 
 template <size_t N, typename T> class AutoSTArray {
@@ -59,6 +63,18 @@
             CFRelease(m_Obj);
     }
 
+    AutoCF(const AutoCF&) = delete;
+    void operator=(const AutoCF&) = delete;
+
+    void reset(T obj) {
+        if (obj != m_Obj) {
+            if (m_Obj) {
+                CFRelease(m_Obj);
+            }
+            m_Obj = obj;
+        }
+    }
+
     operator T() const { return m_Obj; }
     operator bool() const { return m_Obj != nullptr; }
     T get() const { return m_Obj; }
@@ -93,4 +109,9 @@
     return value;
 }
 
+namespace rive {
+    CGImageRef DecodeToCGImage(Span<const uint8_t>);
+}
+
+#endif
 #endif
diff --git a/skia/renderer/src/cg_skia_factory.cpp b/skia/renderer/src/cg_skia_factory.cpp
index 4ba3e9a..188829c 100644
--- a/skia/renderer/src/cg_skia_factory.cpp
+++ b/skia/renderer/src/cg_skia_factory.cpp
@@ -23,17 +23,7 @@
                                                    SkiaFactory::ImageInfo* info) {
     std::vector<uint8_t> pixels;
 
-    AutoCF data = CFDataCreateWithBytesNoCopy(nullptr, span.data(), span.size(), nullptr);
-    if (!data) {
-        return pixels;
-    }
-
-    AutoCF source = CGImageSourceCreateWithData(data, nullptr);
-    if (!source) {
-        return pixels;
-    }
-
-    AutoCF image = CGImageSourceCreateImageAtIndex(source, 0, nullptr);
+    AutoCF image = DecodeToCGImage(span);
     if (!image) {
         return pixels;
     }
diff --git a/skia/renderer/src/mac_utils.cpp b/skia/renderer/src/mac_utils.cpp
new file mode 100644
index 0000000..de6a2a3
--- /dev/null
+++ b/skia/renderer/src/mac_utils.cpp
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2022 Rive
+ */
+
+#include "mac_utils.hpp"
+
+#ifdef RIVE_BUILD_FOR_APPLE
+
+#if defined(RIVE_BUILD_FOR_IOS)
+#include <CoreGraphics/CGImage.h>
+#include <ImageIO/CGImageSource.h>
+#endif
+
+CGImageRef rive::DecodeToCGImage(rive::Span<const uint8_t> span) {
+    AutoCF data = CFDataCreateWithBytesNoCopy(nullptr, span.data(), span.size(), nullptr);
+    if (!data) {
+        return nullptr;
+    }
+
+    AutoCF source = CGImageSourceCreateWithData(data, nullptr);
+    if (!source) {
+        return nullptr;
+    }
+
+    return CGImageSourceCreateImageAtIndex(source, 0, nullptr);
+}
+
+#endif