ios - Wie deaktiviere ich die Schriftglättung in Xcode 9?




iphone ide (2)

Ich habe einen großartigen Programmier-Font Deccy , der nur gut aussieht, Deccy die Schriftglättung (Anti-Aliasing) in Xcode deaktiviert ist. Mit Xcode 8 würde das Folgende den Trick machen:

defaults write com.apple.dt.Xcode NSFontDefaultScreenFontSubstitutionEnabled -bool YES
defaults write com.apple.dt.Xcode AppleAntiAliasingThreshold 24

Dies funktioniert aber mit Xcode 9 nicht mehr.

Ist es möglich, die Schriftglättung in Xcode 9 zu deaktivieren?


Unfug geschafft?

Hier ist ein Screenshot von meinem Xcode 9 mit Deccy bei 13pt:

Ich glaube das obige ist was du willst. Hier ist der aktuelle Xcode, der dieselbe Datei anzeigt:

Aber wie?

Ich suchte tief nach einem nicht-invasiven Weg, um dies zu erreichen, und scheiterte. Der Text-Rendering-Pfad in Xcode 9 aktiviert, soweit ich das beurteilen kann, ganz bewusst die Schriftglättung.

Bevor Sie fortfahren, reichen Sie bitte eine Funktionsanforderung bei Apple ein. Es dauert nur ein paar Minuten und es ist Ihre beste Hoffnung auf eine Antwort, die vor denen mit soliden Sicherheitsinstinkten und überlastetem Herz-Kreislauf diskutiert werden kann:

https://bugreport.apple.com/

Ich habe ein Xcode-Plugin geschrieben. Möglicherweise haben Sie gehört, dass Xcode 9 Codesignaturbeschränkungen verwendet, um das Laden von Plugins zu verbieten. Das ist wahr, aber ein paar Außenseiter machen weiter und heute Abend reiten wir mit ihnen.

Schritt eins

Es gibt ein Tool, update_xcode_plugins . Sie können es verwenden, um die Codesignatur von Ihrer Xcode-Kopie und damit die Einschränkung beim Laden von Paketen zu entfernen:

$ gem install update_xcode_plugins
$ update_xcode_plugins --unsign

Wenn Sie es sich anders überlegen, können Sie dies tun, um auf eine Sicherungskopie von signiertem Xcode zurückzugreifen:

$ update_xcode_plugins --restore

Schritt zwei

Es gibt ein anderes Tool, Alcatraz . Es ist ein Plugin-Manager für Xcode. Ich habe es installiert, weil es ein Plugin enthält, das eine Projektvorlage für Plugins enthält. Ich habe diese Anweisungen befolgt, um Alcatraz zu installieren.

$ git clone https://github.com/alcatraz/Alcatraz.git
$ cd Alcatraz
$ xcodebuild

Ich habe Xcode gestartet, durch das Dialogfeld geklickt, um mich über das neue Plugin zu warnen, und dann mit dem neu hinzugefügten Fenster> Paket-Manager die Vorlage "Xcode Plugin" installiert.

Schritt drei

Mit dieser Vorlage habe ich ein Projekt gemacht.

Während ich dies schreibe, wurde die Vorlage "Xcode Plugin" nicht aktualisiert, um Xcode 9 zu unterstützen. Keine Sorge. Ich habe diesen Befehl ausgeführt, um die Kompatibilitäts-UUID von Xcode 9 zu ermitteln:

$ defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID

Ich besuchte die Info.plist meines neuen Projekts und fügte diese UUID dem DVTPlugInCompatibilityUUIDs Array hinzu.

Dann habe ich SourceEditor.framework in mein Projekt SourceEditor.framework . Das war ein zweistufiger Prozess:

  1. Besuchen Sie die Build-Einstellungen des Ziels. Fügen Sie dies zu den Framework-Suchpfaden hinzu:

    /Applications/Xcode.app/Contents/SharedFrameworks/
  2. Besuchen Sie die Build-Phasen des Ziels. Fügen Sie eine neue Phase "Binär mit Bibliotheken verknüpfen" hinzu. Drücken Sie das Plus. Navigieren Sie zum obigen Verzeichnis (Sie können einfach die Taste / drücken und den Pfad einfügen) und wählen Sie SourceEditor.framework . Es sollte in der Liste erscheinen. Das Projekt sollte noch erstellt werden.

Dann habe ich die .mm Datei meines Plugins .mm aussehen lassen (ich habe die .h Datei gelöscht, sie ist für diesen PoC nicht .h ):

#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

… Ich denke, der goto s fügt Charakter hinzu. Grundsätzlich wird nur eine Funktion definiert, die CGContextRef und das Text-Antialiasing für diese Funktion CGContextRef . Anschließend wird der Anfang einer Funktion innerhalb des SourceEditor-Frameworks überschrieben, in der normalerweise Antialiasing-Einstellungen konfiguriert werden - das brauchen Sie nicht mehr -, um stattdessen zu unserer Funktion zu springen. All dies geschieht auf unglaublich unsichere Weise. Wenn also etwas schief geht, kann Xcode höflich abstürzen.

Erstellen Sie das Projekt und führen Sie es aus, wodurch das Plugin automatisch installiert wird. Akzeptiere das Hinzufügen deines Plugins und das war's.

Was jetzt?

Wenn etwas hier nicht funktioniert, weil ich es vermasselt habe, lass es mich wissen. Ich habe nicht vor, dies selbst in ein Alcatraz-Plugin zu rollen, aber Sie oder andere sollten dies mit Credits tun können (nachdem Sie eine Funktionsanfrage bei Apple eingereicht haben).

Viel Spaß beim Hacken!


Hier sind alternative Schritte, die für Sie funktionieren könnten.

  1. Versuchen Sie, die Datei com.apple.dt.Xcode.plist unter Macintosh HD / Library / Preferences zu finden.
  2. Kopieren Sie die Datei auf den Desktop
  3. Öffnen Sie die Datei und fügen Sie NSFontDefaultScreenFontSubstitutionEnabled zu (Boolean) YES hinzu
  4. Fügen Sie AppleAntiAliasingThreshold zu (Number) 24 hinzu
  5. Ersetzen Sie diese Datei durch die Einstellungsdatei
  6. Starten Sie das System und Xcode neu

Hinweis: Zur Sicherheit sollten Sie eine Sicherungskopie der Originaldatei erstellen.





xcode9