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.