我有一个很棒的编程字体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中禁用字体平滑?
答案 0 :(得分:5)
这是我的Xcode 9的截图,Deccy在13pt:
我相信以上就是你想要的。这是股票Xcode显示相同的文件:
我深入探究了一种无创的方式来实现这一目标,并且失败了。据我所知,Xcode 9中的文本渲染路径非常刻意地打开字体平滑。
在继续之前,请向Apple提交功能请求。它只需要几分钟,这是你最好的答案,可以在具有良好安全本能和紧张的心血管系统的人面前讨论:
我写了一个Xcode插件。您可能听说Xcode 9使用代码签名限制来禁止加载插件。这是事实,但是一些小牛队继续按下,今晚我们一起骑车。
有一个工具update_xcode_plugins。您可以使用它从您的Xcode副本中剥离代码签名,并使用它来捆绑加载限制:
$ gem install update_xcode_plugins
$ update_xcode_plugins --unsign
如果你改变主意,你可以这样做以恢复(签名副本,我认为?)签名的Xcode:
$ update_xcode_plugins --restore
还有另一种工具Alcatraz。它是Xcode的插件管理器。我选择安装它是因为它提供了一个插件,为插件提供项目模板。我跟着these instructions安装了恶魔岛,其归结为:
$ git clone https://github.com/alcatraz/Alcatraz.git
$ cd Alcatraz
$ xcodebuild
我启动了Xcode,点击对话框警告我有关新插件的信息,然后使用新添加的Window>包管理器安装“Xcode插件”模板。
我用这个模板制作了一个项目。
在我写这篇文章时,“Xcode插件”模板尚未更新以支持Xcode 9.不用担心。我运行此命令来获取Xcode 9的兼容性UUID:
$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
我访问了我的新项目的Info.plist,并将UUID添加到DVTPlugInCompatibilityUUIDs
数组中。
然后,我将SourceEditor.framework
链接到我的项目中。这是一个两步的过程:
访问目标的构建设置。将其添加到框架搜索路径:
/Applications/Xcode.app/Contents/SharedFrameworks/
访问目标的构建阶段。添加一个新的“Link Binary With Libraries”阶段。点击加号。导航到上面的目录(您只需按 / 键然后粘贴路径)并选择SourceEditor.framework
。它应该出现在列表中。该项目仍应建立。
然后,我使我的插件的.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
并关闭它的文本抗锯齿。然后,它覆盖SourceEditor框架内的函数的开头,该框架通常配置抗锯齿设置 - 不再需要它 - 而是跳转到我们的函数。它以极其不安全的方式完成所有这些工作,因此如果出现问题,Xcode可能会礼貌地崩溃。
构建并运行项目,自动安装插件。接受添加你的插件,就是这样。
如果这里的任何内容无效,因为我搞砸了,请告诉我。我不计划自己将其转换为Alcatraz插件,但是您或其他任何人都应该自由地使用信用卡(在向Apple提交功能请求后)。
快乐的黑客攻击!
答案 1 :(得分:3)
如果你在XCode中“生活”并且需要清晰呈现此TrueType字体,那么使用PrefEdit.app或defaults write com.apple.dt.Xcode.*
编辑XCode应用程序默认值无效。
在盒子外面思考,您可能会对以下内容感兴趣,以便在Mac上实现清脆。
由于Deccy字体最好在12pt查看,因此将全局域中的 AppleAntiAliasingThreshold 提升到13是有意义的,此设置的默认值为4.
您也可以建议不要 AppleFontSmoothing 。
defaults write -g AppleFontSmoothing -int 0
defaults write -g AppleAntiAliasingThreshold -int 13
除了这些调整之外,还可以在“系统偏好设置”中的辅助功能首选项窗格中实现更多功能:显示屏中有2个选中标记,您应该尝试:“区分无颜色'和'提高对比度'。
“美丽在旁观者的眼中”,我希望这会有所帮助。
答案 2 :(得分:0)
以下是可能适合您的替代步骤。
注意:为了更安全,请保留原始文件的备份。