Raccolte di caratteri personalizzate (Windows 7/8)
DirectWrite fornisce l'accesso alla raccolta di tipi di carattere di sistema usando il metodo IDWriteFactory::GetSystemFontCollection. Si tratta della raccolta di caratteri usata più di frequente. Tuttavia, alcune applicazioni devono usare tipi di carattere non installati nel sistema, ad esempio da file di carattere inclusi o file di carattere incorporati nell'applicazione.
Se i tipi di carattere desiderati non sono presenti nella raccolta di caratteri di sistema, è possibile creare una raccolta di tipi di carattere personalizzata derivata da IDWriteFontCollection.
Questa panoramica è costituita dalle parti seguenti:
- Registrazione e annullamento della registrazione di un caricatore della raccolta di tipi di carattere
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Registrazione e annullamento della registrazione di un caricatore della raccolta di tipi di carattere
Si registra un caricatore della raccolta di caratteri usando il metodo IDWriteFactory::RegisterFontCollectionLoader e passandolo un'interfaccia IDWriteFontCollectionLoader implementata dall'applicazione come oggetto Singleton. Questo oggetto caricherà i tipi di carattere quando viene richiesta la raccolta personalizzata. Sia la raccolta dei tipi di carattere di sistema che le raccolte di caratteri personalizzate vengono memorizzate nella cache, quindi i tipi di carattere vengono caricati solo una volta.
Il caricatore della raccolta di caratteri deve essere scaricato alla fine usando IDWriteFactory::UnregisterFontCollectionLoader.
Nota
La registrazione del caricatore della raccolta di caratteri aggiunge al conteggio dei riferimenti; non chiamare UnregisterFontCollectionLoader dall'interno del distruttore o dall'oggetto loader di raccolta non verrà mai annullata la registrazione.
IDWriteFontCollectionLoader
Si crea un oggetto IDWriteFontFileEnumerator usando IDWriteFactory::CreateCustomFontCollection e passandola una chiave definita dall'applicazione. La chiave è un puntatore void e il tipo di dati, il formato e il significato sono definiti dall'applicazione e sono opachi al sistema di caratteri.
Mentre la chiave può essere qualsiasi cosa, DirectWrite richiede che ogni chiave sia:
- Univoco per una singola raccolta di caratteri all'interno dell'ambito del caricatore.
- Valido fino a quando il caricatore non viene registrato usando la factory.
Quando viene chiamato il metodo CreateCustomFontCollection, DirectWrite chiama un'interfaccia IDWriteFontCollectionLoader implementata come oggetto Singleton dall'applicazione. Il metodo idWriteFontCollectionLoader::CreateEnumeratorFromKey callback viene usato da DirectWrite per recuperare un oggetto IDWriteFontFileEnumerator implementato dall'applicazione. L'oggetto IDWriteFactory usato per creare la raccolta viene passato a questo metodo e deve essere usato dall'enumeratore di file di tipo carattere per creare gli oggetti IDWriteFontFile da includere nell'insieme.
La chiave passata a questo metodo identifica la raccolta di caratteri ed è la stessa chiave passata a CreateCustomFontCollection.
IDWriteFontFileEnumerator
L'oggetto IDWriteFontFileEnumerator definito dall'applicazione creato dal metodo CreateEnumeratorFromKey viene usato per enumerare i file di carattere in una raccolta, creando un oggetto IDWriteFontFile per ogni file. Il metodo IDWriteFontFileEnumerator::MoveNext modifica la posizione nel file di carattere successivo. Se è presente un file nella posizione, verrà impostato l'hasCurrentFile su TRUE. In caso contrario, verrà impostato su FALSE e il metodo restituirà S_OK.
Nota
L'enumeratore del file di carattere deve iniziare prima del primo elemento e avanzato alla prima chiamata a MoveNext.
Un oggetto IDWriteFontFile viene restituito dal metodo IDWriteFontFileEnumerator::GetCurrentFontFile . Se non è presente alcun file di carattere nella posizione corrente, perché MoveNext non è ancora stato chiamato o hasCurrentFile è stato impostato su FALSE, GetCurrentFontFile restituirà E_FAIL.
CreateCustomFontFileReference
L'output dell'oggetto IDWriteFontFile diGetCurrentFontFile può essere creato chiamando IDWriteFactory::CreateCustomFontFileReference. La chiave di riferimento del file di carattere identifica un riferimento al file di carattere specifico e deve essere univoca all'interno del caricatore di file di carattere che caricherà il file.
IDWriteFontFileLoader
Il metodo CreateCustomFontFileReference accetta un oggetto IDWriteFontFileLoader implementato dall'applicazione usata per caricare il tipo di carattere. Il metodo di callback IDWriteFontFileLoader::CreateStreamFromKey viene passato alla chiave e restituisce un oggetto IDWriteFontFileStream .
IDWriteFontFileStream
L'oggetto IDWriteFontFileStream implementato dall'applicazione fornisce i dati del file di carattere per un riferimento al file di carattere da un caricatore di file di carattere personalizzato. Insieme alle dimensioni del file e all'ultima ora di scrittura, fornisce un metodo (ReadFileFragment) per il recupero di frammenti di file che devono essere compilati in un oggetto IDWriteFontFile .
Nota
Le implementazioni readFileFragment devono restituire un errore se il frammento richiesto è esterno ai limiti del file.
Un IDWriteFontFileStream può ottenere il contenuto del file di carattere da qualsiasi posizione, ad esempio l'unità disco rigido locale o le risorse incorporate.