]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Support @2x.png if @2x~iphone.png.
[winterboard.git] / Library.mm
index 944cd835167d9ba93f466b4404665648b430fe27..505851f65f6f4233d693535facd045488b6d6014 100644 (file)
@@ -123,6 +123,7 @@ MSClassHook(UIToolbar)
 
 MSClassHook(CKMessageCell)
 MSClassHook(CKTimestampView)
+MSClassHook(CKTranscriptCell)
 MSClassHook(CKTranscriptController)
 MSClassHook(CKTranscriptTableView)
 
@@ -131,10 +132,12 @@ MSClassHook(SBApplicationIcon)
 MSClassHook(SBAwayView)
 MSClassHook(SBBookmarkIcon)
 MSClassHook(SBButtonBar)
+MSClassHook(SBCalendarApplicationIcon)
 MSClassHook(SBCalendarIconContentsView)
 MSClassHook(SBDockIconListView)
 MSClassHook(SBIcon)
 MSClassHook(SBIconBadge)
+MSClassHook(SBIconBadgeFactory)
 MSClassHook(SBIconController)
 MSClassHook(SBIconLabel)
 MSClassHook(SBIconList)
@@ -149,6 +152,8 @@ MSClassHook(SBStatusBarTimeView)
 MSClassHook(SBUIController)
 MSClassHook(SBWidgetApplicationIcon)
 
+extern "C" void WKSetCurrentGraphicsContext(CGContextRef);
+
 __attribute__((__constructor__))
 static void MSFixClass() {
     if ($SBIcon == nil)
@@ -188,6 +193,7 @@ static BOOL (*_GSFontGetUseLegacyFontMetrics)();
     (_GSFontGetUseLegacyFontMetrics == NULL ? YES : _GSFontGetUseLegacyFontMetrics())
 
 static bool Debug_ = false;
+static bool UIDebug_ = false;
 static bool Engineer_ = false;
 static bool SummerBoard_ = true;
 static bool SpringBoard_;
@@ -231,9 +237,6 @@ static unsigned $getScale$(NSString *path) {
 }
 
 static NSArray *$useScale$(NSArray *files, bool use = true) {
-    if (!use)
-        return files;
-
     if (Scale_ == 0) {
         UIScreen *screen([UIScreen mainScreen]);
         if ([screen respondsToSelector:@selector(scale)])
@@ -248,14 +251,17 @@ static NSArray *$useScale$(NSArray *files, bool use = true) {
     NSMutableArray *scaled([NSMutableArray arrayWithCapacity:([files count] * 2)]);
 
     for (NSString *file in files) {
-        [scaled addObject:[NSString stringWithFormat:@"%@@2x.%@", [file stringByDeletingPathExtension], [file pathExtension]]];
+        if (use && Scale_ == 2)
+            [scaled addObject:[NSString stringWithFormat:@"%@@2x.%@", [file stringByDeletingPathExtension], [file pathExtension]]];
+        if ([file hasSuffix:@"@2x~iphone.png"])
+            [scaled addObject:[[file substringWithRange:NSMakeRange(0, [file length] - 11)] stringByAppendingPathExtension:@"png"]];
         [scaled addObject:file];
     }
 
     return scaled;
 }
 
-static NSString *$getTheme$(NSArray *files) {
+static NSString *$getTheme$(NSArray *files, NSArray *themes = Themes_) {
     if (NSString *path = [Themed_ objectForKey:files])
         return reinterpret_cast<id>(path) == [NSNull null] ? nil : path;
 
@@ -624,6 +630,74 @@ MSInstanceMessageHook2(NSString *, NSBundle, pathForResource,ofType, NSString *,
 }
 // }}}
 
+static struct WBStringDrawingState {
+    WBStringDrawingState *next_;
+    NSString *base_;
+    NSString *info_;
+} *stringDrawingState_;
+
+MSInstanceMessageHook4(CGSize, NSString, drawAtPoint,forWidth,withFont,lineBreakMode, CGPoint, point, float, width, UIFont *, font, int, mode) {
+    if (stringDrawingState_ == NULL || stringDrawingState_->info_ == nil)
+        return MSOldCall(point, width, font, mode);
+
+    NSString *info([Info_ objectForKey:stringDrawingState_->info_]);
+    if (info == nil)
+        return MSOldCall(point, width, font, mode);
+
+    NSString *base(stringDrawingState_->base_ ?: @"");
+    stringDrawingState_ = stringDrawingState_->next_;
+
+    [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]];
+    return CGSizeZero;
+}
+
+MSInstanceMessageHook2(CGSize, NSString, drawAtPoint,withFont, CGPoint, point, UIFont *, font) {
+    if (stringDrawingState_ == NULL || stringDrawingState_->info_ == nil)
+        return MSOldCall(point, font);
+
+    NSString *info([Info_ objectForKey:stringDrawingState_->info_]);
+    if (info == nil)
+        return MSOldCall(point, font);
+
+    NSString *base(stringDrawingState_->base_ ?: @"");
+    stringDrawingState_ = stringDrawingState_->next_;
+
+    [self drawAtPoint:point withStyle:[NSString stringWithFormat:@"%@;%@;%@", [font markupDescription], base, info]];
+    return CGSizeZero;
+}
+
+MSInstanceMessageHook1(UIImage *, SBIconBadgeFactory, checkoutBadgeImageForText, NSString *, text) {
+    WBStringDrawingState badgeState = {NULL, @""
+        "color: white;"
+    , @"BadgeStyle"};
+
+    stringDrawingState_ = &badgeState;
+
+    UIImage *image(MSOldCall(text));
+
+    stringDrawingState_ = NULL;
+    return image;
+}
+
+MSInstanceMessageHook1(UIImage *, SBCalendarApplicationIcon, generateIconImage, int, type) {
+    WBStringDrawingState dayState = {NULL, @""
+        "color: white;"
+        // XXX: this is only correct on an iPod dock
+        "text-shadow: rgba(0, 0, 0, 0.2) -1px -1px 2px;"
+    , @"CalendarIconDayStyle"};
+
+    WBStringDrawingState dateState = {&dayState, @""
+        "color: #333333;"
+    , @"CalendarIconDateStyle"};
+
+    stringDrawingState_ = &dateState;
+
+    UIImage *image(MSOldCall(type));
+
+    stringDrawingState_ = NULL;
+    return image;
+}
+
 MSHook(void, SBCalendarIconContentsView$drawRect$, SBCalendarIconContentsView *self, SEL sel, CGRect rect) {
     NSBundle *bundle([NSBundle mainBundle]);
 
@@ -770,6 +844,8 @@ MSInstanceMessageHook0(id, SBUIController, init) {
         return nil;
 
     NSString *paper($getTheme$(Wallpapers_));
+    if (paper != nil)
+        paper = [paper stringByDeletingLastPathComponent];
 
     {
         size_t size;
@@ -851,8 +927,10 @@ MSInstanceMessageHook0(id, SBUIController, init) {
     _release(WallpaperPage_);
     _release(WallpaperURL_);
 
-    if (NSString *path = paper) {
-        if ([path hasSuffix:@".mp4"]) {
+    if (paper != nil) {
+        NSArray *themes([NSArray arrayWithObject:paper]);
+
+        if (NSString *path = $getTheme$([NSArray arrayWithObject:@"Wallpaper.mp4"], themes)) {
 #if UseAVController
             NSError *error;
 
@@ -887,7 +965,7 @@ MSInstanceMessageHook0(id, SBUIController, init) {
             [indirect addSubview:video];
         }
 
-        if ([path hasSuffix:@".png"] || [path hasSuffix:@".jpg"]) {
+        if (NSString *path = $getTheme$($useScale$([NSArray arrayWithObjects:@"Wallpaper.png", @"Wallpaper.jpg", nil]), themes)) {
             if (UIImage *image = $getImage$(path)) {
                 WallpaperFile_ = [path retain];
                 WallpaperImage_ = [[UIImageView alloc] initWithImage:image];
@@ -897,7 +975,7 @@ MSInstanceMessageHook0(id, SBUIController, init) {
             }
         }
 
-        if ([path hasSuffix:@".html"]) {
+        if (NSString *path = $getTheme$([NSArray arrayWithObject:@"Wallpaper.html"], themes)) {
             CGRect bounds = [indirect bounds];
 
             UIWebDocumentView *view([[[UIWebDocumentView alloc] initWithFrame:bounds] autorelease]);
@@ -1340,7 +1418,7 @@ MSInstanceMessageHook1(void, SBIconLabel, drawRect, CGRect, rect) {
         style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px -1px 0px; "];
 
     bool ellipsis(false);
-    float max = 75, width;
+    float max = [self frame].size.width - 11, width;
   width:
     width = [(ellipsis ? [label stringByAppendingString:@"..."] : label) sizeWithStyle:style forWidth:320].width;
 
@@ -1373,8 +1451,20 @@ MSInstanceMessageHook1(void, CKMessageCell, addBalloonView, CKBalloonView *, bal
     [balloon setBackgroundColor:[UIColor clearColor]];
 }
 
+MSInstanceMessageHook1(void, CKTranscriptCell, setBackgroundColor, UIColor *, color) {
+    MSOldCall([UIColor clearColor]);
+}
+
+MSInstanceMessageHook2(id, CKTranscriptCell, initWithStyle,reuseIdentifier, int, style, NSString *, reuse) {
+    if ((self = MSOldCall(style, reuse)) != nil) {
+        [self setBackgroundColor:[UIColor clearColor]];
+        [[self contentView] setBackgroundColor:[UIColor clearColor]];
+    } return self;
+}
+
 MSInstanceMessageHook2(id, CKMessageCell, initWithStyle,reuseIdentifier, int, style, NSString *, reuse) {
     if ((self = MSOldCall(style, reuse)) != nil) {
+        [self setBackgroundColor:[UIColor clearColor]];
         [[self contentView] setBackgroundColor:[UIColor clearColor]];
     } return self;
 }
@@ -1399,10 +1489,8 @@ MSInstanceMessageHook2(id, CKTranscriptTableView, initWithFrame,style, CGRect, f
 MSInstanceMessageHook0(void, CKTranscriptController, loadView) {
     MSOldCall();
 
-    if (NSString *path = $getTheme$([NSArray arrayWithObjects:@"SMSBackground.png", @"SMSBackground.jpg", nil]))
-        if (UIImage *image = [[UIImage alloc] initWithContentsOfFile:path]) {
-            [image autorelease];
-
+    if (NSString *path = $getTheme$($useScale$([NSArray arrayWithObjects:@"SMSBackground.png", @"SMSBackground.jpg", nil])))
+        if (UIImage *image = $getImage$(path)) {
             UIView *&_transcriptTable(MSHookIvar<UIView *>(self, "_transcriptTable"));
             UIView *&_transcriptLayer(MSHookIvar<UIView *>(self, "_transcriptLayer"));
             UIView *table;
@@ -1459,7 +1547,18 @@ MSHook(UIImage *, _UIImageWithName, NSString *name) {
         if (NSString *path = $pathForFile$inBundle$(name, _UIKitBundle(), true))
             image = $getImage$(path);
         [UIImages_ setObject:(image == nil ? [NSNull null] : reinterpret_cast<id>(image)) forKey:key];
-        return image == nil ? __UIImageWithName(name) : image;
+        if (image != nil)
+            return image;
+
+        image = __UIImageWithName(name);
+
+        if (UIDebug_) {
+            NSString *path([@"/tmp/UIImages/" stringByAppendingString:name]);
+            if (![Manager_ fileExistsAtPath:path])
+                [UIImagePNGRepresentation(image) writeToFile:path atomically:YES];
+        }
+
+        return image;
     }
 }
 // }}}
@@ -1575,8 +1674,6 @@ MSHook(void *, CGImageReadCreateWithFile, NSString *path, int flag) {
 }
 // }}}
 
-extern "C" void WKSetCurrentGraphicsContext(CGContextRef);
-
 static void NSString$drawAtPoint$withStyle$(NSString *self, SEL _cmd, CGPoint point, NSString *style) {
     WKSetCurrentGraphicsContext(UIGraphicsGetCurrentContext());
     if (style == nil || [style length] == 0)
@@ -1770,5 +1867,8 @@ MSInitialize {
     }
     // }}}
 
+    if (Debug_ && [Manager_ fileExistsAtPath:@"/tmp/UIImages"])
+        UIDebug_ = true;
+
     [pool release];
 }