2010-06-14 9 views
1

Je suis polices Windows comme l'énumération suivante:Pourquoi FONTSIGNATURE ne reflète-t-il pas lfCharSet?

LOGFONTW lf = {0}; 
lf.lfCharSet = DEFAULT_CHARSET; 
lf.lfFaceName[0] = L'\0'; 
lf.lfPitchAndFamily = 0; 
::EnumFontFamiliesEx(hdc, &lf, 
        reinterpret_cast<FONTENUMPROCW>(FontEnumCallback), 
        reinterpret_cast<LPARAM>(this), 0); 

Ma fonction de rappel a cette signature:

int CALLBACK FontEnumerator::FontEnumCallback(const ENUMLOGFONTEX *pelf, 
               const NEWTEXTMETRICEX *pMetrics, 
               DWORD font_type, 
               LPARAM context); 

Pour les polices TrueType, j'obtiennent généralement le nom de chaque visage à plusieurs reprises. Par exemple, pour plusieurs appels, j'obtiens pelf->elfFullName et pelf->elfLogFont.lfFaceName comme "Arial". En regardant de plus près les autres champs, je vois que chaque appel est pour un script différent. Par exemple, sur le premier appel pelf->elfScript sera "Western" et pelf->elfLogFont.lfCharSet sera l'équivalent numérique de ANSI_CHARSET. Au deuxième appel, je reçois "Hebrew" et HEBREW_CHARSET. Troisième appel "Arabic" et ARABIC_CHARSET. Etc. Jusqu'ici tout va bien. Le champ font signature (pMetrics->ntmFontSig) pour toutes les versions d'Arial est identique. En fait, la signature de police prétend que toutes ces versions d'Arial supportent le Latin-1, l'hébreu, l'arabe et d'autres. Je connais les jeux de caractères des chaînes que j'essaie de dessiner, donc j'essaye d'instancier une police appropriée basée sur les signatures de police. Parce que les signatures de police correspondent toujours, je finis toujours par sélectionner la police "Western", même en affichant du texte en hébreu ou en arabe. J'utilise des API Uniscribe de bas niveau, donc je n'ai pas l'avantage de la liaison de polices Windows, et pourtant mon code semble fonctionner.

Est-ce que lfCharSet a réellement un sens ou est-ce un artefact hérité? Devrais-je simplement mettre lfCharSet à DEFAULT_CHARSET et arrêter de m'inquiéter de toutes les variantes de script de chaque visage? Pour mes besoins, je m'intéresse uniquement aux polices TrueType et OpenType.

Répondre

1

Je pense avoir trouvé la réponse. Les polices qui sont énumérées plusieurs fois sont "big" fonts. Les grandes polices sont des polices uniques qui incluent des glyphes pour plusieurs scripts ou pages de codes.

La partie Unicode du FONTSIGNATURE (fsUsb) représente toutes les sous-bandes Unicode que la police peut gérer. Ceci est indépendant du jeu de caractères. Si vous utilisez les API de caractères larges, vous pouvez utiliser tous les glyphes inclus dans la police, quel que soit le jeu de caractères spécifié lors de la création de la police.

La partie de la page de codes du FONTSIGNATURE (fsCsb) représente les pages de code que la police peut gérer. Je crois que ceci n'est significatif que lorsque la police n'est pas une "grande" police. Dans ce cas, les masques fsUsb seront tous des zéros et le fsCsb spécifiera le (s) jeu (s) de caractères approprié (s). Dans ces cas, il est important d'obtenir le lfCharSet correct dans le LOGFONT. Lorsque vous instanciez une «grande» police et que vous utilisiez les API de caractères larges, peu importe le lfCharSet que vous spécifiez.