Collections de polices personnalisées (Windows 7/8)
DirectWrite permet d’accéder à la collection de polices système à l’aide de la méthode IDWriteFactory::GetSystemFontCollection. Il s’agit de la collection de polices qui est la plus fréquemment utilisée. Toutefois, certaines applications doivent utiliser des polices qui ne sont pas installées sur le système, telles que des fichiers de police inclus ou des fichiers de police incorporés dans l’application.
Si les polices souhaitées ne se trouvent pas dans la collection de polices système, vous pouvez créer une collection de polices personnalisée dérivée d’IDWriteFontCollection.
Cette vue d’ensemble se compose des éléments suivants :
- Inscription et annulation de l’inscription d’un chargeur de collection de polices
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Inscription et annulation de l’inscription d’un chargeur de collection de polices
Vous inscrivez un chargeur de collection de polices à l’aide de la méthode IDWriteFactory::RegisterFontCollectionLoader et en lui transmettant une interface IDWriteFontCollectionLoader implémentée par l’application en tant qu’objet singleton. Cet objet charge les polices lorsque la collection personnalisée est demandée. La collection de polices système et les collections de polices personnalisées sont mises en cache, de sorte que les polices ne sont chargées qu’une seule fois.
Le chargeur de collection de polices doit être déchargé à l’aide de IDWriteFactory::UnregisterFontCollectionLoader.
Notes
L’inscription du chargeur de collection de polices ajoute au nombre de références ; n’appelez pas UnregisterFontCollectionLoader à partir du destructeur ou l’objet chargeur de collection ne sera jamais désinscrit.
IDWriteFontCollectionLoader
Vous créez un objet IDWriteFontFileEnumerator en utilisant IDWriteFactory::CreateCustomFontCollection et en lui transmettant une clé définie par l’application. La clé est un pointeur void et le type de données, le format et la signification sont définis par l’application et sont opaques pour le système de polices.
Alors que la clé peut être n’importe quoi, DirectWrite exige que chaque clé soit à la fois :
- Unique à une collection de polices unique dans l’étendue du chargeur.
- Valide jusqu’à ce que le chargeur soit désinscrit à l’aide de la fabrique.
Lorsque la méthode CreateCustomFontCollection est appelée, DirectWrite rappelle une interface IDWriteFontCollectionLoader implémentée en tant qu’objet singleton par l’application. La méthode de rappel IDWriteFontCollectionLoader::CreateEnumeratorFromKey est utilisée par DirectWrite pour récupérer un objet IDWriteFontFileEnumerator implémenté par l’application. L’objet IDWriteFactory utilisé pour créer la collection est transmis à cette méthode et doit être utilisé par l’énumérateur de fichiers de polices pour créer les objets IDWriteFontFile à inclure dans la collection.
La clé passée à cette méthode identifie la collection de polices et est la même clé passée à CreateCustomFontCollection.
IDWriteFontFileEnumerator
L’objet IDWriteFontFileEnumerator défini par l’application qui a été créé par la méthode CreateEnumeratorFromKey est utilisé pour énumérer les fichiers de police dans une collection, en créant un objet IDWriteFontFile pour chaque fichier. La méthode IDWriteFontFileEnumerator::MoveNext remplace la position par le fichier de police suivant. S’il existe un fichier à la position, hasCurrentFile est défini sur TRUE. Sinon, elle sera définie sur FALSE et la méthode retournera S_OK.
Notes
L’énumérateur de fichier de police doit commencer à être positionné avant le premier élément et avancé lors du premier appel à MoveNext.
Un objet IDWriteFontFile est généré par la méthode IDWriteFontFileEnumerator::GetCurrentFontFile . S’il n’existe aucun fichier de police à la position actuelle, car MoveNext n’a pas encore été appelé ou hasCurrentFile a la valeur FALSE, GetCurrentFontFile retourne E_FAIL.
CreateCustomFontFileReference
La sortie de l’objet IDWriteFontFile parGetCurrentFontFile peut être créée en appelant IDWriteFactory::CreateCustomFontFileReference. La clé de référence du fichier de police identifie une référence de fichier de police spécifique et doit être unique dans le chargeur de fichiers de polices qui chargera le fichier.
IDWriteFontFileLoader
La méthode CreateCustomFontFileReference prend un objet IDWriteFontFileLoader implémenté par l’application utilisée pour charger la police. La méthode de rappel IDWriteFontFileLoader::CreateStreamFromKey reçoit la clé et génère un objet IDWriteFontFileStream .
IDWriteFontFileStream
L’objet IDWriteFontFileStream implémenté par l’application fournit les données du fichier de police pour une référence de fichier de police à partir d’un chargeur de fichiers de polices personnalisé. Avec la taille du fichier et l’heure de la dernière écriture, il fournit une méthode (ReadFileFragment) pour récupérer les fragments de fichiers qui doivent être compilés dans un objet IDWriteFontFile .
Notes
Les implémentations ReadFileFragment doivent retourner une erreur si le fragment demandé est en dehors des limites de fichier.
Un IDWriteFontFileStream peut obtenir le contenu du fichier de police à partir de n’importe où, comme le lecteur de disque dur local ou les ressources incorporées.