diff --git a/CMakeLists.txt b/CMakeLists.txt index 2852111..67c269e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,10 @@ add_library(${PROJECT_NAME} SHARED ${SOURCES} src/platform/Mac.mm) set_source_files_properties(src/platform/Mac.mm PROPERTIES SKIP_PRECOMPILE_HEADERS ON) +if ("${CMAKE_SYSTEM_NAME}" STREQUAL "iOS" OR IOS) + target_link_libraries(${PROJECT_NAME} "-framework CoreGraphics") +endif() + if (NOT DEFINED ENV{GEODE_SDK}) message(FATAL_ERROR "Unable to find Geode SDK! Please define GEODE_SDK environment variable to point to Geode") else() diff --git a/src/pages/Attributes.cpp b/src/pages/Attributes.cpp index 79ac1b1..18b695a 100644 --- a/src/pages/Attributes.cpp +++ b/src/pages/Attributes.cpp @@ -76,7 +76,7 @@ void DevTools::drawBasicAttributes(CCNode* node) { int width, height; auto bytes = renderToBytes(node, width, height); - saveRenderToFile(bytes, width, height, file->c_str()); + saveRenderToFile(bytes, width, height, string::pathToString(*file).c_str()); } }); } @@ -85,7 +85,7 @@ void DevTools::drawBasicAttributes(CCNode* node) { ImGui::SameLine(); if (ImGui::Button(U8STR(FEATHER_COPY " Copy"))) { clipboard::write( - utils::intToHex(reinterpret_cast(node)) + fmt::format("{:#x}", reinterpret_cast(node)) ); } if (node->getUserData()) { diff --git a/src/platform/Android.cpp b/src/platform/Android.cpp index 81e3082..9e795ff 100644 --- a/src/platform/Android.cpp +++ b/src/platform/Android.cpp @@ -7,15 +7,16 @@ using namespace geode::prelude; #include "utils.hpp" std::string formatAddressIntoOffsetImpl(uintptr_t addr, bool module) { - if (addr > base::get() && addr - 0x1000000 < base::get()) + if (addr > base::get() && addr - 0x1000000 < base::get()) { if(module) return fmt::format("libcocos2d.so + {:#x}", addr - base::get()); else return fmt::format("{:#x}", addr - base::get()); + } return fmt::format("{:#x}", addr); } -void saveRenderToFile(std::vector const& data, float width, float height, char const* filename) { +void saveRenderToFile(std::vector const& data, int width, int height, char const* filename) { auto img = new CCImage; - img->initWithImageData((void*)data.data(), data.size(), kCCImageFormatRGBA8888, width, height, 8); + img->initWithImageData((void*)data.data(), data.size(), CCImage::kFmtRawData, width, height, 8); img->saveToFile(filename); } diff --git a/src/platform/Mac.mm b/src/platform/Mac.mm index afff3c2..10d6f98 100644 --- a/src/platform/Mac.mm +++ b/src/platform/Mac.mm @@ -21,7 +21,11 @@ #import #import +#ifdef GEODE_IS_MACOS #include +#else +#import +#endif static std::vector getAllImages() { std::vector images; @@ -114,7 +118,7 @@ void saveRenderToFile(std::vector const& data, int width, int height, c 32, width * 4, colorSpace, - kCGBitmapByteOrderDefault | kCGImageAlphaPremultipliedLast, + kCGImageAlphaPremultipliedLast, provider, NULL, false, @@ -128,6 +132,29 @@ void saveRenderToFile(std::vector const& data, int width, int height, c return; } + #ifdef GEODE_IS_IOS + UIImage* image = [UIImage imageWithCGImage:cgImg]; + if (!image) { + geode::log::error("Failed to create UIImage"); + CGImageRelease(cgImg); + CGDataProviderRelease(provider); + CGColorSpaceRelease(colorSpace); + return; + } + + NSData* pngData = UIImagePNGRepresentation(image); + if (!pngData) { + geode::log::error("Failed to create PNG data from UIImage"); + CGImageRelease(cgImg); + CGDataProviderRelease(provider); + CGColorSpaceRelease(colorSpace); + return; + } + + if (auto err = geode::utils::file::writeBinary(filename, { (uint8_t*)pngData.bytes, (uint8_t*)pngData.bytes + pngData.length }).err()) { + geode::log::error("Failed to write image to {}: {}", filename, err); + } + #else CFMutableDataRef pngData = CFDataCreateMutable(NULL, 0); CGImageDestinationRef destination = CGImageDestinationCreateWithData(pngData, kUTTypePNG, 1, NULL); if (!destination) { @@ -160,6 +187,7 @@ void saveRenderToFile(std::vector const& data, int width, int height, c CFRelease(destination); CFRelease(pngData); + #endif CGImageRelease(cgImg); CGColorSpaceRelease(colorSpace); CGDataProviderRelease(provider); diff --git a/src/platform/Win32.cpp b/src/platform/Win32.cpp index ca42e1e..23aafe2 100644 --- a/src/platform/Win32.cpp +++ b/src/platform/Win32.cpp @@ -59,9 +59,9 @@ class $modify(CCEGLView) { #include "utils.hpp" -void saveRenderToFile(std::vector const& data, float width, float height, char const* filename) { +void saveRenderToFile(std::vector const& data, int width, int height, char const* filename) { auto img = new CCImage; - img->initWithImageData((void*)data.data(), data.size(), kCCImageFormatRGBA8888, width, height, 8); + img->initWithImageData((void*)data.data(), data.size(), CCImage::kFmtRawData, width, height, 8); img->saveToFile(filename); } diff --git a/src/platform/utils.cpp b/src/platform/utils.cpp index c2af6e7..082404c 100644 --- a/src/platform/utils.cpp +++ b/src/platform/utils.cpp @@ -1,6 +1,10 @@ #include "utils.hpp" +#if defined(GEODE_IS_MACOS) #include +#elif defined(GEODE_IS_IOS) +#include +#endif #include #include