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 figurent pas dans la collection de polices système, vous pouvez créer une collection de polices personnalisée dérivée de IDWriteFontCollection.
Cette vue d’ensemble se compose des parties suivantes :
- Inscrire et annuler 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 un IDWriteFontCollectionLoader interface 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 éventuellement être déchargé à l’aide de l'IDWriteFactory ::UnregisterFontCollectionLoader.
Note
L’inscription du chargeur de collection de polices s’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 à l’aide de l'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 police.
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 ne soit pas inscrit à l’aide de la fabrique.
Lorsque la méthode CreateCustomFontCollection est appelée, DirectWrite revient à 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 passé à cette méthode et doit être utilisé par l’énumérateur de fichier de police 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 créé par la méthode CreateEnumeratorFromKey est utilisé pour énumérer les fichiers de police d’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, il définit le hasCurrentFile sur TRUE. Sinon, elle est définie sur false et la méthode retourne S_OK.
Note
L’énumérateur de fichier de police doit démarrer avant le premier élément et avancé au premier appel pour 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 été défini sur 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 police qui chargera le fichier.
IDWriteFontFileLoader
La méthodeCreateCustomFontFileReferenceprend un objet IDWriteFontFileLoader implémenté par l’application utilisée pour charger la police. La méthode de rappel IDWriteFontFileLoader ::CreateStreamFromKey est passée à la clé et génère un objet IDWriteFontFileStream.
IDWriteFontFileStream
L’objet IDWriteFontFileStream implémenté par l’application fournit les données de fichier de police d’une référence de fichier de police à partir d’un chargeur de fichiers de police personnalisé. Avec la taille du fichier et la dernière heure d’écriture, il fournit une méthode (ReadFileFragment) pour récupérer des fragments de fichier qui doivent être compilés dans un objet IDWriteFontFile.
Note
ReadFileFragment implémentations doivent retourner une erreur si le fragment demandé se trouve en dehors des limites du fichier.
Un IDWriteFontFileStream peut obtenir le contenu du fichier de police n’importe où, tel que le disque dur local ou les ressources incorporées.