]> git.saurik.com Git - winterboard.git/blobdiff - Library.mm
Released font hooking and stuff.
[winterboard.git] / Library.mm
index 1cab91eed3b12aeabfe7fc90a85d63c04b425af8..dccc2194f31db39ffc75287cf75d5da7af7663fa 100644 (file)
 #import <Foundation/Foundation.h>
 #import <CoreGraphics/CoreGraphics.h>
 
+#import <Celestial/AVController.h>
+#import <Celestial/AVItem.h>
+#import <Celestial/AVQueue.h>
+
 #include <substrate.h>
 
 #import <UIKit/UIKit.h>
 #import <SpringBoard/SBStatusBarOperatorNameView.h>
 #import <SpringBoard/SBStatusBarTimeView.h>
 #import <SpringBoard/SBUIController.h>
+#import <SpringBoard/SBWidgetApplicationIcon.h>
 
 #import <MobileSMS/mSMSMessageTranscriptController.h>
 
+#import <MediaPlayer/MPMoviePlayerController.h>
 #import <MediaPlayer/MPVideoView.h>
 #import <MediaPlayer/MPVideoView-PlaybackControl.h>
 
@@ -75,6 +81,7 @@ extern "C" void __clear_cache (char *beg, char *end);
 - (void *) _node;
 @end
 
+Class $MPMoviePlayerController;
 Class $MPVideoView;
 Class $WebCoreFrameBridge;
 
@@ -99,6 +106,7 @@ Class $SBStatusBarContentsView;
 Class $SBStatusBarController;
 Class $SBStatusBarOperatorNameView;
 Class $SBStatusBarTimeView;
+Class $SBWidgetApplicationIcon;
 
 @interface NSDictionary (WinterBoard)
 - (UIColor *) colorForKey:(NSString *)key;
@@ -148,17 +156,29 @@ static NSMutableDictionary *Info_;
 static NSMutableArray *themes_;
 
 static NSString *$getTheme$(NSArray *files, bool parent = false) {
+    if (!parent)
+        if (NSString *path = [Themed_ objectForKey:files])
+            return reinterpret_cast<id>(path) == [NSNull null] ? nil : path;
+
     if (Debug_)
         NSLog(@"WB:Debug: %@", [files description]);
 
+    NSString *path;
+
     for (NSString *theme in themes_)
         for (NSString *file in files) {
-            NSString *path([NSString stringWithFormat:@"%@/%@", theme, file]);
-            if ([Manager_ fileExistsAtPath:path])
-                return parent ? theme : path;
+            path = [NSString stringWithFormat:@"%@/%@", theme, file];
+            if ([Manager_ fileExistsAtPath:path]) {
+                path = parent ? theme : path;
+                goto set;
+            }
         }
 
-    return nil;
+    path = nil;
+  set:
+    if (!parent)
+        [Themed_ setObject:(path == nil ? [NSNull null] : reinterpret_cast<id>(path)) forKey:files];
+    return path;
 }
 
 static NSString *$pathForFile$inBundle$(NSString *file, NSBundle *bundle, bool ui) {
@@ -320,6 +340,14 @@ MSHook(UIImage *, SBApplicationIcon$icon, SBApplicationIcon *self, SEL sel) {
     return _SBApplicationIcon$icon(self, sel);
 }
 
+MSHook(UIImage *, SBWidgetApplicationIcon$icon, SBWidgetApplicationIcon *self, SEL sel) {
+    if (Debug_)
+        NSLog(@"WB:Debug:Widget(%@:%@)", [self displayIdentifier], [self displayName]);
+    if (NSString *path = $getTheme$([NSArray arrayWithObject:[NSString stringWithFormat:@"Icons/%@.png", [self displayName]]]))
+        return [UIImage imageWithContentsOfFile:path];
+    return _SBWidgetApplicationIcon$icon(self, sel);
+}
+
 MSHook(UIImage *, SBBookmarkIcon$icon, SBBookmarkIcon *self, SEL sel) {
     if (Debug_)
         NSLog(@"WB:Debug:Bookmark(%@:%@)", [self displayIdentifier], [self displayName]);
@@ -559,12 +587,38 @@ MSHook(id, SBContentLayer$initWithSize$, SBContentLayer *self, SEL sel, CGSize s
     if (NSString *theme = $getTheme$(Wallpapers_, true)) {
         NSString *mp4 = [theme stringByAppendingPathComponent:@"Wallpaper.mp4"];
         if ([Manager_ fileExistsAtPath:mp4]) {
+#if UseAVController
+            NSError *error;
+
+            static AVController *controller_(nil);
+            if (controller_ == nil) {
+                AVQueue *queue([AVQueue avQueue]);
+                controller_ = [[AVController avControllerWithQueue:queue error:&error] retain];
+            }
+
+            AVQueue *queue([controller_ queue]);
+
+            UIView *video([[[UIView alloc] initWithFrame:[self bounds]] autorelease]);
+            [controller_ setLayer:[video _layer]];
+
+            AVItem *item([[[AVItem alloc] initWithPath:mp4 error:&error] autorelease]);
+            [queue appendItem:item error:&error];
+
+            [controller_ play:&error];
+#elif UseMPMoviePlayerController
+            NSURL *url([NSURL fileURLWithPath:mp4]);
+            MPMoviePlayerController *controller = [[MPMoviePlayerController alloc] initWithContentURL:url];
+           controller.movieControlMode = MPMovieControlModeHidden;
+           [controller play];
+#else
             MPVideoView *video = [[[$MPVideoView alloc] initWithFrame:[self bounds]] autorelease];
             [video setMovieWithPath:mp4];
             [video setRepeatMode:1];
-            [video setRepeatGap:0];
-            [self addSubview:video];
+            [video setRepeatGap:-1];
             [video playFromBeginning];;
+#endif
+
+            [self addSubview:video];
         }
 
         NSString *png = [theme stringByAppendingPathComponent:@"Wallpaper.png"];
@@ -877,9 +931,28 @@ MSHook(void, SBIconLabel$drawRect$, SBIconLabel *self, SEL sel, CGRect rect) {
 
     if (docked)
         style = [style stringByAppendingString:@"text-shadow: rgba(0, 0, 0, 0.5) 0px -1px 0px; "];
-    float max = 75, width = [label sizeWithStyle:style forWidth:320].width;
-    if (width > max)
-        style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", ((width - max) / ([label length] - 1))]];
+
+    bool ellipsis(false);
+    float max = 75, 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));
+
+        if (spacing > 1.25) {
+            ellipsis = true;
+            label = [label substringToIndex:(length - 1)];
+            goto width;
+        }
+
+        style = [style stringByAppendingString:[NSString stringWithFormat:@"letter-spacing: -%f; ", spacing]];
+    }
+
+    if (ellipsis)
+        label = [label stringByAppendingString:@"..."];
+
     if (NSString *custom = [Info_ objectForKey:(docked ? @"DockedIconLabelStyle" : @"UndockedIconLabelStyle")])
         style = [style stringByAppendingString:custom];
 
@@ -914,7 +987,7 @@ MSHook(UIImage *, _UIImageWithName, NSString *name) {
         if (image != nil)
             return reinterpret_cast<id>(image) == [NSNull null] ? nil : image;
         if (NSString *path = $pathForFile$inBundle$(name, _UIKitBundle(), true)) {
-            image = [[UIImage alloc] initWithContentsOfFile:path];
+            image = [[UIImage alloc] initWithContentsOfFile:path cache:true];
             if (image != nil)
                 [image autorelease];
         }
@@ -943,6 +1016,12 @@ MSHook(UIImage *, _UIImageWithNameInDomain, NSString *name, NSString *domain) {
     return image;
 }
 
+MSHook(GSFontRef, GSFontCreateWithName, const char *name, GSFontSymbolicTraits traits, float size) {
+    if (NSString *font = [Info_ objectForKey:[NSString stringWithFormat:@"FontName-%s", name]])
+        name = [font UTF8String];
+    return _GSFontCreateWithName(name, traits, size);
+}
+
 #define AudioToolbox "/System/Library/Frameworks/AudioToolbox.framework/AudioToolbox"
 #define UIKit "/System/Library/Frameworks/UIKit.framework/UIKit"
 
@@ -1032,6 +1111,8 @@ extern "C" void WBInitialize() {
     MSHookFunction(_UIImageWithName, &$_UIImageWithName, &__UIImageWithName);
     MSHookFunction(_UIImageWithNameInDomain, &$_UIImageWithNameInDomain, &__UIImageWithNameInDomain);
 
+    MSHookFunction(&GSFontCreateWithName, &$GSFontCreateWithName, &_GSFontCreateWithName);
+
     if (dlopen(AudioToolbox, RTLD_LAZY | RTLD_NOLOAD) != NULL) {
         struct nlist nl[2];
         memset(nl, 0, sizeof(nl));
@@ -1065,6 +1146,7 @@ extern "C" void WBInitialize() {
     PathImages_ = [[NSMutableDictionary alloc] initWithCapacity:16];
     Strings_ = [[NSMutableDictionary alloc] initWithCapacity:0];
     Bundles_ = [[NSMutableDictionary alloc] initWithCapacity:2];
+    Themed_ = [[NSMutableDictionary alloc] initWithCapacity:128];
 
     themes_ = [[NSMutableArray alloc] initWithCapacity:8];
 
@@ -1129,6 +1211,7 @@ extern "C" void WBInitialize() {
         if (MediaPlayer != nil)
             [MediaPlayer load];
 
+        $MPMoviePlayerController = objc_getClass("MPMoviePlayerController");
         $MPVideoView = objc_getClass("MPVideoView");
         $WebCoreFrameBridge = objc_getClass("WebCoreFrameBridge");
 
@@ -1147,6 +1230,7 @@ extern "C" void WBInitialize() {
         $SBStatusBarController = objc_getClass("SBStatusBarController");
         $SBStatusBarOperatorNameView = objc_getClass("SBStatusBarOperatorNameView");
         $SBStatusBarTimeView = objc_getClass("SBStatusBarTimeView");
+        $SBWidgetApplicationIcon = objc_getClass("SBWidgetApplicationIcon");
 
         WBRename(WebCoreFrameBridge, renderedSizeOfNode:constrainedToWidth:, renderedSizeOfNode$constrainedToWidth$);
 
@@ -1158,6 +1242,7 @@ extern "C" void WBInitialize() {
         WBRename(SBContentLayer, initWithSize:, initWithSize$);
         WBRename(SBIconBadge, initWithBadge:, initWithBadge$);
         WBRename(SBIconController, appendIconList:, appendIconList$);
+        WBRename(SBWidgetApplicationIcon, icon, icon);
 
         WBRename(SBIconLabel, drawRect:, drawRect$);
         WBRename(SBIconLabel, initWithSize:label:, initWithSize$label$);