如何禁用Xcode 9中的字体平滑?
我有一个伟大的编程字体Deccy ,只有在Xcode中禁用字体平滑(反锯齿)才能看起来不错。 使用Xcode 8,下面的方法可以做到这一点:
defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES defaults write com.apple.dt.Xcode AppleAntiAliasingThreshold 24
但是这不再适用于Xcode 9。
是否有可能在Xcode 9中禁用字体平滑?
恶作剧pipe理?
这里是我的Xcode 9的截图,Decti在13pt:
我相信上面是你想要的。 这里是股票Xcode显示相同的文件:
但是,如何?
我深深探索了一个无法实现的方法,并且失败了。 据我所知,Xcode 9中的文本渲染path非常有意地打开了字体平滑。
在继续之前,请向苹果提交function请求。 这只需要几分钟的时间,这是你最好的希望,可以在那些有良好的安全本能和紧张的心血pipe系统的人面前讨论这个问题。
我写了一个Xcode插件。 您可能已经听说Xcode 9使用代码签名限制来禁止加载插件。 这是真的,但是有几个小牛逼,今晚我们和他们一起骑。
步骤1
有一个工具, update_xcode_plugins 。 您可以使用它从您的Xcode副本中剥离代码签名,并且使用它捆绑加载限制:
$ gem install update_xcode_plugins $ update_xcode_plugins --unsign
如果你改变了主意,你可以这样做,以恢复到签名Xcode的(备份副本,我认为?):
$ update_xcode_plugins --restore
第二步
还有另一个工具, 恶魔岛 。 这是Xcode的插件pipe理器。 我select安装它,因为它提供了一个为插件提供项目模板的插件。 我遵循这些指示安装恶魔岛,这归结为:
$ git clone https://github.com/alcatraz/Alcatraz.git $ cd Alcatraz $ xcodebuild
我启动了Xcode,单击对话框,提示我有关新插件的信息,然后使用新添加的Window> Package Manager来安装“Xcode插件”模板。
第三步
我用这个模板做了一个项目。
当我写这个,“Xcode插件”模板尚未更新,以支持Xcode 9.没有问题。 我运行这个命令来抓取Xcode 9的兼容性UUID:
$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
我访问了我的新项目的Info.plist,并将该UUID添加到DVTPlugInCompatibilityUUIDs
数组中。
然后,我将SourceEditor.framework
链接到我的项目中。 这是一个两步过程:
-
访问目标的生成设置。 将其添加到框架searchpath:
/Applications/Xcode.app/Contents/SharedFrameworks/
-
访问目标的构build阶段。 添加一个新的“链接二进制库”阶段。 打好了。 导航到上面的目录(您可以按/键,然后粘贴path),然后select
SourceEditor.framework
。 它应该出现在列表中。 该项目应该仍然build设。
然后,我使我的插件的.mm
文件看起来像这样(我删除了.h
文件,这是不需要这个PoC):
#import <AppKit/AppKit.h> #include <dlfcn.h> extern void CGContextSetAllowsFontAntialiasing(CGContextRef, BOOL); static void hooked_sourceEditorSetFontSmoothingStyle(CGContextRef ctx) { CGContextSetAllowsFontAntialiasing(ctx, NO); } @interface NoAA : NSObject @end @implementation NoAA + (void)pluginDidLoad:(NSBundle *)plugin { NSArray *allowedLoaders = [plugin objectForInfoDictionaryKey:@"me.delisa.XcodePluginBase.AllowedLoaders"]; if (![allowedLoaders containsObject:[[NSBundle mainBundle] bundleIdentifier]]) return; Class cls = NSClassFromString(@"SourceEditorScrollView"); NSBundle* bundle = [NSBundle bundleForClass:cls]; void *handle = dlopen(bundle.executablePath.fileSystemRepresentation, RTLD_NOW); if (!handle) return; uint8_t* set_font_smoothing_fn = dlsym(handle, "sourceEditorSetFontSmoothingStyle"); if (!set_font_smoothing_fn) goto fin; void* set_font_smoothing_fn_page = (void*)((long)set_font_smoothing_fn & -PAGE_SIZE); if (mprotect(set_font_smoothing_fn_page, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC)) goto fin; set_font_smoothing_fn[0] = 0xe9; // jmp uint32_t* jmp_arg = (uint32_t*)(set_font_smoothing_fn + 1); *jmp_arg = (uint32_t)((long)hooked_sourceEditorSetFontSmoothingStyle - (long)(jmp_arg + 1)); mprotect(set_font_smoothing_fn_page, PAGE_SIZE, PROT_READ | PROT_EXEC); fin: dlclose(handle); } @end
…我想goto
增加字符。 基本上,它只是定义一个函数,它需要一个CGContextRef
并closures文本抗锯齿。 然后,它会覆盖SourceEditor框架内通常configuration反锯齿设置的一个函数的开始 – 不再需要这个 – 来跳转到我们的函数。 它以一种令人难以置信的不安全的方式处理所有这些,所以如果出现问题,Xcode可能会礼貌地崩溃。
构build并运行该项目,该项目将自动安装插件。 接受添加你的插件,就是这样。
现在怎么办?
如果这里有什么不行,因为我搞砸了,让我知道。 我并不打算把这个插入到恶意插件中,但是你或者其他任何人都可以自由地使用恶意软件(在向苹果提交function请求之后)这样做。
快乐的黑客!
如果您在XCode中“生活”,并且需要对此TrueType字体进行清晰的渲染,那么使用PrefEdit.app编辑XCode应用程序默认值,或者使用defaults write com.apple.dt.Xcode.*
将不起作用。
在盒子外面思考,您可能会对以下内容感兴趣,以便在您的Mac上实现松脆。
由于Deccy字体最好在12点查看,因此将全局域中的AppleAntiAliasingThreshold提高到13,这个设置的默认值是4。
你也可以build议不要AppleFontSmoothing 。
defaults write -g AppleFontSmoothing -int 0 defaults write -g AppleAntiAliasingThreshold -int 13
除了这些调整之外,还可以在“系统偏好设置”中的“ 辅助function首选项”窗格中实现更多function :显示屏应具有2个勾选标记:“ 不区分颜色 ”和“ 增加对比度 ”。
“美是在旁观者的眼睛” , 我希望这有助于。
以下是可能适用于您的替代步骤。
- 尝试在Macintosh HD / Library / Preferences下findcom.apple.dt.Xcode.plist文件。
- 将该文件复制到桌面
- 打开文件并添加NSFontDefaultScreenFontSubstitutionEnabled(布尔)是
- 添加AppleAntiAliasingThreshold(数字)24
- 将该文件replace为首选项文件
- 重新启动系统和Xcode
注意:为了更安全的一面保留原始文件的备份。