Пользовательские коллекции шрифтов (Windows 7/8)
DirectWrite предоставляет доступ к системной коллекции шрифтов с помощью метода IDWriteFactory::GetSystemFontCollection. Это коллекция шрифтов, которая используется чаще всего. Однако некоторые приложения должны использовать шрифты, которые не установлены в системе, например из включенных файлов шрифтов или файлов шрифтов, внедренных в приложение.
Если нужные шрифты не находятся в системной коллекции шрифтов, можно создать пользовательскую коллекцию шрифтов, производную от IDWriteFontCollection.
Этот обзор состоит из следующих частей:
- Регистрация и отмена регистрации загрузчика коллекции шрифтов
- IDWriteFontCollectionLoader
- IDWriteFontFileEnumerator
- CreateCustomFontFileReference
- IDWriteFontFileLoader
- IDWriteFontFileStream
Регистрация и отмена регистрации загрузчика коллекции шрифтов
Загрузчик коллекции шрифтов регистрируется с помощью метода IDWriteFactory::RegisterFontCollectionLoader и передается ему интерфейс IDWriteFontCollectionLoader , реализованный приложением в виде одноэлементного объекта. Этот объект загружает шрифты при запросе пользовательской коллекции. Как системная, так и пользовательская коллекции шрифтов кэшируются, поэтому шрифты загружаются только один раз.
В конечном итоге загрузчик коллекции шрифтов должен быть выгружен с помощью IDWriteFactory::UnregisterFontCollectionLoader.
Примечание
Регистрация загрузчика коллекции шрифтов добавляет к счетчику ссылок; не вызывайте UnregisterFontCollectionLoader из деструктора, иначе объект загрузчика коллекции никогда не будет отменен.
IDWriteFontCollectionLoader
Вы создаете объект IDWriteFontFileEnumerator с помощью IDWriteFactory::CreateCustomFontCollection и передаете ему ключ, определяемый приложением. Ключ является указателем void, а тип данных, формат и значение определяются приложением и непрозрачны для системы шрифтов.
В то время как ключ может быть любым, DirectWrite требует, чтобы каждый ключ был как:
- Уникальный для одной коллекции шрифтов в область загрузчика.
- Действителен до отмены регистрации загрузчика с помощью фабрики.
При вызове метода CreateCustomFontCollectionDirectWrite обратно вызывает интерфейс IDWriteFontCollectionLoader, реализованный приложением в виде одноэлементного объекта. Метод обратного вызова IDWriteFontCollectionLoader::CreateEnumeratorFromKey используется DirectWrite для получения объекта IDWriteFontFileEnumerator, реализованного приложением. Объект IDWriteFactory, используемый для создания коллекции, передается этому методу и должен использоваться перечислителем файла шрифта для создания объектов IDWriteFontFile , которые будут включены в коллекцию.
Ключ, передаваемый этому методу, идентифицирует коллекцию шрифтов и является тем же ключом, который передается в CreateCustomFontCollection.
IDWriteFontFileEnumerator
Определяемый приложением объект IDWriteFontFileEnumerator , созданный методом CreateEnumeratorFromKey , используется для перечисления файлов шрифтов в коллекции, создавая объект IDWriteFontFile для каждого файла. Метод IDWriteFontFileEnumerator::MoveNext изменяет позицию на следующий файл шрифта. Если в позиции есть файл, для hasCurrentFile будет задано значение TRUE. В противном случае ему будет присвоено значение FALSE , а метод вернет S_OK.
Примечание
Перечислитель файлов шрифтов должен быть расположен перед первым элементом и расширен при первом вызове MoveNext.
Объект IDWriteFontFile выводится методом IDWriteFontFileEnumerator::GetCurrentFontFile . Если в текущей позиции нет файла шрифта, так как Метод MoveNext еще не был вызван или параметру hasCurrentFile присвоено значение FALSE, getCurrentFontFile вернет E_FAIL.
CreateCustomFontFileReference
Выходные данные объекта IDWriteFontFilegetCurrentFontFile можно создать, вызвав IDWriteFactory::CreateCustomFontFileReference. Ключ ссылки на файл шрифтов идентифицирует конкретную ссылку на файл шрифтов и должен быть уникальным в загрузчике файлов шрифтов, который будет загружать файл.
IDWriteFontFileLoader
Метод CreateCustomFontFileReference принимает объект IDWriteFontFileLoader, реализованный приложением, который используется для загрузки шрифта. Метод обратного вызова IDWriteFontFileLoader::CreateStreamFromKey передает ключ и выводит объект IDWriteFontFileStream .
IDWriteFontFileStream
Реализованный приложением объект IDWriteFontFileStream предоставляет данные файла шрифта для ссылки на файл шрифта из пользовательского загрузчика файлов шрифтов. Вместе с размером файла и временем последней записи он предоставляет метод (ReadFileFragment) для извлечения фрагментов файлов, которые должны быть скомпилированы в объект IDWriteFontFile .
Примечание
Реализации ReadFileFragment должны возвращать ошибку, если запрошенный фрагмент находится за пределами файла.
IDWriteFontFileStream может получить содержимое файла шрифта из любого места, например из локального жесткого диска или внедренных ресурсов.