Rilevamento caratteri ClearType ottimizzato
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.
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.:
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.