Domanda

Domanda:

C'è un modo per verificare se un determinato tipo di carattere è uno dei ?

Credo che avrei potuto semplicemente hard-code l'elenco dei nomi dei font, in quanto si tratta di un elenco relativamente breve, ma che sembra un po 'brutto. Sarebbero i nomi dei caratteri essere lo stesso indipendentemente dalle impostazioni locali e della lingua di Windows'?

Sfondo:

PuTTY sembra davvero brutto con grassetto, ClearType -enabled, il testo Consolas. Ho deciso di giocare con la sorgente e vedere se riuscivo a capire il problema, e credo di aver rintracciato giù al seguente codice (abbreviato):

font_height = cfg.font.height;
if (font_height > 0) {
    font_height =
        -MulDiv(font_height, GetDeviceCaps(hdc, LOGPIXELSY), 72);
    }
}
font_width = 0;

#define f(i,c,w,u) \
    fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
                           c, OUT_DEFAULT_PRECIS, \
                           CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
                           FIXED_PITCH | FF_DONTCARE, cfg.font.name)

f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);

SelectObject(hdc, fonts[FONT_NORMAL]);
GetTextMetrics(hdc, &tm);

font_height = tm.tmHeight;
font_width = tm.tmAveCharWidth;

f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);

L'intento è quello di scegliere un grassetto che si adatta le stesse dimensioni del font normale. Sto assumendo che il testo Consolas di mastice sembra brutto perché, dal momento che Consolas è così fortemente ottimizzato per essere spiegate su specifici limiti di pixel, cercando di calzascarpe in dimensioni arbitrarie produce cattivi risultati.

Così sembra che una correzione adeguata sarebbe quella di rilevare i caratteri ClearType-ottimizzato e cercare di creare le versioni in grassetto di quei caratteri che utilizzano la stessa larghezza e altezza della chiamata CreateFont iniziale.

È stato utile?

Soluzione

Non sono sicuro che seguo abbastanza che cosa si intende per "rintracciato verso il basso per il seguente codice (abbreviato)", ma abbastanza sicuro Consolas grassetto sembra male in Putty. Ecco stucco fonte di finestre / window.c. (Revisione 8914 ottenuto con la sovversione "svn co svn: //svn.tartarus.org/sgt/putty", il 5 aprile 2010)

      1386      fonts[i] = CreateFont (font_height, font_width, 0, 0, w, FALSE, u, FALSE, \
      1387                             c, OUT_DEFAULT_PRECIS, \
      1388                             CLIP_DEFAULT_PRECIS, FONT_QUALITY(cfg.font_quality), \
      1389                             FIXED_PITCH | FF_DONTCARE, cfg.font.name)
      1390  
      1391      f(FONT_NORMAL, cfg.font.charset, fw_dontcare, FALSE);
      1392  
      1393      SelectObject(hdc, fonts[FONT_NORMAL]);
      1394      GetTextMetrics(hdc, &tm);
      1395  
      1396      GetObject(fonts[FONT_NORMAL], sizeof(LOGFONT), &lfont);
      1397  
      1398      if (pick_width == 0 || pick_height == 0) {
      1399            font_height = tm.tmHeight;
      1400            font_width = tm.tmAveCharWidth;
      1401      }
      ...
      1477      if (bold_mode == BOLD_FONT) {
      1478      f(FONT_BOLD, cfg.font.charset, fw_bold, FALSE);
      1479      }

Per 10 pt Consolas, i valori di font_height e font_width erano -13 e 0 quando CreateFont stato chiamato per FONT_NORMAL (tramite la macro f), ma 15 e 7 quando è stato chiamato per FONT_BOLD (i valori vengono modificati su linee 1399 , 1400). Impostando il valore della larghezza in modo esplicito non è d'accordo bene con il tipo di carattere in grassetto Consolas. Se window.c viene modificato in modo che le linee 1477-1479 vengono spostati venire dopo la linea 1391 è ottenuto un carattere molto meglio grassetto Consolas (I provato anche tutti gli altri caratteri disponibili (Courier, Bitstream, Lucida ecc) e non erano negativamente . colpito ho inviato questo suggerimento al team Putty Ecco una figura che mostra la differenza.: bold-consolas-example

aggiunto il 16 gennaio 2011: Il "bug" è ancora presente, e la correzione funziona ancora. Ora i line-numeri in window.c sono che le linee 1510-1512 devono essere spostati per venire dopo riga 1417. Kristjan.

AGGIUNTO gennaio 13, 2012: Il bug è ancora in versione 0.62 di stucco (uscito il 10 dicembre 2011). I LINENUMBERS per spostare sono ora 1532-1534 venire dietro a 1439. Per completezza qui sono i passi I, effettuate nei Cygwin:

$ svn co svn://svn.tartarus.org/sgt/putty2
$ cd putty
$ perl mkfiles.pl
$ cd windows
$ --- edit window.c and move the 3 lines---
$ make CC=gcc-3 -f Makefile.cyg
$ --- move resulting executable files (including putty.exe) to a suitable folder
$ --- add shortcuts to the executables to Windows start menu

Kristjan

Altri suggerimenti

Non sono sicuro se questa è una risposta per voi, ma assicurandosi che la larghezza del tipo di carattere è un esatto larghezza in pixel intero, farà larghezza fissa font TrueType guardare bene sotto ClearType.

Per raggiungere questo obiettivo, è necessario 'round' l'altezza dei caratteri con alcuni tentativi ed errori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top