如何禁用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系统的人面前讨论这个问题。

https://bugreport.apple.com/

我写了一个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链接到我的项目中。 这是一个两步过程:

  1. 访问目标的生成设置。 将其添加到框架searchpath:

     /Applications/Xcode.app/Contents/SharedFrameworks/ 
  2. 访问目标的构build阶段。 添加一个新的“链接二进制库”阶段。 打好了。 导航到上面的目录(您可以按/键,然后粘贴path),然后selectSourceEditor.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个勾选标记:“ 不区分颜色 ”和“ 增加对比度 ”。

对比渲染

“美是在旁观者的眼睛”我希望这有助于。

以下是可能适用于您的替代步骤。

  1. 尝试在Macintosh HD / Library / Preferences下findcom.apple.dt.Xcode.plist文件。
  2. 将该文件复制到桌面
  3. 打开文件并添加NSFontDefaultScreenFontSubstitutionEnabled(布尔)是
  4. 添加AppleAntiAliasingThreshold(数字)24
  5. 将该文件replace为首选项文件
  6. 重新启动系统和Xcode

注意:为了更安全的一面保留原始文件的备份。