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.
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.) –
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