ios - mac - Come disabilitare l'arrotondamento dei font in Xcode 9?



installato dove (2)

Gestito male?

Ecco uno screenshot del mio Xcode 9 con Deccy a 13pt:

Credo che quanto sopra sia ciò che vuoi. Ecco il codice Xcode che mostra lo stesso file:

Ma come?

Ho sondato in profondità per un modo non invasivo per realizzare questo, e fallito. Per quanto ne so, il percorso di rendering del testo in Xcode 9 attiva deliberatamente la levigatura dei font.

Prima di continuare, invia una richiesta di funzionalità con Apple. Ci vogliono solo pochi minuti, ed è la tua migliore speranza per una risposta che possa essere discussa di fronte a quelli con solidi istinti di sicurezza e problemi di cardiovasculatura:

https://bugreport.apple.com/

Ho scritto un plugin Xcode. Potresti aver sentito che Xcode 9 utilizza restrizioni di firma del codice per vietare il caricamento di plugin. Questo è vero, ma un paio di anticonformisti proseguono, e stasera andiamo con loro.

Primo passo

C'è uno strumento, update_xcode_plugins . Puoi usarlo per rimuovere la firma del codice dalla tua copia di Xcode e con essa la restrizione del caricamento del pacchetto:

$ gem install update_xcode_plugins
$ update_xcode_plugins --unsign

Se cambi idea, puoi farlo per ripristinare (una copia di backup, credo?) Di Xcode firmato:

$ update_xcode_plugins --restore

Passo due

C'è un altro strumento, Alcatraz . È un gestore di plugin per Xcode. Ho scelto di installarlo perché fornisce un plugin che fornisce un modello di progetto per i plugin. Ho seguito queste istruzioni per installare Alcatraz, che si riducono a questo:

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

Ho lanciato Xcode, ho fatto clic sulla finestra di dialogo avvisandomi del nuovo plug-in, quindi ho utilizzato la finestra di Windows> Package Manager per installare il modello "Xcode Plugin".

Fase tre

Ho realizzato un progetto con questo modello.

Mentre scrivo questo, il modello "Xcode Plugin" non è stato aggiornato per supportare Xcode 9. Nessun problema. Ho eseguito questo comando per afferrare l'UUID di compatibilità di Xcode 9:

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

Ho visitato il mio nuovo progetto Info.plist e ho aggiunto DVTPlugInCompatibilityUUIDs matrice DVTPlugInCompatibilityUUIDs .

Quindi, ho collegato SourceEditor.framework al mio progetto. Quello era un processo in due fasi:

  1. Visita le impostazioni di costruzione del target. Aggiungi questo ai percorsi di ricerca del framework:

    /Applications/Xcode.app/Contents/SharedFrameworks/
  2. Visita le Fasi di costruzione del bersaglio. Aggiungi una nuova fase "Collega binari con le librerie". Colpire il vantaggio. Passare alla directory in alto (è sufficiente premere il tasto / e quindi incollare il percorso in) e scegliere SourceEditor.framework . Dovrebbe apparire nell'elenco. Il progetto dovrebbe ancora costruire.

Quindi, ho reso il file .mm del mio plugin simile a questo (ho cancellato il file .h , non è necessario per questo 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

... Penso che il goto s aggiunga carattere. Fondamentalmente, definisce semplicemente una funzione che prende un CGContextRef e disattiva l'antialias del testo per esso. Quindi, sovrascrive l'inizio di una funzione all'interno del framework SourceEditor che normalmente configura le impostazioni di antialiasing - non serve più - per passare invece alla nostra funzione. Fa tutto questo in un modo incredibilmente pericoloso, quindi se qualcosa va storto, Xcode potrebbe bloccarsi in modo educato.

Costruisci ed esegui il progetto, che installa automaticamente il plugin. Accetta l'aggiunta del tuo plugin, e basta.

E adesso?

Se qualcosa qui non funziona perché ho incasinato, fammi sapere. Non ho intenzione di farlo da solo in un plug-in di Alcatraz, ma tu o qualcun altro dovresti liberarti di farlo con il credito (dopo aver presentato una richiesta di funzionalità con Apple).

Happy hacking!

Ho un ottimo font di programmazione Deccy che sembra buono solo con font smoothing (anti aliasing) disabilitato in Xcode. Con Xcode 8 il seguente avrebbe fatto il trucco:

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

Ma questo non funziona più con Xcode 9.

Sarebbe possibile disabilitare l'arrotondamento dei font in Xcode 9?


Ecco i passaggi alternativi che potrebbero funzionare per te.

  1. Prova a trovare il file com.apple.dt.Xcode.plist in Macintosh HD / Libreria / Preferenze.
  2. Copia il file sul desktop
  3. Aprire il file e aggiungere NSFontDefaultScreenFontSubstitutionEnabled a (Boolean) YES
  4. aggiungi AppleAntiAliasingThreshold a (numero) 24
  5. Sostituisci questo file con il file delle preferenze
  6. Riavvia il sistema e Xcode

Nota: per un lato più sicuro, mantenere il backup del file originale.





xcode9