Coleções de fontes personalizadas (Windows 7/8)
DirectWrite fornece acesso à coleção de fontes do sistema usando o método IDWriteFactory::GetSystemFontCollection. Essa é a coleção de fontes usada com mais frequência. No entanto, alguns aplicativos precisam usar fontes que não estão instaladas no sistema, como de arquivos de fonte incluídos ou arquivos de fonte inseridos no aplicativo.
Se as fontes desejadas não estiverem na coleção de fontes do sistema, você poderá criar uma coleção de fontes personalizada derivada de IDWriteFontCollection.
Essa visão geral consiste nas seguintes partes:
- Registrar e cancelar o registro de um carregador de coleção de fontes
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Registre um carregador de coleção de fontes usando o método IDWriteFactory::RegisterFontCollectionLoader e passando uma interface IDWriteFontCollectionLoader implementada pelo aplicativo como um objeto singleton. Esse objeto carregará as fontes quando a coleção personalizada for solicitada. Tanto a coleção de fontes do sistema quanto as coleções de fontes personalizadas são armazenadas em cache, portanto, as fontes são carregadas apenas uma vez.
O carregador da coleção de fontes deve ser descarregado eventualmente usando o IDWriteFactory::UnregisterFontCollectionLoader.
Observação
Registrar o carregador de coleção de fontes adiciona à contagem de referência; não chame UnregisterFontCollectionLoader de dentro do destruidor ou o objeto carregador de coleção nunca será cancelado.
Você cria um objeto IDWriteFontFileEnumerator usando o objeto IDWriteFactory::CreateCustomFontCollection e passando uma chave definida pelo aplicativo. A chave é um ponteiro nulo e o tipo de dados, o formato e o significado são definidos pelo aplicativo e são opacos para o sistema de fontes.
Enquanto a chave pode ser qualquer coisa, DirectWrite requer que cada chave seja:
- Exclusivo para uma única coleção de fontes dentro do escopo do carregador.
- Válido até que o carregador não seja registrado usando a fábrica.
Quando o método CreateCustomFontCollection é chamado, DirectWrite chama de volta para uma interface IDWriteFontCollectionLoader implementada como um objeto singleton pelo aplicativo. O método de retorno de chamada IDWriteFontCollectionLoader::CreateEnumeratorFromKey é usado por DirectWrite para recuperar um objeto IDWriteFontFileEnumerator implementado pelo aplicativo. O objeto IDWriteFactory que está sendo usado para criar a coleção é passado para esse método e deve ser usado pelo enumerador de arquivo de fonte para criar os objetos IDWriteFontFile a serem incluídos na coleção.
A chave passada para esse método identifica a coleção de fontes e é a mesma chave passada para CreateCustomFontCollection.
O objeto IDWriteFontFileEnumerator definido pelo aplicativo criado pelo método CreateEnumeratorFromKey é usado para enumerar os arquivos de fonte em uma coleção, criando um objeto IDWriteFontFile para cada arquivo. O método IDWriteFontFileEnumerator::MoveNext altera a posição para o próximo arquivo de fonte. Se houver um arquivo na posição, ele definirá hasCurrentFile como TRUE. Caso contrário, ele será definido como FALSE e o método retornará S_OK.
Observação
O enumerador de arquivo de fonte deve começar posicionado antes do primeiro elemento e avançado na primeira chamada para MoveNext.
Um objeto IDWriteFontFile é gerado pelo método IDWriteFontFileEnumerator::GetCurrentFontFile . Se não houver nenhum arquivo de fonte na posição atual, como MoveNext ainda não foi chamado ou hasCurrentFile foi definido como FALSE, GetCurrentFontFile retornará E_FAIL.
A saída do objeto IDWriteFontFile porGetCurrentFontFile pode ser criada chamando IDWriteFactory::CreateCustomFontFileReference. A chave de referência do arquivo de fonte identifica uma referência de arquivo de fonte específica e deve ser exclusiva dentro do carregador de arquivo de fonte que carregará o arquivo.
O método CreateCustomFontFileReference usa um objeto IDWriteFontFileLoader implementado pelo aplicativo que é usado para carregar a fonte. O método de retorno de chamada IDWriteFontFileLoader::CreateStreamFromKey é passado pela chave e gera um objeto IDWriteFontFileStream .
O objeto IDWriteFontFileStream implementado pelo aplicativo fornece os dados do arquivo de fonte para uma referência de arquivo de fonte de um carregador de arquivo de fonte personalizado. Junto com o tamanho do arquivo e a hora da última gravação, ele fornece um método (ReadFileFragment) para recuperar fragmentos de arquivo que devem ser compilados em um objeto IDWriteFontFile .
Observação
As implementações readFileFragment devem retornar um erro se o fragmento solicitado estiver fora dos limites do arquivo.
Um IDWriteFontFileStream pode obter o conteúdo do arquivo de fonte de qualquer lugar, como a unidade de disco rígido local ou recursos inseridos.