2010-03-26 35 views
1

Question:Détection des polices ClearType optimisées

est-il un moyen de vérifier si une police donnée est l'un des Microsoft ClearType-optimized fonts?

Je suppose que je pourrais simplement coder en dur la liste des noms de police, puisque c'est une liste relativement courte, mais cela semble un peu moche. Est-ce que les noms de police seraient les mêmes quels que soient les paramètres régionaux et linguistiques de Windows?

Contexte:

PuTTY ressemble vraiment laid en gras, ClearType activé, le texte Consolas. J'ai décidé de jouer avec la source et voir si je pouvais comprendre le problème, et je pense que je dépisté à ce qui suit (en abrégé) Code:

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); 

Le but est de choisir une police audacieuse qui correspond à les mêmes dimensions que la police normale. Je suppose que le texte Consolas de PuTTY a l'air laid parce que, étant donné que Consolas est si fortement optimisé pour être disposé sur des limites de pixels spécifiques, essayer de le pousser dans des dimensions arbitraires produit de mauvais résultats. Il semble donc qu'une solution appropriée consisterait à détecter les polices optimisées ClearType et à essayer de créer les versions en gras de ces polices en utilisant la même largeur et la même hauteur que l'appel CreateFont initial.

Répondre

4

Je ne suis pas sûr que je suis tout à fait ce que l'on entend par "suivi au code (abrégé) suivant", mais bien sûr que Consolas gras semble mauvais dans Putty. Voici mastic source de windows/window.c (révision 8914 obtenue avec subversion "svn co svn: //svn.tartarus.org/sgt/putty", le 5 avril 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  } 

Pour 10 pt Consolas, les valeurs de font_height et font_width étaient -13 et 0 lorsque CreateFont a été appelé pour FONT_NORMAL (via la macro f), mais 15 et 7 quand il a été appelé à FONT_BOLD (les valeurs sont changé sur les lignes 1399, 1400). La définition explicite de la valeur de la largeur n'est pas en accord avec la police en gras Consolas. Si window.c est modifié de manière à ce que les lignes 1477-1479 soient déplacées pour arriver après la ligne 1391, une police de caractères Consolas bien plus agréable est obtenue (j'ai également essayé toutes les autres polices disponibles (Courier, Bitstream, Lucida etc.) et elles ne . affectée J'ai envoyé cette suggestion à l'équipe Putty Voici une figure montrant la différence. Bold-consolas-example

AJOUTÉE lE 16 JANVIER 2011: le « bug » est toujours présent, et le correctif fonctionne toujours maintenant la ligne. -Nombre dans window.c sont que les lignes 1510-1512 13, 2012 devraient être déplacés à venir après la ligne 1417. Kristjan

AJOUTÉE sUR LE JAN: Le bug est toujours dans la version 0.62 de mastic (publié le 10 décembre.. , 2011). Les draps à déplacer sont maintenant 1532-1534 à venir après 1439. Pour l'exhaustivité ici sont les étapes que je transportais dans 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

+0

Le code "(abrégé)" était une version simplifiée de windows \ window.c. Votre analyse est fondamentalement la même que la mienne. La solution de contournement que j'ai faite pour ma copie locale de PuTTY était de passer 0 pour la largeur de police si le nom de police est Consolas. (Les polices soulignées peuvent aussi être gâchées, je pense que votre solution ne pourra pas les gérer.) –

+0

Merci pour cet indice. J'ai également suivi le problème jusqu'à cette région de code et blâmé CreateFont à la fin. Maintenant, j'ai changé le code de sorte que la largeur de la police est passée à 0 (ligne 1421) et il semble aussi bon que l'on pouvait s'y attendre. Pour gérer de manière proactive des polices supplémentaires et étroites/larges (jamais vu cela), je réinitialise x à 0 si elle est égale à font_width avant la ligne 1596. Impossible de trouver des erreurs avec d'autres polices de largeur fixe de taille similaire. – ygoe

0

Je ne sais pas si cela est une réponse pour vous, mais en veillant à la largeur de la police est une largeur de pixel entier exacte, fera largeur fixe Les polices TrueType paraissent bien sous ClearType.

Pour ce faire, vous devrez arrondir la hauteur de votre police avec quelques essais et erreurs.

+0

De mes tests, il est préférable de ne pas spécifier de largeur de police et de laisser Windows choisir une largeur de police adaptée à la hauteur. –

+0

J'ai essayé, mais vous remarquerez quelques problèmes d'espacement de 1 pixel. – leppie