Skip to content

Commit

Permalink
Merge pull request #69 from meitu/feature/support-use-frameworks
Browse files Browse the repository at this point in the history
Feature/support use frameworks
  • Loading branch information
haowenwu authored Oct 21, 2020
2 parents 00d6dce + 0eca4d8 commit 4df84c9
Show file tree
Hide file tree
Showing 8 changed files with 236 additions and 205 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,6 @@
#import <CoreText/CoreText.h>
#import <MTHawkeye/MTHUISkeletonUtility.h>

#import <FLEX/FLEXImagePreviewViewController.h>


typedef NS_ENUM(NSInteger, MTHawkeyeNetworkDetailRowStyle) {
MTHawkeyeNetworkDetailRowDefault = 0,
Expand Down Expand Up @@ -712,10 +710,10 @@ + (UIViewController *)detailViewControllerForMIMEType:(NSString *)mimeType data:
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
SEL yyImgSEL = NSSelectorFromString(@"imageWithData:");
image = [yyImageCls performSelector:yyImgSEL withObject:data];
#pragma clang diagnostic pop
}
}
detailViewController = [FLEXImagePreviewViewController forImage:image];
detailViewController = [NSClassFromString(@"FLEXImagePreviewViewController") performSelector:NSSelectorFromString(@"forImage:") withObject:image];
#pragma clang diagnostic pop
} else if ([mimeType isEqual:@"application/x-plist"]) {
id propertyList = [NSPropertyListSerialization propertyListWithData:data options:0 format:NULL error:NULL];
detailViewController = [[MTHawkeyeWebViewController alloc] initWithText:[propertyList description]];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@
#import "MTHawkeyeUserDefaults+DirectorWatcher.h"
#import "UIViewController+MTHawkeyeLayoutSupport.h"

#import <FLEX/FLEXFileBrowserController.h>
#import <FLEX/FLEXImagePreviewViewController.h>
#import <FLEX/FLEXTableListViewController.h>
#import <FLEX/FLEXUtility.h>
#import <FLEX/FLEXWebViewController.h>
#define FLEXFileBrowserController NSClassFromString(@"FLEXFileBrowserController")
#define FLEXImagePreviewViewController NSClassFromString(@"FLEXImagePreviewViewController")
#define FLEXTableListViewController NSClassFromString(@"FLEXTableListViewController")
#define FLEXUtility NSClassFromString(@"FLEXUtility")
#define FLEXWebViewController NSClassFromString(@"FLEXWebViewController")

@interface MTHDirectoryWatcherViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) UITableView *tableView;
Expand Down Expand Up @@ -194,28 +194,31 @@ - (void)presentFlexFileBrowserWithPath:(NSString *)fullPath {
NSString *subpath = [fullPath lastPathComponent];
NSString *pathExtension = [subpath pathExtension];
UIViewController *vc = nil;
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
if (isDir) {
vc = [[FLEXFileBrowserController alloc] initWithPath:fullPath];
vc = [FLEXFileBrowserController performSelector:NSSelectorFromString(@"path:") withObject:fullPath];
} else if ([@[@"jpg", @"jpeg", @"png", @"gif", @"tiff", @"tif"] containsObject:pathExtension]) {
UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
vc = [FLEXImagePreviewViewController forImage:image];
vc = [FLEXImagePreviewViewController performSelector:NSSelectorFromString(@"forImage:") withObject:image];
} else {
// Special case keyed archives, json, and plists to get more readable data.
NSString *prettyString = nil;
if ([pathExtension isEqual:@"archive"] || [pathExtension isEqual:@"coded"]) {
prettyString = [[NSKeyedUnarchiver unarchiveObjectWithFile:fullPath] description];
} else if ([pathExtension isEqualToString:@"json"]) {
prettyString = [FLEXUtility prettyJSONStringFromData:[NSData dataWithContentsOfFile:fullPath]];
NSData *data = [NSData dataWithContentsOfFile:fullPath];
prettyString = [FLEXUtility performSelector:NSSelectorFromString(@"prettyJSONStringFromData:") withObject:data];
} else if ([pathExtension isEqualToString:@"plist"]) {
NSData *fileData = [NSData dataWithContentsOfFile:fullPath];
prettyString = [[NSPropertyListSerialization propertyListWithData:fileData options:0 format:NULL error:NULL] description];
}

if ([prettyString length] > 0) {
vc = [[FLEXWebViewController alloc] initWithText:prettyString];
} else if ([FLEXWebViewController supportsPathExtension:pathExtension]) {
vc = [[FLEXWebViewController alloc] performSelector:NSSelectorFromString(@"initWithText:") withObject:prettyString];
} else if ([[FLEXWebViewController performSelector:NSSelectorFromString(@"supportsPathExtension:") withObject:pathExtension] boolValue]) {
vc = [[FLEXWebViewController alloc] initWithURL:[NSURL fileURLWithPath:fullPath]];
} else if ([FLEXTableListViewController supportsExtension:subpath.pathExtension]) {
} else if ([[FLEXTableListViewController performSelector:NSSelectorFromString(@"supportsExtension:") withObject:subpath.pathExtension] boolValue]) {
vc = [[FLEXTableListViewController alloc] initWithPath:fullPath];
} else {
NSString *fileString = [NSString stringWithContentsOfFile:fullPath encoding:NSUTF8StringEncoding error:NULL];
Expand All @@ -224,6 +227,7 @@ - (void)presentFlexFileBrowserWithPath:(NSString *)fullPath {
}
}
}
#pragma clang diagnostic pop

if (vc) {
vc.title = [subpath lastPathComponent];
Expand Down
4 changes: 4 additions & 0 deletions MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,15 @@ typedef struct {
* caculate gl-fps count when renderProcessSEL call
*/
+ (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo;
+ (void)registerGLESClass:(Class)rendererClass;

- (void)addDelegate:(id<MTHFPSTraceDelegate>)delegate;
- (void)removeDelegate:(id<MTHFPSTraceDelegate>)delegate;
- (void)start;
- (void)stop;

- (void)glesRenderer:(id)renderer start:(BOOL)start;
- (void)glesRenderProcess:(id)renderer;
@end

@protocol MTHFPSTraceDelegate <NSObject>
Expand Down
77 changes: 20 additions & 57 deletions MTHawkeye/TimeConsumingPlugins/FPSTrace/Core/MTHFPSTrace.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ @interface MTHFPSTrace ()
@property (nonatomic, assign) NSTimeInterval fpsTickLastTime;
@property (nonatomic, assign) BOOL gpuImageViewFPSEnable;
@property (nonatomic, strong) NSHashTable<id<MTHFPSTraceDelegate>> *delegates;
@property (nonatomic, strong) NSArray<NSValue *> *renderInfos;
@property (nonatomic, strong) NSMutableArray<NSValue *> *renderInfos;
@end

@implementation MTHFPSTrace
Expand All @@ -46,6 +46,15 @@ + (instancetype)shared {
}

#pragma mark -

+ (void)registerGLESClass:(Class)rendererClass {
[self registerGLESRenderInfo:(MTHFPSGLRenderInfo){
rendererClass,
NSSelectorFromString(@"createDisplayFramebuffer"),
NSSelectorFromString(@"destroyDisplayFramebuffer"),
NSSelectorFromString(@"presentFramebuffer")}];
}

+ (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo {
if (!renderInfo.rendererClass || !renderInfo.startRenderSEL || !renderInfo.endRenderSEL || !renderInfo.renderProcessSEL) {
return;
Expand All @@ -57,9 +66,9 @@ + (void)registerGLESRenderInfo:(MTHFPSGLRenderInfo)renderInfo {

NSValue *value = [NSValue value:&renderInfo withObjCType:@encode(MTHFPSGLRenderInfo)];
if (![MTHFPSTrace shared].renderInfos) {
[MTHFPSTrace shared].renderInfos = [NSArray array];
[MTHFPSTrace shared].renderInfos = [NSMutableArray array];
}
[[[MTHFPSTrace shared] mutableArrayValueForKey:@"renderInfos"] addObject:value];
[[MTHFPSTrace shared].renderInfos addObject:value];
}

- (void)addDelegate:(id<MTHFPSTraceDelegate>)delegate {
Expand All @@ -86,31 +95,18 @@ - (void)start {

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
[MTHFPSTrace registerGLESRenderInfo:(MTHFPSGLRenderInfo){
NSClassFromString(@"GPUImageView"),
NSSelectorFromString(@"createDisplayFramebuffer"),
NSSelectorFromString(@"destroyDisplayFramebuffer"),
NSSelectorFromString(@"presentFramebuffer")}];

[MTHFPSTrace registerGLESRenderInfo:(MTHFPSGLRenderInfo){
NSClassFromString(@"MTCameraGPUImageView"),
NSSelectorFromString(@"createDisplayFramebuffer"),
NSSelectorFromString(@"destroyDisplayFramebuffer"),
NSSelectorFromString(@"presentFramebuffer")}];
[MTHFPSTrace registerGLESClass:NSClassFromString(@"GPUImageView")];
[MTHFPSTrace registerGLESClass:NSClassFromString(@"MTCameraGPUImageView")];

for (NSValue *value in self.renderInfos) {
MTHFPSGLRenderInfo renderInfo;
[value getValue:&renderInfo];

if ([NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"GPUImageView"] ||
[NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"MTCameraGPUImageView"]) {
self.gpuImageViewFPSEnable = YES;
}
self.gpuImageViewFPSEnable = YES;

SEL swizzledSel = [MTHawkeyeHooking swizzledSelectorForSelector:renderInfo.startRenderSEL];
void (^swizzleStartBlock)(id) = ^void(id obj) {
((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel);
[self glesRenderer:obj start:YES];
((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel);
};
[MTHawkeyeHooking replaceImplementationOfKnownSelector:renderInfo.startRenderSEL
onClass:renderInfo.rendererClass
Expand All @@ -119,8 +115,8 @@ - (void)start {

SEL swizzledSel1 = [MTHawkeyeHooking swizzledSelectorForSelector:renderInfo.endRenderSEL];
void (^swizzleEndBlock)(id) = ^void(id obj) {
((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel1);
[self glesRenderer:obj start:NO];
((void (*)(id, SEL))objc_msgSend)(obj, swizzledSel1);
};
[MTHawkeyeHooking replaceImplementationOfKnownSelector:renderInfo.endRenderSEL
onClass:renderInfo.rendererClass
Expand Down Expand Up @@ -184,28 +180,9 @@ - (void)glesRenderer:(id)renderer start:(BOOL)start {
return;
}

NSValue *surpportedRenderer = nil;
MTHFPSGLRenderCounter *counter = nil;
for (NSValue *obj in self.renderInfos) {
MTHFPSGLRenderInfo renderInfo;
[obj getValue:&renderInfo];
if ([renderer isKindOfClass:renderInfo.rendererClass]) {
counter = [self getDynamicAttachGLESCounter:renderer];
counter.isActive = start;
surpportedRenderer = obj;
if ([NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"GPUImageView"] ||
[NSStringFromClass(renderInfo.rendererClass) isEqualToString:@"MTCameraGPUImageView"]) {
counter.isGPUImageView = YES;
} else {
counter.isGPUImageView = NO;
}
break;
}
}

if (!surpportedRenderer) {
return;
}
MTHFPSGLRenderCounter *counter = [self getDynamicAttachGLESCounter:renderer];
counter.isActive = start;
counter.isGPUImageView = YES;

for (id<MTHFPSTraceDelegate> delegate in self.delegates) {
if (delegate && [delegate respondsToSelector:@selector(glRenderCounterValueChange:)]) {
Expand All @@ -223,20 +200,6 @@ - (void)glesRenderProcess:(id)renderer {
return;
}

NSValue *surpportedRenderer = nil;
for (NSValue *obj in self.renderInfos) {
MTHFPSGLRenderInfo renderInfo;
[obj getValue:&renderInfo];
if ([renderer isKindOfClass:renderInfo.rendererClass]) {
surpportedRenderer = obj;
break;
}
}

if (!surpportedRenderer) {
return;
}

MTHFPSGLRenderCounter *counter = [self getDynamicAttachGLESCounter:renderer];
if (!counter.isActive) {
return;
Expand Down
Loading

0 comments on commit 4df84c9

Please sign in to comment.