如何在Xcode 9中禁用字体平滑?

时间:2017-08-20 11:00:52

标签: ios iphone xcode ide xcode9

我有一个很棒的编程字体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中禁用字体平滑?

3 个答案:

答案 0 :(得分:5)

Mischief管理?

这是我的Xcode 9的截图,Deccy在13pt:

The text appears crisp, with no blurred edges.

我相信以上就是你想要的。这是股票Xcode显示相同的文件:

Though the font was designed with crisp pixel boundaries, it appears here, blurred, as if seen through the haze of one too many hours programming.

但是如何?

我深入探究了一种无创的方式来实现这一目标,并且失败了。据我所知,Xcode 9中的文本渲染路径非常刻意地打开字体平滑。

  

在继续之前,请向Apple提交功能请求。它只需要几分钟,这是你最好的答案,可以在具有良好安全本能和紧张的心血管系统的人面前讨论:

     

https://bugreport.apple.com/

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

  1. 访问目标的构建设置。将其添加到框架搜索路径:

    /Applications/Xcode.app/Contents/SharedFrameworks/
    
  2. 访问目标的构建阶段。添加一个新的“Link Binary With Libraries”阶段。点击加号。导航到上面的目录(您只需按 / 键然后粘贴路径)并选择SourceEditor.framework。它应该出现在列表中。该项目仍应建立。

  3. 然后,我使我的插件的.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.appdefaults write com.apple.dt.Xcode.*编辑XCode应用程序默认值无效。

Default rendering

在盒子外面思考,您可能会对以下内容感兴趣,以便在Mac上实现清脆。

由于Deccy字体最好在12pt查看,因此将全局域中的 AppleAntiAliasingThreshold 提升到13是有意义的,此设置的默认值为4.
您也可以建议不要 AppleFontSmoothing

defaults write -g AppleFontSmoothing -int 0 defaults write -g AppleAntiAliasingThreshold -int 13

除了这些调整之外,还可以在“系统偏好设置”中的辅助功能首选项窗格中实现更多功能:显示屏中有2个选中标记,您应该尝试:“区分无颜色'和'提高对比度'。

contrast rendering

“美丽在旁观者的眼中”我希望这会有所帮助。

答案 2 :(得分:0)

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

  1. 尝试在Macintosh HD / Library / Preferences下找到com.apple.dt.Xcode.plist文件。
  2. 将文件复制到桌面
  3. 打开文件并将NSFontDefaultScreenFontSubstitutionEnabled添加到(布尔值)YES
  4. 将AppleAntiAliasingThreshold添加到(Number)24
  5. 将此文件替换为首选项文件
  6. 重启系统和Xcode
  7. 注意:为了更安全,请保留原始文件的备份。