]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Witness the wonder of UIStringDrawingSuperCrufty.
[winterboard.git] / Library.mm
index 48cfefc53dff26a3140f51d05763df6549492723..b3eb56c42ea30c2e0d1092bc90daa4dce8ff45cd 100644 (file)
@@ -604,7 +604,7 @@ MSHook(UIImage *, SBApplicationIcon$generateIconImage$, SBApplicationIcon *self,
                     return [UIImage imageWithContentsOfFile:path72];
             if (NSString *path = $pathForIcon$([self application]))
                 if (UIImage *image = [UIImage imageWithContentsOfFile:path]) {
-                    float width;
+                    CGFloat width;
                     if ([$SBIcon respondsToSelector:@selector(defaultIconImageSize)])
                         width = [$SBIcon defaultIconImageSize].width;
                     else
@@ -689,13 +689,13 @@ MSInstanceMessageHook2(NSString *, NSBundle, pathForResource,ofType, NSString *,
 
 static void $drawLabel$(NSString *label, CGRect rect, NSString *style, NSString *custom) {
     bool ellipsis(false);
-    float max = rect.size.width - 11, width;
+    CGFloat max = rect.size.width - 11, width;
   width:
     width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width;
 
     if (width > max) {
         size_t length([label length]);
-        float spacing((width - max) / (length - 1));
+        CGFloat spacing((width - max) / (length - 1));
 
         if (spacing > 1.25) {
             ellipsis = true;
@@ -769,21 +769,23 @@ static NSString *WBColorMarkup() {
     return [NSString stringWithFormat:@"color: rgba(%g, %g, %g, %g)", r * 255, g * 255, b * 255, a];
 }
 
-MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing,includeEmoji, CGPoint, point, float, width, UIFont *, font, UILineBreakMode, mode, float, spacing, BOOL, emoji) {
-    //NSLog(@"XXX: @\"%@\" %g", self, spacing);
+extern "C" NSString *NSStringFromCGPoint(CGPoint rect);
+
+MSInstanceMessageHook5(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode,letterSpacing, CGPoint, point, CGFloat, width, UIFont *, font, UILineBreakMode, mode, CGFloat, spacing) {
+    //NSLog(@"XXX: @\"%@\" %@ %g \"%@\" %u %g", self, NSStringFromCGPoint(point), width, font, mode, spacing);
 
     WBStringDrawingState *state(stringDrawingState_);
     if (state == NULL)
-        return MSOldCall(point, width, font, mode, spacing, emoji);
+        return MSOldCall(point, width, font, mode, spacing);
 
     if (state->count_ != 0 && --state->count_ == 0)
         stringDrawingState_ = state->next_;
     if (state->info_ == nil)
-        return MSOldCall(point, width, font, mode, spacing, emoji);
+        return MSOldCall(point, width, font, mode, spacing);
 
     NSString *info([Info_ objectForKey:state->info_]);
     if (info == nil)
-        return MSOldCall(point, width, font, mode, spacing, emoji);
+        return MSOldCall(point, width, font, mode, spacing);
 
     NSString *base(state->base_ ?: @"");
     NSString *extra([NSString stringWithFormat:@"letter-spacing: %gpx", spacing]);
@@ -794,7 +796,7 @@ MSInstanceMessageHook6(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreak
 extern "C" NSString *NSStringFromCGRect(CGRect rect);
 
 MSInstanceMessageHook7(CGSize, NSString, _drawInRect,withFont,lineBreakMode,alignment,lineSpacing,includeEmoji,truncationRect, CGRect, rect, UIFont *, font, UILineBreakMode, mode, UITextAlignment, alignment, float, spacing, BOOL, emoji, CGRect, truncation) {
-    //NSLog(@"XXX: &\"%@\" %@ \"%@\" %u %u %g %u %@", self, NSStringFromCGRect(rect), font, mode, alignment, spacing, emoji, NSStringFromCGRect(truncation));
+    //NSLog(@"XXX: @\"%@\" %@ \"%@\" %u %u %g %u %@", self, NSStringFromCGRect(rect), font, mode, alignment, spacing, emoji, NSStringFromCGRect(truncation));
 
     WBStringDrawingState *state(stringDrawingState_);
     if (state == NULL)
@@ -976,7 +978,7 @@ MSHook(void, SBCalendarIconContentsView$drawRect$, SBCalendarIconContentsView *s
     if (NSString *style = [Info_ objectForKey:@"CalendarIconDayStyle"])
         daystyle = [daystyle stringByAppendingString:style];
 
-    float width([self bounds].size.width);
+    CGFloat width([self bounds].size.width);
     float leeway(10);
     CGSize datesize = [(NSString *)date sizeWithStyle:datestyle forWidth:(width + leeway)];
     CGSize daysize = [(NSString *)day sizeWithStyle:daystyle forWidth:(width + leeway)];
@@ -2053,15 +2055,6 @@ static void msset(Type_ &function, MSImageRef image, const char *name) {
 #define WBHookSymbol(image, function) \
     msset(function, image, "_" #function)
 
-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);
-}
-
 template <typename Type_>
 static void dlset(Type_ &function, const char *name) {
     function = reinterpret_cast<Type_>(dlsym(RTLD_DEFAULT, name));
@@ -2114,7 +2107,7 @@ static void NSString$drawInRect$withStyle$(NSString *self, SEL _cmd, CGRect rect
     return [[WBMarkup sharedMarkup] drawString:self inRect:rect withStyle:style];
 }
 
-static CGSize NSString$sizeWithStyle$forWidth$(NSString *self, SEL _cmd, NSString *style, float width) {
+static CGSize NSString$sizeWithStyle$forWidth$(NSString *self, SEL _cmd, NSString *style, CGFloat width) {
     if (style == nil || [style length] == 0)
         style = @"font-family: Helvetica; font-size: 12px";
     CGSize size([[WBMarkup sharedMarkup] sizeOfString:self withStyle:style forWidth:width]);
@@ -2161,9 +2154,11 @@ static void SBInitialize() {
     WBRename(SBIconModel, getCachedImagedForIcon:, getCachedImagedForIcon$);
     WBRename(SBIconModel, getCachedImagedForIcon:smallIcon:, getCachedImagedForIcon$smallIcon$);
 
-    WBRename(SBSearchView, initWithFrame:, initWithFrame$);
-    WBRename(SBSearchTableViewCell, drawRect:, drawRect$);
-    WBRename(SBSearchTableViewCell, initWithStyle:reuseIdentifier:, initWithStyle$reuseIdentifier$);
+    if (kCFCoreFoundationVersionNumber < 800) {
+        WBRename(SBSearchView, initWithFrame:, initWithFrame$);
+        WBRename(SBSearchTableViewCell, drawRect:, drawRect$);
+        WBRename(SBSearchTableViewCell, initWithStyle:reuseIdentifier:, initWithStyle$reuseIdentifier$);
+    }
 
     //WBRename(SBImageCache, initWithName:forImageWidth:imageHeight:initialCapacity:, initWithName$forImageWidth$imageHeight$initialCapacity$);
 
@@ -2353,9 +2348,15 @@ MSInitialize {
     // }}}
     // UIKit {{{
     if (MSImageRef image = MSGetImageByName("/System/Library/Frameworks/UIKit.framework/UIKit")) {
+#ifdef __LP64__
+        class_addMethod($NSString, @selector(drawAtPoint:withStyle:), (IMP) &NSString$drawAtPoint$withStyle$, "v40@0:8{CGPoint=dd}16@32");
+        class_addMethod($NSString, @selector(drawInRect:withStyle:), (IMP) &NSString$drawInRect$withStyle$, "v56@0:8{CGRect={CGSize=dd}{CGSize=dd}}16@48");
+        class_addMethod($NSString, @selector(sizeWithStyle:forWidth:), (IMP) &NSString$sizeWithStyle$forWidth$, "{CGSize=dd}32@0:8@16d24");
+#else
         class_addMethod($NSString, @selector(drawAtPoint:withStyle:), (IMP) &NSString$drawAtPoint$withStyle$, "v20@0:4{CGPoint=ff}8@16");
         class_addMethod($NSString, @selector(drawInRect:withStyle:), (IMP) &NSString$drawInRect$withStyle$, "v28@0:4{CGRect={CGSize=ff}{CGSize=ff}}8@24");
         class_addMethod($NSString, @selector(sizeWithStyle:forWidth:), (IMP) &NSString$sizeWithStyle$forWidth$, "{CGSize=ff}16@0:4@8f12");
+#endif
 
         WBHookSymbol(image, _UIKitBundle);
         WBHookSymbol(image, _UIPackedImageTableGetIdentifierForName);