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