2016-11-22 4 views
3

J'écris un rendu de police bitmap simple pour OpenGL et je voudrais aussi rendre Unicode. Cependant, dans de nombreuses polices, certains caractères sont manquants et sont rendus en carrés. Ceux-ci gaspillent par conséquent de l'espace dans ma texture et j'aimerais m'en débarrasser. Y at-il une fonction WinAPI pour détecter si un certain caractère sera rendu comme un carré de tofu en utilisant une certaine police?Sous Windows, comment détecter si un caractère Unicode est rendu carré (tofu)?

J'utilise GDI, je fais un bitmap en utilisant offscreen CreateDIBSection, puis obtenir une police à l'aide CreateFontIndirect et rendre Glyphes en utilisant ExtTextOutW. Jusqu'à présent, je pensais à détecter le tofu dans la forme pixellisée (en comparant les pixels) qui fonctionne, mais je suppose que ce n'est pas très agréable. Cela nécessite aussi que j'obtienne un caractère Unicode que la police donnée ne possède certainement pas, afin d'obtenir un "modèle" à comparer. Je suppose que j'aurais des ennuis tôt ou tard comme ça.

+1

Demandez [GetFontUnicodeRanges()] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd144887 (v ​​= vs.85) .aspx)? –

+0

@AlexK. cela prend-il en charge les caractères non-BMP? La structure 'WCRANGE' ne fait aucune réservation pour les paires de substitution ... – andlabs

+0

Comment préparez-vous les textures? GDI? GDI +? DirectWrite? Traiter manuellement les fichiers TTF/OTF? – andlabs

Répondre

2

J'ai dû faire quelque chose de similaire pour implémenter mes propres font-linking et font-fallback lors de la construction de cartes de glyphes pour un moteur de rendu 3D. J'ai utilisé Uniscribe pour convertir la chaîne de caractères en une chaîne d'index glyphes dans la police. Puis j'ai utilisé ScriptGetFontProperties pour obtenir la propriété wgDefault pour la police et j'ai comparé la valeur à chacun des index glyphes.

L'équivalent pur GDI serait d'utiliser quelque chose comme GetCharacterPlacement pour convertir le texte en glyphe index (et puis vous utilisez ExtTextOut avec ETO_GLYPH_INDEX), mais je ne pense pas que cela fasse toute la mise en forme de clé et réordonnancement que Uniscribe ferait . Pour commencer, je ne pense pas que ça marchera pour autre chose que le BMP.

Vous ne souhaitez pas faire correspondre graphiquement le glyphe de symbole manquant car ce n'est pas toujours un carré. Par exemple, dans certaines polices, il s'agit d'un diamant noir avec un point d'interrogation.