]> git.saurik.com Git - winterboard.git/blobdiff - UIImages.mm
Put some paper down to clean up the mess.
[winterboard.git] / UIImages.mm
index 0e2272cdedc0939a8b1a2e33c7323818ed1531d3..f83b7720d2f17c1cfe7bd3ce2a2a284f625dd699 100644 (file)
@@ -1,21 +1,43 @@
 #import <Foundation/Foundation.h>
 #import <CoreGraphics/CoreGraphics.h>
-#import <UIKit/UIKit.h>
+
+#import <UIKit/UIKeyboard.h>
+#import <UIKit/UIImage.h>
 
 extern "C" {
     #include <mach-o/nlist.h>
 }
 
+extern "C" NSData *UIImagePNGRepresentation(UIImage *image);
+
+template <typename Type_>
+static void nlset(Type_ &function, struct nlist *nl, size_t index) {
+    struct nlist &name(nl[index]);
+    uintptr_t value(name.n_value);
+    if ((name.n_desc & N_ARM_THUMB_DEF) != 0)
+        value |= 0x00000001;
+    function = reinterpret_cast<Type_>(value);
+}
+
 int main(int argc, char *argv[]) {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
 
-    struct nlist nl[3];
+    struct nlist nl[4];
+
     memset(nl, 0, sizeof(nl));
     nl[0].n_un.n_name = (char *) "___mappedImages";
     nl[1].n_un.n_name = (char *) "__UISharedImageInitialize";
+    nl[2].n_un.n_name = (char *) "_LoadMappedImageRef";
     nlist("/System/Library/Frameworks/UIKit.framework/UIKit", nl);
-    NSMutableDictionary **images = (id *) nl[0].n_value;
-    void (*__UISharedImageInitialize)(bool) = (void (*)(bool)) nl[1].n_value;
+
+    NSMutableDictionary **images;
+    nlset(images, nl, 0);
+
+    void (*__UISharedImageInitialize)(bool);
+    nlset(__UISharedImageInitialize, nl, 1);
+
+    CGImageRef (*_LoadMappedImageRef)(CFStringRef);
+    nlset(_LoadMappedImageRef, nl, 2);
 
     __UISharedImageInitialize(false);
 
@@ -23,7 +45,11 @@ int main(int argc, char *argv[]) {
     for (int i(0), e([keys count]); i != e; ++i) {
         NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
         NSString *key = [keys objectAtIndex:i];
-        CGImageRef ref = (CGImageRef) [*images objectForKey:key];
+        CGImageRef ref;
+        if (_LoadMappedImageRef == NULL)
+            ref = reinterpret_cast<CGImageRef>([*images objectForKey:key]);
+        else
+            ref = _LoadMappedImageRef(reinterpret_cast<CFStringRef>(key));
         UIImage *image = [UIImage imageWithCGImage:ref];
         NSData *data = UIImagePNGRepresentation(image);
         [data writeToFile:[NSString stringWithFormat:@"%@", key] atomically:YES];