Direct 2D #7. Всё о тексте(От А до Я)

Отступление: При желании материально подержать перевод и структурирование информации - средства можете отправить через сбор в ЮМани (https://yoomoney.ru/fundraise/1FC5LM5GP86.260118)
Криптовалюта (USDT BNB Chain) - 0xa5c36a7d782d143928cf60d9a26f127fcc92aca7

Из прошлых статей можно понять философию проектирования Direct2D, а в следствии этого и то, что всё начинается с создании фабрики, для текста это IDWriteFactory , есть разные версии интерфейса, главное отличие поддержками начиная с разных версией Windows а так же Build , но самая актуальная версия интерфейса, есть и в Windows 10. Но выбор интерфейсов будет показан позже, в примерах для иных интерфейсов.

Создания фабрики:

IDWriteFactory* writeFactory = nullptr;
DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
                    __uuidof(IDWriteFactory), 
                    reinterpret_cast<IUnknown**>(&writeFactory));

О функции DWriteCreateFactory:

Первый аргумент, это флаг: DWRITE_FACTORY_TYPE_SHARED  - общая фабрика для всего процесса(при повторном создании, будет данная ссылка на тот же объект), DWRITE_FACTORY_TYPE_ISOLATED - каждый вызов DWriteCreateFactory  порождает новую фабрику.

Второй аргумент, это GGUID фабрики в зависимости от винды, достаточно передать __uuidof(IDWriteFactory).

Третий аргумент, ссылка на фабрику.

Распределение функций по группам и пояснение:

Группа 1: Создание объектов для текста и шрифтов

Метод: CreateTextFormat

  1. Параметры:

    1. Тип: const WCHAR*, Название: fontFamilyName
      Назначение: Имя семейства шрифтов (например, L"Arial"). Передайте nullptr, чтобы использовать шрифт системы по умолчанию.

    2. Тип: IDWriteFontCollection*, Название: fontCollection
      Назначение: Указатель на коллекцию, в которой следует искать семейство шрифтов. Может быть nullptr — в этом случае используется системная коллекция.

    3. Тип: DWRITE_FONT_WEIGHT, Название: fontWeight
      Назначение: Насыщенность (жирность) шрифта. Используйте константы, например, DWRITE_FONT_WEIGHT_NORMAL или DWRITE_FONT_WEIGHT_BOLD.

    4. Тип: DWRITE_FONT_STYLE, Название: fontStyle
      Назначение: Стиль начертания. Используйте DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STYLE_ITALIC или DWRITE_FONT_STYLE_OBLIQUE.

    5. Тип: DWRITE_FONT_STRETCH, Название: fontStretch
      Назначение: Ширина символов. Обычно DWRITE_FONT_STRETCH_NORMAL, но может быть CONDENSED, EXPANDED и другие.

    6. Тип: FLOAT, Название: fontSize
      Назначение: Размер шрифта в единицах, не зависящих от устройства (DIP).

    7. Тип: const WCHAR*, Название: localeName
      Назначение: Имя локали (например, L"ru-RU") для правильного выбора глифов в многоязычных шрифтах.

    8. Тип: IDWriteTextFormat**, Название: textFormat
      Назначение: Адрес указателя, по которому будет записан адрес созданного объекта формата текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать основной объект для описания стиля текста (шрифт, размер, выравнивание). Этот объект можно использовать многократно для создания различных текстовых макетов и форматов.

Метод: CreateTextLayout

  1. Параметры:

    1. Тип: const WCHAR*, Название: string
      Назначение: Указатель на строку в кодировке UTF-16, которую требуется отобразить.

    2. Тип: UINT32, Название: stringLength
      Назначение: Длина строки в символах.

    3. Тип: IDWriteTextFormat*, Название: textFormat
      Назначение: Указатель на базовый объект формата текста (IDWriteTextFormat), задающий начальное оформление.

    4. Тип: FLOAT, Название: maxWidth
      Назначение: Максимальная ширина области макета.

    5. Тип: FLOAT, Название: maxHeight
      Назначение: Максимальная высота области макета.

    6. Тип: IDWriteTextLayout**, Название: textLayout
      Назначение: Адрес указателя для получения созданного объекта макета текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать объект макета текста, который управляет переносом строк, позиционированием и позволяет применять сложное форматирование к различным фрагментам текста. Менее производительный, но более функциональный, чем простой IDWriteTextFormat.

Метод: CreateTypography

  1. Параметры:

    1. Тип: IDWriteTypography**, Название: typography
      Назначение: Указатель для получения адреса созданного объекта типографики.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать пустой объект для применения расширенных типографских функций шрифта (стилистические наборы, лигатуры, альтернативные формы и т.д.). Полученный объект затем необходимо настроить с помощью методов IDWriteTypography::AddFontFeature

Метод: CreateFontCollection

  1. Параметры:

    1. Тип: IDWriteFontCollectionLoader*, Название: collectionLoader
      Назначение: Указатель на пользовательский загрузчик коллекций, реализующий интерфейс IDWriteFontCollectionLoader.

    2. Тип: const void*, Название: collectionKey
      Назначение: Указатель на уникальный ключ, идентифицирующий загружаемую коллекцию в контексте загрузчика.

    3. Тип: UINT32, Название: collectionKeySize
      Назначение: Размер ключа коллекции в байтах.

    4. Тип: IDWriteFontCollection**, Название: fontCollection
      Назначение: Указатель для получения адреса созданной пользовательской коллекции шрифтов.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать коллекцию шрифтов, используя зарегистрированный пользовательский загрузчик. Это основной метод для работы с пользовательскими шрифтами не из системных папок (например, из файлов, архивов, сети).

Группа 2: Работа с системными шрифтами
  1. Метод GetSystemFontCollection:

    1. Параметры:

      1. тип IDWriteFontCollection** название fontCollection назначение: указатель для получения системной коллекции

      2. тип BOOL название checkForUpdates назначение: нужно ли перед возвращением системной коллекции, проводить обновление или нет

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Получить системную коллекцию шрифтов.

  2. Метод CreateFontSetBuilder:

    1. Параметры:

      1. тип IDWriteFontSetBuilder** название: fontSetBuilder назначение: Указатель для получения построителя

    2. Возвращаемое значение: HRESULT.

    3. Назначение: получить построить шрифтов.

  3. Метод CreateFontCollectionFromFontSet:

    1. Параметры:

      1. тип IDWriteFontSet* название fontSet назначение: набор шрифтов.

      2. тип IDWriteFontCollection1** название: fontCollection назначение: указатель для получения интерфейса.

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Получить коллекцию шрифтов из набора шрифтов.

Группа 3: Создание вспомогательных объектов и анализ

Метод: CreateGdiCompatibleTextLayout

  1. Параметры:

    1. Тип: const WCHAR*, Название: string
      Назначение: Указатель на строку в кодировке UTF-16 для отображения.

    2. Тип: UINT32, Название: stringLength
      Назначение: Длина строки string в символах.

    3. Тип: IDWriteTextFormat*, Название: textFormat
      Назначение: Указатель на объект текстового формата, описывающий базовое оформление.

    4. Тип: FLOAT, Название: layoutWidth
      Назначение: Ширина макета в DIP (Device Independent Pixels).

    5. Тип: FLOAT, Название: layoutHeight
      Назначение: Высота макета в DIP.

    6. Тип: FLOAT, Название: pixelsPerDip
      Назначение: Коэффициент масштабирования (обычно равен текущему DPI / 96.0f).

    7. Тип: const DWRITE_MATRIX*, Название: transform
      Назначение: Указатель на матрицу преобразования (масштаб, сдвиг, наклон). Может быть nullptr для использования единичной матрицы.

    8. Тип: BOOL, Название: useGdiNatural
      Назначение: Если TRUE, макет будет оптимизирован для совместимости с GDI (используются метрики шрифта, как в GDI). Если FALSE, используется стандартный режим DirectWrite.

    9. Тип: IDWriteTextLayout**, Название: textLayout
      Назначение: Указатель для получения адреса созданного GDI-совместимого текстового макета.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать текстовый макет, оптимизированный для рендеринга через GDI или в сценариях, требующих максимального соответствия выводу старого графического интерфейса Windows. Это устаревший метод, используемый в основном для совместимости.

Метод: CreateEllipsisTrimmingSign

  1. Параметры:

    1. Тип: IDWriteTextFormat*, Название: textFormat
      Назначение: Указатель на объект текстового формата, который определяет стиль (шрифт, размер) знака троеточия (...).

    2. Тип: IDWriteInlineObject**, Название: trimmingSign
      Назначение: Указатель для получения адреса созданного объекта "троеточие".

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать стандартный объект-инлайн объект в виде троеточия (...), который используется для визуального обозначения обрезанного текста при применении свойства обрезки (SetTrimming) к текстовому макету. Позволяет единообразно настраивать внешний вид знака обрезки.

Метод: CreateTextAnalyzer

  1. Параметры:

    1. Тип: IDWriteTextAnalyzer**, Название: textAnalyzer
      Назначение: Указатель для получения адреса созданного объекта-анализатора текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать низкоуровневый анализатор текста — основной инструмент для собственной реализации обработки сложного текста. Используется для анализа скриптов, разбивки на строки, определения форм символов (глифов) и позиционирования. Необходим при работе с экзотическими языками или нестандартными сценариями рендеринга, которые не покрываются стандартным макетом.

Метод: CreateNumberSubstitution

  1. Параметры:

    1. Тип: DWRITE_NUMBER_SUBSTITUTION_METHOD, Название: substitutionMethod
      Назначение: Метод подстановки цифр (например, DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE - на основе локали, DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL - на основе контекста скрипта).

    2. Тип: const WCHAR*, Название: localeName
      Назначение: Имя локали (например, L"ar-SA" для арабского в Саудовской Аравии), которая определяет, какие формы цифр использовать.

    3. Тип: BOOL, Название: ignoreUserOverride
      Назначение: Если TRUE, системные пользовательские настройки замены цифр будут проигнорированы. Если FALSE, они будут учтены.

    4. Тип: IDWriteNumberSubstitution**, Название: numberSubstitution
      Назначение: Указатель для получения адреса созданного объекта подстановки цифр.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать объект, который управляет заменой европейских цифр (0-9) на локализованные формы (например, арабские, индийские, тайские) в тексте в соответствии с выбранным методом и локалью.

Группа 4: Мониторинг и пользовательские компоненты
  1. Метод RegisterFontCollectionLoader:

    1. Параметры:

      1. тип IDWriteFontCollectionLoader* название fontCollectionLoader назначение указатель на пользовательский загрузчик (реализованный вами).

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Регистрирует пользовательский загрузчик коллекций шрифтов (например, для загрузки шрифтов из архива или сети).

  2. Метод RegisterFontFileLoader:

    1. Параметры:

      1. тип IDWriteFontFileLoader* название fontFileLoader назначение указатель на пользовательский загрузчик файлов.

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Регистрирует пользовательский загрузчик файлов шрифтов (например, для расшифровки или кэширования).

  3. Метод CreateCustomFontCollection:

    1. Параметры:

      1. тип IDWriteFontCollectionLoader название collectionLoader назначение зарегистрированный загрузчик

      2. тип const void название collectionKey Уникальный ключ для идентификации коллекции.

      3. тип UINT32 название collectionKeySize Размер ключа в байтах.

      4. тип DWriteFontCollection** название fontCollection Указатель для получения коллекции.

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Создаёт коллекцию шрифтов, используя зарегистрированный пользовательский загрузчик.

  4. Метод CreateCustomRenderingParams:

    1. Параметры:

      1. тип FLOAT название gamma назначение Гамма (обычно 2.2)

      2. тип FLOAT название enhancedContrast назначение Усиление контраста (0.0 - 1.0 и выше)

      3. тип FLOAT название clearTypeLevel назначение Уровень ClearType (0.0 - 1.0)

      4. тип флаг DWRITE_PIXEL_GEOMETRY название pixelGeometry назначение

      5. тип флаг DWRITE_RENDERING_MODE1 название renderingMode назначение

      6. тип IDWriteRenderingParams1** название renderingParams назначение

    2. Возвращаемое значение: HRESULT.

    3. Назначение: Создаёт параметры рендеринга с пользовательскими настройками (гамма, контраст, сглаживание ClearType).

Группа 5: Устаревшие методы

Метод: CreateFontFace

  1. Параметры:

    1. Тип: DWRITE_FONT_FACE_TYPE, Название: fontFaceType
      Назначение: Тип файла шрифта (например, DWRITE_FONT_FACE_TYPE_TRUETYPE, DWRITE_FONT_FACE_TYPE_CFF).

    2. Тип: UINT32, Название: numberOfFiles
      Назначение: Количество файлов, составляющих это семейство шрифтов (обычно 1).

    3. Тип: IDWriteFontFile* const*, Название: fontFiles
      Назначение: Массив указателей на объекты файлов шрифтов (IDWriteFontFile).

    4. Тип: UINT32, Название: faceIndex
      Назначение: Индекс начертания в файле шрифта, содержащем несколько начертаний (обычно 0).

    5. Тип: DWRITE_FONT_SIMULATIONS, Название: fontFaceSimulationFlags
      Назначение: Флаги, указывающие, следует ли симулировать жирное или курсивное начертание (DWRITE_FONT_SIMULATION_BOLD, OBLIQUE).

    6. Тип: IDWriteFontFace**, Название: fontFace
      Назначение: Указатель для получения адреса созданного объекта, представляющего конкретное начертание шрифта.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать объект, представляющий конкретное физическое начертание шрифта на низком уровне. Является основой для получения данных глифов, метрик и отрисовки. В современном коде часто получается через метод IDWriteFont::CreateFontFace.

Метод: CreateRenderingParams

  1. Параметры:

    1. Тип: IDWriteRenderingParams**, Название: renderingParams
      Назначение: Указатель для получения адреса созданного объекта параметров рендеринга.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Создать объект параметров рендеринга с настройками по умолчанию для основного монитора системы. Является упрощённой версией CreateCustomRenderingParams.

Так как достаточно разных интерфейсов порождается, расскажу сначала о IDWriteTextFormat и его версиях, а после IDWriteTextLayout и так же затрону разные версии, так как благодаря им, можно отобразить текст.

А после расскажу о других интерфейсах.

Так как информации много, то будет следующая структура:

  1. функции интерфейса

  2. пример интерфейса

  3. остальные версии интерфейса

Получение конкретной версии интерфейса:

(*ppBaseFormat)->QueryInterface(
            __uuidof(IDWriteTextFormat3), 
            reinterpret_cast<void**>(ppFormat3)
        );
//ppBaseFormat это IDWriteTextFormat**
описание и функции IDWriteTextFormat

Интерфейс хранящий настройки форматирования текста, в дальнейшем передаётся при отображении текста.

метод GetFontCollection:

  1. Параметры:

    1. тип IDWriteFontCollection** название fontCollection назначение Адрес указателя, по которому возвращается адрес объекта коллекции шрифтов, связанной с этим форматом.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает коллекцию шрифтов, в которой ищется семейство, указанное в этом формате. Возвращаемый объект имеет увеличенный счетчик ссылок.

метод GetFontFamilyName:

  1. Параметры:

    1. тип WCHAR* название fontFamilyName назначение Указатель на буфер, который получает строку с именем семейства шрифтов.

    2. тип UINT32 название nameSize назначение Размер буфера fontFamilyName в символах (включая завершающий нуль).

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает строку с копией имени семейства шрифтов, заданного для этого формата.

метод GetFontFamilyNameLength:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: UINT32.

  3. Назначение: Возвращает длину строки имени семейства шрифтов в символах, не включая завершающий нуль. Используется для корректного выделения буфера перед вызовом GetFontFamilyName.

метод GetFontSize:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: FLOAT.

  3. Назначение: Возвращает текущий размер шрифта в DIP (Device Independent Pixels), установленный для этого формата.

метод GetFontStretch:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_FONT_STRETCH.

  3. Назначение: Возвращает степень растяжения шрифта (например, Normal, Condensed, Expanded), заданную для этого формата.

метод GetFontStyle:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_FONT_STYLE.

  3. Назначение: Возвращает стиль шрифта (например, Normal, Italic, Oblique), заданный для этого формата.

метод GetFontWeight:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_FONT_WEIGHT.

  3. Назначение: Возвращает насыщенность (вес) шрифта (например, Normal, Bold), заданную для этого формата.

метод GetIncrementalTabStop:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: FLOAT.

  3. Назначение: Возвращает величину шага табуляции в DIP. Если возвращает 0, то табуляция для этого формата отключена.

метод GetLineSpacing:

  1. Параметры:

    1. тип DWRITE_LINE_SPACING_METHOD* название lineSpacingMethod назначение Указатель на переменную, которая получает используемый метод расчета межстрочного интервала.

    2. тип FLOAT* название lineSpacing назначение Указатель на переменную, которая получает значение межстрочного интервала в DIP.

    3. тип FLOAT* название baseline назначение Указатель на переменную, которая получает расстояние от верха строки до базовой линии в DIP.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает текущие параметры межстрочного интервала (интерлиньяжа).

метод GetLocaleName:

  1. Параметры:

    1. тип WCHAR* название localeName назначение Указатель на буфер, который получает строку с именем локали.

    2. тип UINT32 название nameSize назначение Размер буфера localeName в символах (включая завершающий нуль).

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает строку с копией имени локали (например, "en-US"), заданного для этого формата.

метод GetLocaleNameLength:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: UINT32.

  3. Назначение: Возвращает длину строки имени локали в символах, не включая завершающий нуль. Используется для выделения буфера перед вызовом GetLocaleName.

метод GetParagraphAlignment:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_PARAGRAPH_ALIGNMENT.

  3. Назначение: Возвращает текущее выравнивание абзаца по вертикали (например, Near/Верх, Center, Far/Низ).

метод GetTextAlignment:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_TEXT_ALIGNMENT.

  3. Назначение: Возвращает текущее выравнивание текста по горизонтали (например, Leading/Начало, Center, Trailing/Конец).

метод GetTrimming:

  1. Параметры:

    1. тип DWRITE_TRIMMING* название trimmingOptions назначение Указатель на структуру DWRITE_TRIMMING, которая получает параметры обрезки.

    2. тип IDWriteInlineObject** название trimmingSign назначение Адрес указателя, по которому возвращается адрес объекта, используемого в качестве знака обрезки.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает текущие параметры обрезки текста и объект знака обрезки (например, многоточия).

метод GetWordWrapping:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_WORD_WRAPPING.

  3. Назначение: Возвращает текущую стратегию переноса слов (например, Wrap, No Wrap, Emergency Break).

метод SetFontFamilyName:

  1. Параметры:

    1. тип const WCHAR* название fontFamilyName назначение Строка, содержащая имя нового семейства шрифтов.

    2. тип UINT32 название nameLength назначение Длина строки fontFamilyName в символах. Для нуль-терминированной строки можно указать UINT_MAX.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Внимание: Этот метод изменяет объект, но для основных свойств шрифта (имя, размер и т.д.) изменения могут не вступить в силу, если объект уже использовался. Для гарантированного изменения рекомендуется создавать новый формат через IDWriteFactory::CreateTextFormat.

метод SetFontSize:

  1. Параметры:

    1. тип FLOAT название fontSize назначение Новый размер шрифта в DIP.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает размер шрифта. Имеет те же ограничения, что и SetFontFamilyName.

метод SetFontStretch:

  1. Параметры:

    1. тип DWRITE_FONT_STRETCH название fontStretch назначение Новая степень растяжения шрифта.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает степень растяжения шрифта. Имеет те же ограничения, что и SetFontFamilyName.

метод SetFontStyle:

  1. Параметры:

    1. тип DWRITE_FONT_STYLE название fontStyle назначение Новый стиль шрифта.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает стиль шрифта. Имеет те же ограничения, что и SetFontFamilyName.

метод SetFontWeight:

  1. Параметры:

    1. тип DWRITE_FONT_WEIGHT название fontWeight назначение Новый вес (насыщенность) шрифта.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает вес шрифта. Имеет те же ограничения, что и SetFontFamilyName.

метод SetIncrementalTabStop:

  1. Параметры:

    1. тип FLOAT название incrementalTabStop назначение Новое расстояние шага табуляции в DIP. Значение 0 отключает табуляцию.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает фиксированный интервал между последовательными позициями табуляции.

метод SetLastLineWrapping:

  1. Параметры:

    1. тип BOOL название isLastLineWrapping назначение Если TRUE, перенос в последней строке разрешен; если FALSE - запрещен.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Включает или отключает возможность переноса слов для последней строки в абзаце. Метод интерфейса IDWriteTextFormat1.

метод SetLineSpacing:

  1. Параметры:

    1. тип DWRITE_LINE_SPACING_METHOD название lineSpacingMethod назначение Метод расчета межстрочного интервала.

    2. тип FLOAT название lineSpacing назначение Значение межстрочного интервала в DIP.

    3. тип FLOAT название baseline назначение Расстояние от верха строки до базовой линии в DIP.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Определяет способ расчета и устанавливает значение межстрочного интервала для текста.

метод SetLocaleName:

  1. Параметры:

    1. тип const WCHAR* название localeName назначение Строка, содержащая имя новой локали.

    2. тип UINT32 название nameLength назначение Длина строки localeName в символах. Для нуль-терминированной строки можно указать UINT_MAX.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает локаль для форматирования текста. Имеет те же ограничения, что и SetFontFamilyName.

метод SetOpticalAlignment:

  1. Параметры:

    1. тип DWRITE_OPTICAL_ALIGNMENT название opticalAlignment назначение Новая настройка оптического выравнивания.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Включает (NO_SIDE_BEARINGS) или выключает (NONE) оптическую компенсацию полей для более аккуратного визуального выравнивания. Метод интерфейса IDWriteTextFormat1.

метод SetParagraphAlignment:

  1. Параметры:

    1. тип DWRITE_PARAGRAPH_ALIGNMENT название paragraphAlignment назначение Новое выравнивание абзаца по вертикали.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает, как текст должен быть выровнен по вертикали внутри предоставленного макета.

метод SetTextAlignment:

  1. Параметры:

    1. тип DWRITE_TEXT_ALIGNMENT название textAlignment назначение Новое выравнивание текста по горизонтали.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает, как текст должен быть выровнен по горизонтали внутри строки.

метод SetTrimming:

  1. Параметры:

    1. тип const DWRITE_TRIMMING* название trimmingOptions назначение Указатель на структуру с новыми параметрами обрезки.

    2. тип IDWriteInlineObject* название trimmingSign назначение Указатель на объект, используемый в качестве знака обрезки. Может быть NULL для использования многоточия по умолчанию.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Задает способ обрезки текста, который не помещается, и объект, который будет рисоваться на месте обрезанной части.

метод SetVerticalGlyphOrientation:

  1. Параметры:

    1. тип DWRITE_VERTICAL_GLYPH_ORIENTATION название glyphOrientation назначение Новая ориентация глифов для вертикального текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Определяет, должны ли глифы поворачиваться (DEFAULT) или оставаться в естественной ориентации (STACKED) при вертикальном направлении письма. Метод интерфейса IDWriteTextFormat1.

метод SetWordWrapping:

  1. Параметры:

    1. тип DWRITE_WORD_WRAPPING название wordWrapping назначение Новая стратегия переноса слов.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Устанавливает, как текст должен переноситься на следующую строку при достижении границы.

пример IDWriteTextFormat

Повторим основу, создание фабрики текста.

IDWriteFactory* writeFactory = nullptr;
DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
                    __uuidof(IDWriteFactory), 
                    reinterpret_cast<IUnknown**>(&writeFactory));

Теперь создание IDWriteTextFormat через CreateTextFormat (К слову IDWriteTextFormat не зависит от устройства).

IDWriteTextFormat* formatText = nullptr;
writeFactory->CreateTextFormat(L"Aptos",
                               nullptr,
                               DWRITE_FONT_WEIGHT_THIN, 
                               DWRITE_FONT_STYLE_NORMAL, 
                               DWRITE_FONT_STRETCH_UNDEFINED,
                               12,
                               L"ru_RU",
                               &formatText);

Чуть более подробней о параметрах, какие есть варианты и на что повлияют:

  1. Имя семейства шрифтов. Например конкретные: L"Arial", L"Segoe UI"(Он используется по умолчанию, если указали пустую строку)

  2. Набор шрифтов, в которым будет искать указанный шрифт. nullptr это системный набор

  3. Насыщенность шрифтов. Например: DWRITE_FONT_WEIGHT_NORMAL - стандартный, DWRITE_FONT_WEIGHT_BOLD - жирный. Полный список .

  4. Стиль начертания(наклон). Например: DWRITE_FONT_STYLE_NORMAL - без наклона. DWRITE_FONT_STYLE_OBLIQUE - механический наклон шрифта. DWRITE_FONT_STYLE_ITALIC - курсив, специальные наклонные глифы. Пример как выглядит(листать вниз).

  5. Ширина/сжатие символов по горизонтали. Например: DWRITE_FONT_STRETCH_CONDENSED - узкий. DWRITE_FONT_STRETCH_NORMAL - стандартная ширина. DWRITE_FONT_STRETCH_EXPANDED - широкий.
    Пример как выглядит(Листать вниз).

  6. Размер шрифта в DIP:
    8.0f - Мелкий текст (подписи)
    10.0f - Мелкий основной текст
    12.0f - Стандартный основной текст
    14.0f - Крупный текст
    18.0f - Подзаголовки
    24.0f - Заголовки
    36.0f - Крупные заголовки

  7. Язык/регион для правильного отображения текста(в нотации BCP-47).

  8. Ну и выходной параметр для получения созданного объекта.

Все параметры указные при передачи, неизменяемые.

Теперь, просто отрисуем текст. При помощи функции DrawTextW:

std::wstring text = L"Обычный текст "; //Объявил вне тела функции рисования
D2D1_RECT_F rect = D2D1::RectF(10.0f, 10.0f, 100.0f, 50.0f);//Объявил вне тела функции рисования
pRenderTarget->DrawRectangle(rect,pBlackBrush);

        pRenderTarget->DrawTextW(text.c_str(), 
                                 text.length(), 
                                 formatText, 
                                 rect, 
                                 pBlackBrush, 
                                 D2D1_DRAW_TEXT_OPTIONS_NONE, 
                                 DWRITE_MEASURING_MODE_NATURAL);

Для наглядности нарисовал ещё и рамку текста.

О параметрах функции рисования:

  1. тип const WCHAR* . Указатель на строку Unicode (UTF-16) с текстом

  2. тип UINT . Длина текста

  3. тип IDWriteTextFormat*. формат текста

  4. тип const D2D1_RECT_F&. Прямоугольник в который будет помещён текст(выравнивание по левому краю и т.п. Это как раз в прямоугольнике)

  5. тип ID2D1Brush*. Кисть для текста

  6. тип флагD2D1_DRAW_TEXT_OPTIONS. Опции отрисовки:
    D2D1_DRAW_TEXT_OPTIONS_NONE - Стандартный рендеринг
    D2D1_DRAW_TEXT_OPTIONS_NO_SNAP - Отключает снэппинг к пикселям
    D2D1_DRAW_TEXT_OPTIONS_CLIP - Обрезка по границам layoutRect
    D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT - Включает цветные шрифты (emoji, символы)
    D2D1_DRAW_TEXT_OPTIONS_DISABLE_COLOR_BITMAP_SNAPPING - Отключает снэппинг для битмапов в шрифтах

  7. тип флаг DWRITE_MEASURING_MODE. Определяет, как измеряется текст при масштабировании и преобразованиях:
    DWRITE_MEASURING_MODE_NATURAL - Стандартный текст, статический UI(Будет применён ClearType)
    DWRITE_MEASURING_MODE_GDI_CLASSIC - Совместимость со старым GDI
    DWRITE_MEASURING_MODE_GDI_NATURAL - Гибрид GDI и DirectWrite

IDWriteTextFormat1

метод SetVerticalGlyphOrientation:

  1. Параметры:

    1. тип DWRITE_VERTICAL_GLYPH_ORIENTATION название glyphOrientation назначение Задает ориентацию глифов (символов) при вертикальном направлении текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Контролирует, как отображаются символы в вертикальном тексте. При DWRITE_VERTICAL_GLYPH_ORIENTATION_DEFAULT глифы поворачиваются на 90°, при DWRITE_VERTICAL_GLYPH_ORIENTATION_STACKED остаются в естественном вертикальном положении (для иероглифов). Работает совместно с SetFlowDirection(DWRITE_FLOW_DIRECTION_TOP_TO_BOTTOM).

метод GetVerticalGlyphOrientation:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_VERTICAL_GLYPH_ORIENTATION.

  3. Назначение: Возвращает текущую ориентацию глифов для вертикального текста.

метод SetOpticalAlignment:

  1. Параметры:

    1. тип DWRITE_OPTICAL_ALIGNMENT название opticalAlignment назначение Включает или отключает оптическое выравнивание границ текста.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Улучшает визуальное восприятие выровненного текста. При DWRITE_OPTICAL_ALIGNMENT_NO_SIDE_BEARINGS убирает внутренние боковые отступы глифов (side bearings), что делает визуальный край строки более ровным и прижатым к границе.

метод GetOpticalAlignment:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: DWRITE_OPTICAL_ALIGNMENT.

  3. Назначение: Возвращает текущую настройку оптического выравнивания.

метод SetLastLineWrapping:

  1. Параметры:

    1. тип BOOL название isLastLineWrapping назначение Разрешает (TRUE) или запрещает (FALSE) перенос слов в последней строке абзаца.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Контролирует поведение последней строки текстового блока. Значение FALSE (по умолчанию) предотвращает «висячие» слова, что типично для UI-элементов. Значение TRUE позволяет переносить последнюю строку, как в текстовых редакторах.

метод GetLastLineWrapping:

  1. Параметры: отсутствуют.

  2. Возвращаемое значение: BOOL.

  3. Назначение: Возвращает TRUE, если перенос в последней строке разрешен, иначе FALSE.

метод SetFontFallback:

  1. Параметры:

    1. тип IDWriteFontFallback* название fontFallback назначение Указатель на пользовательский объект, реализующий стратегию подбора запасных шрифтов.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Позволяет задать пользовательскую логику выбора резервного шрифта для символов, отсутствующих в основном шрифте. Если nullptr, используется системный fallback. Для получения системного объекта используется IDWriteFactory2::GetSystemFontFallback.

метод GetFontFallback:

  1. Параметры:

    1. тип IDWriteFontFallback** название fontFallback назначение Адрес указателя, по которому будет возвращен текущий объект подбора шрифтов.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получает текущий объект подбора резервных шрифтов, связанный с форматом.

IDWriteTextFormat2

Метод GetLineSpacing:

  1. Параметры:

    1. Тип DWRITE_LINE_SPACING* Название lineSpacingOptions Назначение: Указатель на структуру DWRITE_LINE_SPACING, в которую будут записаны текущие настройки интервалов (метод, значение, базовая линия).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить подробные настройки межстрочного интервала, которые были установлены методом SetLineSpacing. Расширяет функциональность старого метода IDWriteTextFormat::GetLineSpacing, возвращающего только метод, значение и смещение базовой линии.

Метод SetLineSpacing:

  1. Параметры:

    1. Тип const DWRITE_LINE_SPACING* Название lineSpacingOptions Назначение: Указатель на структуру DWRITE_LINE_SPACING, содержащую все параметры для настройки интервалов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить межстрочный интервал для всего текстового блока, используя расширенную структуру параметров. Это более гибкая и современная замена методу IDWriteTextFormat::SetLineSpacing.

IDWriteTextFormat3

Метод SetFontAxisValues:

  1. Параметры:

    1. Тип const DWRITE_FONT_AXIS_VALUE* Название fontAxisValues Назначение: Указатель на массив структур DWRITE_FONT_AXIS_VALUE, задающих теги осей и их значения.

    2. Тип UINT32 Название fontAxisValueCount Назначение: Количество элементов в массиве.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Позволяет точно настроить внешний вид переменного шрифта, задав конкретные значения для его осей.

Метод GetFontAxisValues:

  1. Параметры:

    1. Тип DWRITE_FONT_AXIS_VALUE* Название fontAxisValues Назначение: Указатель на массив, который будет заполнен значениями осей.

    2. Тип UINT32 Название fontAxisValueCount Назначение: Размер выделенного массива (должен совпадать со значением, возвращённым GetFontAxisValueCount).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить список всех пользовательских значений осей, применённых к данному текстовому формату.

Метод GetFontAxisValueCount:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: UINT32

  3. Назначение: Возвращает количество осей, для которых в формате заданы пользовательские значения. Этот результат используется для подготовки массива перед вызовом GetFontAxisValues.

Метод SetAutomaticFontAxes:

  1. Параметры:

    1. Тип DWRITE_AUTOMATIC_FONT_AXES Название automaticFontAxes Назначение: Набор флагов, определяющих, какие оси (например, оптический размер DWRITE_AUTOMATIC_FONT_AXES_OPTICAL_SIZE) должны настраиваться автоматически системой.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Включить или отключить автоматическое вычисление значений для определённых осей переменного шрифта.

Метод GetAutomaticFontAxes:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_AUTOMATIC_FONT_AXES

  3. Назначение: Получить текущий набор флагов, указывающих, какие оси шрифта настроены на автоматическое управление.

описание и функции IDWriteTextLayout

Интерфейс является более гибким вариантом IDWriteTextFormat. Включает в себя функции IDWriteTextFormat и добавляет новые. Перечисление новых:

Метод SetFontWeight:

  1. Параметры:

    1. Параметр fontWeight: тип DWRITE_FONT_WEIGHT. Назначение: Значение насыщенности шрифта из перечисления.

    2. Параметр textRange: тип DWRITE_TEXT_RANGE. Назначение: Структура, определяющая начальную позицию и длину фрагмента текста, к которому применяется стиль.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить насыщенность шрифта (например, обычный или полужирный) для заданного диапазона текста.

Метод SetUnderline:

  1. Параметры:

    1. Параметр hasUnderline: тип BOOL. Назначение: TRUE -включить подчёркивание, FALSE - выключить.

    2. Параметр textRange: тип DWRITE_TEXT_RANGE. Назначение: Диапазон текста для применения стиля.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Включить или выключить подчёркивание для заданного диапазона текста.

Метод SetDrawingEffect:

  1. Параметры:

    1. Параметр drawingEffect: тип IUnknown*. Назначение: Указатель на COM-объект, реализующий пользовательский эффект (например, кисть для цвета).

    2. Параметр textRange: тип DWRITE_TEXT_RANGE. Назначение: Диапазон текста, к которому привязывается эффект.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Привязать пользовательский объект-эффект к диапазону текста для последующего использования при отрисовке в методе Draw.

Метод GetMetrics:

  1. Параметры:

    1. Параметр textMetrics: тип DWRITE_TEXT_METRICS*. Назначение: Указатель на структуру, которая будет заполнена данными (ширина, высота, количество строк и т.д.).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить общие метрики (размеры) для всего текстового блока.

Метод GetLineMetrics:

  1. Параметры:

    1. Параметр lineMetrics: тип DWRITE_LINE_METRICS*. Назначение: Указатель на массив структур для заполнения.

    2. Параметр maxLineCount: тип UINT32. Назначение: Максимальное количество структур, которое может принять массив lineMetrics.

    3. Параметр actualLineCount: тип UINT32*. Назначение: Указатель для получения реального количества строк в макете.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить подробные метрики для каждой текстовой строки в макете.

Метод HitTestPoint:

  1. Параметры:

    1. Параметр pointX: тип FLOAT. Назначение: Координата X точки для проверки.

    2. Параметр pointY: тип FLOAT. Назначение: Координата Y точки для проверки.

    3. Параметр isTrailingHit: тип BOOL*. Назначение: Указатель для получения информации, указывает ли точка на ведущую (FALSE) или ведомую (TRUE) сторону глифа.

    4. Параметр isInside: тип BOOL*. Назначение: Указатель для получения информации, находится ли точка внутри текстового блока.

    5. Параметр hitTestMetrics: тип DWRITE_HIT_TEST_METRICS*. Назначение: Указатель на структуру для получения детальной метрики о попадании.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Определить, попадает ли точка экранных координат в область текста, и если да, то в какой символ.

Метод HitTestTextPosition:

  1. Параметры:

    1. Параметр textPosition: тип UINT32. Назначение: Индекс позиции в тексте.

    2. Параметр isTrailingHit: тип BOOL. Назначение: Указывает, относится ли позиция к ведущей (FALSE) или ведомой (TRUE) стороне глифа.

    3. Параметр pointX: тип FLOAT*. Назначение: Указатель для получения координаты X.

    4. Параметр pointY: тип FLOAT*. Назначение: Указатель для получения координаты Y.

    5. Параметр hitTestMetrics: тип DWRITE_HIT_TEST_METRICS*. Назначение: Указатель на структуру для получения метрик позиции.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить экранные координаты для заданной позиции в тексте (используется для отображения курсора или выделения).

пример IDWriteTextLayout

Объект создаётся через метод CreateTextLayout

IDWriteTextLayout* textLayout = nullptr;
std::wstring text = L"Это текст с разным форматированием";

HRESULT hr = writeFactory->CreateTextLayout(
    text.c_str(),      // Текст для компоновки
    text.length(),     // Длина текста
    formatText,        // Базовый IDWriteTextFormat
    300.0f,            // Ширина области макета (DIP)
    100.0f,            // Высота области макета (DIP)
    &textLayout        // Выходной параметр
);

Подробно о параметрах CreateTextLayout:

  1. тип const WCHAR* название text назначение указатель на исходную строку Unicode (UTF-16)

  2. тип UINT32 название length назначение количество символов в строке

  3. тип IDWriteTextFormat* название textFormat назначение базовый формат текста. Служит отправной точкой для стилей, которые можно изменить позже

  4. тип FLOAT название maxWidth назначение максимальная ширина области макета в DIP. Текст будет переноситься по словам, если его ширина превысит это значение

  5. тип FLOAT название maxHeight назначение максимальная высота области макета в DIP. Если текст не помещается, он обрезается (в зависимости от настроек SetTrimming)

  6. тип IDWriteTextLayout** название textLayout назначение указатель, по которому возвращается созданный объект

Главное преимущество IDWriteTextLayout - возможность изменять стиль для конкретных частей текста с помощью методов SetFontWeight, SetFontSize и т.д., принимающих структуру DWRITE_TEXT_RANGE.

// 1. Определяем диапазон: сделать жирным первые 6 символов
DWRITE_TEXT_RANGE boldRange = {0, 6};
textLayout->SetFontWeight(DWRITE_FONT_WEIGHT_BOLD, boldRange);

// 2. Определяем диапазон: подчеркнуть слово "форматированием"
// Допустим, слово начинается с 13-го символа и имеет длину 15 символов
DWRITE_TEXT_RANGE underlineRange = {13, 15};
textLayout->SetUnderline(TRUE, underlineRange);

Структура DWRITE_TEXT_RANGE:

typedef struct DWRITE_TEXT_RANGE {
    UINT32 startPosition; // Начальный индекс символа (с нуля)
    UINT32 length;        // Количество символов в диапазоне
} DWRITE_TEXT_RANGE;

Отрисовать созданный и отформатированный IDWriteTextLayout можно двумя основными способами:

// D2D1_POINT_2F origin = {x, y}; // Точка отрисовки (левый верхний угол макета)
pRenderTarget->DrawTextLayout(origin, textLayout, pBlackBrush);

А вот и результат:

IDWriteTextLayout1

Метод SetCharacterSpacing:

  1. Параметры:

    1. тип FLOAT название trailingSpacing назначение: Интервал (в DIP) после каждого символа в указанном диапазоне.

    2. тип FLOAT название minimumAdvanceWidth назначение: Минимальная ширина для глифа, обычно устанавливается в 0.

    3. тип DWRITE_TEXT_RANGE название textRange назначение: Диапазон текста, к которому применяются настройки интервала.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить пользовательские интервалы между символами (трекинг) для заданного диапазона текста. Положительные значения разряжают, отрицательные - сжимают текст.

Метод GetCharacterSpacing:

  1. Параметры:

    1. тип UINT32 название currentPosition назначение: Текстовая позиция для анализа.

    2. тип FLOAT* название leadingSpacing назначение: Указатель для получения значения интервала перед символом в этой позиции.

    3. тип FLOAT* название trailingSpacing назначение: Указатель для получения значения интервала после символа.

    4. тип FLOAT* название minimumAdvanceWidth назначение: Указатель для получения минимальной ширины.

    5. тип DWRITE_TEXT_RANGE* название textRange назначение: Указатель на структуру для получения диапазона, где действует это форматирование (может быть nullptr).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить параметры интервалов между символами, примененные к тексту в указанной позиции.

Метод SetPairKerning:

  1. Параметры:

    1. тип BOOL название isPairKerningEnabled назначение: Флаг включения (TRUE) или отключения (FALSE) парного кернинга.

    2. тип DWRITE_TEXT_RANGE название textRange назначение: Диапазон текста, к которому применяется настройка.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Включить или отключить автоматическую корректировку расстояния между определенными парами символов (например, "AV") для улучшения визуального восприятия.

Метод GetPairKerning:

  1. Параметры:

    1. тип UINT32 название currentPosition назначение: Текстовая позиция для проверки.

    2. тип BOOL* название isPairKerningEnabled назначение: Указатель для получения состояния кернинга (TRUE/FALSE) в этой позиции.

    3. тип DWRITE_TEXT_RANGE* название textRange назначение: Указатель на структуру для получения диапазона действия форматирования (может быть nullptr).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Определить, включен ли парный кернинг для текста в указанной позиции.

IDWriteTextLayout2

Метод SetFontFallback:

  1. Параметры:

    1. Тип IDWriteFontFallback* Название fontFallback Назначение: Указатель на объект, реализующий стратегию подбора резервного шрифта. Может быть nullptr.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить пользовательский механизм подбора резервных шрифтов для всего макета.

Метод GetFontFallback:

  1. Параметры:

    1. Тип IDWriteFontFallback** Название fontFallback Назначение: Указатель для получения адреса текущего объекта резервного шрифта.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить текущий объект механизма подбора резервных шрифтов.

Метод SetLastLineWrapping:

  1. Параметры:

    1. Тип BOOL Название isLastLineWrappingEnabled Назначение: Флаг, разрешающий (TRUE) или запрещающий (FALSE) перенос слов в последней строке абзаца.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Управлять поведением переноса последней строки текста.

Метод GetLastLineWrapping:

  1. Параметры:

    1. Тип BOOL* Название isLastLineWrappingEnabled Назначение: Указатель для получения состояния опции переноса последней строки.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Проверить, разрешен ли перенос в последней строке.

Метод GetMetrics:

  1. Параметры:

    1. Тип DWRITE_TEXT_METRICS1* Название textMetrics Назначение: Указатель на структуру для получения расширенных метрик макета.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить подробные метрики для всего текстового блока. Это расширенная версия метода GetMetrics из IDWriteTextLayout.

IDWriteTextLayout3

Интерфейс IDWriteTextLayout3 наследует все методы от IDWriteTextLayout2. Он добавляет новые возможности для работы с цветными шрифтами (например, формата COLR) и предоставляет более точный контроль над межстрочным интервалом.

Метод GetLineSpacing:

  1. Параметры:

    1. Тип DWRITE_LINE_SPACING_METHOD* Название lineSpacingMethod Назначение: Указатель для получения текущего метода расчета межстрочного интервала.

    2. Тип FLOAT* Название lineSpacing Назначение: Указатель для получения значения межстрочного интервала.

    3. Тип FLOAT* Название baseline Назначение: Указатель для получения значения базовой линии.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить текущие настройки межстрочного интервала. Обратите внимание: это перегруженный (overloaded) метод. Он имеет то же имя, что и метод в IDWriteTextFormat, но другую сигнатуру (параметры) и используется для получения актуальных значений из рассчитанного макета, а не из исходного формата.

Метод SetLineSpacing:

  1. Параметры:

    1. Тип const DWRITE_LINE_SPACING* Название lineSpacingOptions Назначение: Указатель на структуру, содержащую все параметры для настройки межстрочного интервала (метод, значение, базовую линию).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить межстрочный интервал для всего текстового макета, используя расширенную структуру параметров. Это новый метод с новой сигнатурой, добавленный в IDWriteTextLayout3.

Метод GetFontAxisValue:

  1. Параметры:

    1. Тип UINT32 Название currentPosition Назначение: Позиция в тексте для проверки.

    2. Тип DWRITE_FONT_AXIS_TAG Название fontAxisTag Назначение: Тег (идентификатор) оси переменного шрифта, значение которой нужно получить (например, DWRITE_FONT_AXIS_TAG_WEIGHT).

    3. Тип FLOAT* Название fontAxisValue Назначение: Указатель для получения числового значения запрошенной оси.

    4. Тип DWRITE_TEXT_RANGE* Название textRange Назначение: Указатель на структуру для получения диапазона, где действует это значение (может быть nullptr).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить значение конкретной оси (например, толщины, ширины, наклона) переменного шрифта, примененное к тексту в указанной позиции.

Метод SetFontAxisValues:

  1. Параметры:

    1. Тип const DWRITE_FONT_AXIS_VALUE* Название fontAxisValues Назначение: Указатель на массив структур, задающих значения осей переменного шрифта.

    2. Тип UINT32 Название fontAxisValueCount Назначение: Количество элементов в массиве fontAxisValues.

    3. Тип DWRITE_TEXT_RANGE Название textRange Назначение: Диапазон текста, к которому применяются настройки осей.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Установить значения осей для переменного шрифта в указанном диапазоне текста, позволяя точно настраивать его внешний вид (делать полужирным, узким и т.д.).

Метод GetAutomaticFontAxes:

  1. Параметры:

    1. Тип DWRITE_AUTOMATIC_FONT_AXES* Название automaticFontAxes Назначение: Указатель для получения флагов, указывающих, какие оси (например, оптический размер) настраиваются автоматически.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Определить, какие оси переменного шрифта настроены на автоматическое вычисление системой.

Метод SetAutomaticFontAxes:

  1. Параметры:

    1. Тип DWRITE_AUTOMATIC_FONT_AXES Название automaticFontAxes Назначение: Набор флагов, определяющих, какие оси переменного шрифта должны настраиваться автоматически.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Включить или выключить автоматическое вычисление значений для определенных осей переменного шрифта (например, для оптического размера DWRITE_AUTOMATIC_FONT_AXES_OPTICAL_SIZE).

IDWriteTextLayout4  просто унаследован от IDWriteTextLayout3 и работает с Windows 10 билд 16299 .

описание и функции IDWriteTypography

По

Метод AddFontFeature:

  1. Параметры:

    1. Тип DWRITE_FONT_FEATURE Название fontFeature Назначение: Структура, содержащая идентификатор (тег) функции OpenType (например, для стилистических альтернатив 'salt') и параметр её выполнения (обычно 1 для включения) .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавить одну функцию OpenType (например, включить лигатуры или старомодные цифры) в коллекцию функций данного объекта IDWriteTypography .

Метод GetFontFeature:

  1. Параметры:

    1. Тип UINT32 Название fontFeatureIndex Назначение: Индекс (начиная с 0) функции, которую нужно получить из списка, добавленного через AddFontFeature .

    2. Тип DWRITE_FONT_FEATURE* Название fontFeature Назначение: Указатель на структуру, которая будет заполнена данными о запрошенной функции шрифта при успешном выполнении метода .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить параметры функции OpenType по её индексу в списке, хранящемся в объекте IDWriteTypography.

Метод GetFontFeatureCount:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение: UINT32

  3. Назначение: Получить общее количество функций OpenType, которые были добавлены в данный объект IDWriteTypography с помощью метода AddFontFeature .

пример IDWriteTypography

тот же код что и с IDWriteTextLayout , только добавляем:

IDWriteTypography* typography = nullptr; 
writeFactory->CreateTypography(&typography);
    typography->AddFontFeature(DWRITE_FONT_FEATURE{
       DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_7, // Идентификатор признака
       1                                        // Включить (1) или выключить (0)
        });

    DWRITE_TEXT_RANGE range = { 0, UINT_MAX };
    textLayout->SetTypography(typography, range);

Объект создаётся через метод CreateTypography. Основная работа заключается в добавлении в него конкретных типографских признаков. И дальше установка типографии IDWriteTextLayout

метод AddFontFeature:

  1. Параметры:

    1. тип флаг DWRITE_FONT_FEATURE назначение Структура, описывающая один типографский признак OpenType. Варианты:
      от DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_1 до DWRITE_FONT_FEATURE_TAG_STYLISTIC_SET_20 - Включает стилистический набор символов (альтернативные глифы).

      DWRITE_FONT_FEATURE_TAG_STYLISTIC_ALTERNATES - Общий тэг для стилистических альтернатив.

      DWRITE_FONT_FEATURE_TAG_HISTORICAL_FORMS - Включает исторические формы символов. "ſ" вместо "s"

      DWRITE_FONT_FEATURE_TAG_SWASH - Декоративные завершающие штрихи (Swash)

      DWRITE_FONT_FEATURE_TAG_TITLING_CAPITALS - Специальные заглавные для заголовков.

      DWRITE_FONT_FEATURE_TAG_OLD_STYLE_FIGURES - Старостильные цифры с разной высотой. "123" выглядит более органично в тексте.

      DWRITE_FONT_FEATURE_TAG_LINING_FIGURES - Выровненные (моноширинные) цифры. "123" для таблиц

      DWRITE_FONT_FEATURE_TAG_STANDARD_LIGATURES - Стандартные лигатуры (fi, fl)

      DWRITE_FONT_FEATURE_TAG_HISTORICAL_LIGATURES - Исторические лигатуры (ct, st)

      DWRITE_FONT_FEATURE_TAG_CONTEXTUAL_LIGATURES - Контекстные лигатуры, зависящие от окружения

    2. bool тип включить или выключить

Созданный объект IDWriteTypography применяется к уже существующему макету текста (IDWriteTextLayout) через метод SetTypography. Важно: эффект применяется только к указанному диапазону текста.

метод SetTypography:

  1. тип IDWriteTypography* название typography описание Созданный объект с типографскими признаками

  2. тип флаг DWRITE_TEXT_RANGE название textRange описание диапазон текста, к которому применяется оформление

зависимость от шрифта: Типографские эффекты работают только если они поддерживаются текущим шрифтом. Например, Swash-эффекты есть в Gabriola, но отсутствуют в Arial.
В общем просто некоторые визуальные изменения.

описание и функции IDWriteFontCollection

Интерфейс IDWriteFontCollection представляет коллекцию семейств шрифтов и служит основой для поиска и перечисления шрифтов в системе или в пользовательском наборе

Метод GetFontFamilyCount:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: UINT32

  3. Назначение: Получить общее количество семейств шрифтов, содержащихся в данной коллекции.

Метод GetFontFamily:

  1. Параметры:

    1. Тип UINT32 Название index Назначение: Индекс (начиная с 0) семейства шрифтов, которое нужно получить из коллекции.

    2. Тип IDWriteFontFamily** Название fontFamily Назначение: Указатель, по которому будет возвращен адрес объекта семейства шрифтов (IDWriteFontFamily) при успешном выполнении.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить объект, представляющий семейство шрифтов по его индексу в коллекции.

Метод FindFamilyName:

  1. Параметры:

    1. Тип const WCHAR* Название familyName Назначение: Указатель на строку, содержащую имя искомого семейства шрифтов.

    2. Тип UINT32* Название index Назначение: Указатель, по которому будет записан индекс найденного семейства в коллекции.

    3. Тип BOOL* Название exists Назначение: Указатель, по которому будет записан результат поиска (TRUE - семейство найдено, FALSE - не найдено).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Найти семейство шрифтов по его имени в коллекции. Метод возвращает индекс семейства, если оно было найдено.

Метод GetFontFromFontFace:

  1. Параметры:

    1. Тип IDWriteFontFace* Название fontFace Назначение: Указатель на объект лица шрифта (IDWriteFontFace), для которого нужно найти соответствующий объект шрифта в коллекции.

    2. Тип IDWriteFont** Название font Назначение: Указатель, по которому будет возвращен адрес объекта шрифта (IDWriteFont) при успешном выполнении.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Найти и получить объект шрифта (IDWriteFont), соответствующий переданному объекту лица шрифта (IDWriteFontFace) в рамках данной коллекции. Это ключевой метод для сопоставления низкоуровневых объектов отрисовки с логическими шрифтами в коллекции.

IDWriteFontCollection1

Интерфейс IDWriteFontCollection1 наследует все методы от базового интерфейса IDWriteFontCollection (который, в свою очередь, наследует от IUnknown) и добавляет один новый метод для доступа к низкоуровневой структуре данных шрифтов.

Метод GetFontSet:

  1. Параметры:

    1. Тип IDWriteFontSet** Название fontSet Назначение: Указатель, по адресу которого будет возвращен интерфейс IDWriteFontSet, представляющий базовый набор шрифтов данной коллекции .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить прямой доступ к объекту набора шрифтов (IDWriteFontSet), лежащему в основе этой коллекции. IDWriteFontSet предоставляет более гибкий и мощный API для запросов, фильтрации и перечисления шрифтов по их свойствам .

IDWriteFontCollection2

Интерфейс IDWriteFontCollection2 наследует все методы от базового интерфейса IDWriteFontCollection1. Он добавляет новые методы для работы с переменными шрифтами, предоставляя доступ к продвинутым возможностям, таким как поиск шрифтов по значениям осей и получение обновлённой модели набора шрифтов

Метод GetFontFamily:

  1. Параметры:

    1. Тип UINT32 Название index Назначение: Нулевой индекс семейства шрифтов в коллекции.

    2. Тип IDWriteFontFamily2** Название family Назначение: Указатель для получения адреса объекта семейства шрифтов версии IDWriteFontFamily2.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить объект семейства шрифтов по его индексу в коллекции. Это обновлённая версия метода из IDWriteFontCollection1, возвращающая интерфейс IDWriteFontFamily2.

Метод GetMatchingFonts:

  1. Параметры:

    1. Тип const WCHAR* Название familyname Назначение: Указатель на строку с именем семейства шрифтов для поиска.

    2. Тип const DWRITE_FONT_AXIS_VALUE* Название axis_values Назначение: Указатель на массив значений осей переменного шрифта (например, толщины wght, ширины wdth).

    3. Тип UINT32 Название num_values Назначение: Количество элементов в массиве axis_values.

    4. Тип IDWriteFontList2** Название fontlist Назначение: Указатель для получения адреса объекта списка шрифтов, ранжированных по соответствию заданным параметрам.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить ранжированный список шрифтов из указанного семейства, которые наилучшим образом соответствуют заданным значениям осей переменного шрифта.

Метод GetFontFamilyModel:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_FONT_FAMILY_MODEL

  3. Назначение: Получить модель группировки семейств шрифтов (например, типографическую или по весу-растяжению-стилю), используемую данной коллекцией.

Метод GetFontSet:

  1. Параметры:

    1. Тип IDWriteFontSet1** Название fontset Назначение: Указатель для получения адреса объекта базового набора шрифтов версии IDWriteFontSet1.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить интерфейс IDWriteFontSet1, представляющий собой базовый набор шрифтов, на котором построена данная коллекция. Это обновлённая версия метода из IDWriteFontCollection1, возвращающая интерфейс IDWriteFontSet1.

DWriteFontCollection3

Интерфейс IDWriteFontCollection3 наследует все методы от базового интерфейса IDWriteFontCollection2 и добавляет один новый метод для отслеживания актуальности системной коллекции шрифтов

Метод GetExpirationEvent:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение:HANDLE
    Дескриптор события (event handle). Возвращает валидный дескриптор, если метод вызван для системного набора шрифтов, который может устареть. Возвращает nullptr, если метод вызван для пользовательской коллекции шрифтов.

  3. Назначение:
    Получить дескриптор события, которое сигнализирует о том, что системная коллекция шрифтов устарела (например, после установки, удаления или обновления шрифтов в системе). Приложение должно обработать это событие, чтобы получить обновлённую коллекцию и обеспечить корректное отображение текста.

  4. Важное примечание:
    Не следует закрывать (CloseHandle) возвращённый дескриптор вручную. Дескриптор управляется самим объектом коллекции шрифтов и остаётся валидным, пока существует ссылка на этот объект

описание и функции IDWriteFontSetBuilder

Интерфейс IDWriteFontSetBuilder используется для создания пользовательских наборов шрифтов (IDWriteFontSet) путём добавления отдельных ссылок на шрифты (IDWriteFontFaceReference) или объединения существующих наборов

Метод AddFontFaceReference:

  1. Параметры:

    1. Тип IDWriteFontFaceReference* Название fontFaceReference Назначение: Объект ссылки на шрифт для добавления в набор.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавить одну ссылку на шрифт в создаваемый набор. Необходимые метаданные шрифта будут автоматически извлечены позднее при вызове метода CreateFontSet.

Метод AddFontSet:

  1. Параметры:

    Примечание о доступности информации: Точные параметры этого метода не были получены из результатов поиска, так как доступ к полной странице документации требует авторизации. На основании описания метод принимает один параметр - указатель на интерфейс IDWriteFontSet.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавить все шрифты из существующего набора (IDWriteFontSet) в создаваемый набор, позволяя объединять наборы или расширять существующие.

Метод CreateFontSet:

  1. Параметры:

    1. Тип IDWriteFontSet** Название fontSet Назначение: Указатель, по которому будет возвращён адрес созданного объекта набора шрифтов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Создать и вернуть финальный объект набора шрифтов (IDWriteFontSet) из всех ссылок на шрифты, добавленных с помощью AddFontFaceReference. Создание проходит быстрее, если ссылки добавлялись с предварительно указанными метаданными

пример IDWriteFontSetBuilder

Объект создаётся через метод CreateFontSetBuilder фабрики IDWriteFactory5.

IDWriteFactory5* factory5 = nullptr;
writeFactory->QueryInterface(__uuidof(IDWriteFactory5), (void**)&factory5);

// Создаём построитель набора шрифтов
IDWriteFontSetBuilder* fontSetBuilder = nullptr;
HRESULT hr = factory5->CreateFontSetBuilder(&fontSetBuilder);

Добавление пользовательского шрифта из файла:

// Создаём ссылку на файл шрифта
IDWriteFontFaceReference* fontRef = nullptr;
factory5->CreateFontFaceReference(
    L"C:\\Fonts\\CustomFont.ttf", // Путь к файлу
    0,                            // Индекс лица в файле (обычно 0)
    DWRITE_FONT_SIMULATIONS_NONE, // Симуляции (жирный, курсив)
    &fontRef
);

// Добавляем ссылку в построитель
fontSetBuilder->AddFontFaceReference(fontRef);

fontRef->Release();

//После добавления всех нужных
// Создаём финальный набор шрифтов
IDWriteFontSet* customFontSet = nullptr;
fontSetBuilder->CreateFontSet(&customFontSet);

// Теперь customFontSet можно использовать для создания форматов текста
IDWriteTextFormat3* textFormat = nullptr;
factory5->CreateTextFormat(L"MyCustomFont", customFontSet, ...);

// Освобождаем ресурсы
customFontSet->Release();
fontSetBuilder->Release();
factory5->Release();
IDWriteFontSetBuilder1

Метод AddFontFile:

  1. Параметры:

    1. Тип IDWriteFontFile* Название fontFile Назначение: Указатель на объект файла шрифта (IDWriteFontFile), который нужно добавить в набор. Метод проанализирует файл, чтобы определить содержащиеся в нём шрифты и их свойства.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавить ссылки на все шрифты, содержащиеся в указанном файле шрифтов, в создаваемый набор. Если файл не является поддерживаемым файлом шрифта OpenType, метод вернёт ошибку DWRITE_E_FILEFORMAT.

IDWriteFontSetBuilder2

Метод AddFont

  1. Параметры:
    Уточнить точный список параметров не удалось из-за ограничения доступа к странице документации .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавляет один шрифт в создаваемый набор

Метод AddFontFile

  1. Параметры:
    Уточнить точный список параметров не удалось из-за ограничения доступа к странице документации .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Добавляет ссылки на все шрифты, содержащиеся в указанном файле шрифтов, в создаваемый набор. Метод самостоятельно анализирует файл, чтобы определить шрифты и их свойства

описание и функции IDWriteInlineObject

Интерфейс IDWriteInlineObject предназначен для встраивания в текст графических элементов, управляемых приложением, и позволяет DirectWrite работать с ними, как со встроенными символами (глифами)

Метод Draw :

  1. Параметры:

    1. Тип void* Название clientDrawingContext Назначение: Контекст рисования, переданный в IDWriteTextLayout::Draw.

    2. Тип IDWriteTextRenderer* Название renderer Назначение: Рендерер, используемый для отрисовки текста. Может быть полезен для вложенных макетов.

    3. Тип FLOAT Название originX Назначение: X-координата верхнего левого угла для отрисовки объекта.

    4. Тип FLOAT Название originY Назначение: Y-координата верхнего левого угла для отрисовки объекта.

    5. Тип BOOL Название isSideways Назначение: Флаг, указывающий, повёрнут ли объект (базовая линия объекта идёт вдоль оси строки).

    6. Тип BOOL Название isRightToLeft Назначение: Флаг, указывающий, находится ли объект в контексте письма справа-налево и должен быть отрисован зеркально.

    7. Тип IUnknown* Название clientDrawingEffect Назначение: Эффект рисования (например, кисть), установленный через IDWriteTextLayout::SetDrawingEffect.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Реализовать логику отрисовки вашего графического объекта (например, растрового изображения, фигуры) в заданных координатах с учётом контекста.

Метод GetMetrics :

  1. Параметры:

    1. Тип DWRITE_INLINE_OBJECT_METRICS* Название metrics Назначение: Указатель на структуру, в которую нужно записать метрики объекта (ширина, высота, базовая линия).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Вернуть физические размеры объекта, чтобы текстовый макет мог корректно выделить для него место в строке.

Метод GetOverhangMetrics :

  1. Параметры:

    1. Тип DWRITE_OVERHANG_METRICS* Название overhangs Назначение: Указатель на структуру, в которую нужно записать размеры выступов объекта с четырёх сторон.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Указать, насколько объект визуально выходит за пределы прямоугольника, заданного в GetMetrics. Это влияет на взаимодействие с соседним текстом или объектами.

Метод GetBreakConditions :

  1. Параметры:

    1. Тип DWRITE_BREAK_CONDITION* Название breakConditionBefore Назначение: Указатель для возврата условия переноса строки перед объектом.

    2. Тип DWRITE_BREAK_CONDITION* Название breakConditionAfter Назначение: Указатель для возврата условия переноса строки после объекта.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Сообщить механизму расстановки переносов строк, можно ли разрывать строку непосредственно до или после этого объекта.

пример IDWriteInlineObject

Для использования необходимо создать объект, реализующий интерфейс IDWriteInlineObject, и установить его в IDWriteTextLayout

class CustomInlineObject : public IDWriteInlineObject {
public:
    // Конструктор, деструктор, IUnknown методы (AddRef, Release, QueryInterface)...

    // Основные методы IDWriteInlineObject:
    STDMETHOD(Draw)(
        void* clientDrawingContext,
        IDWriteTextRenderer* renderer,
        FLOAT originX,
        FLOAT originY,
        BOOL isSideways,
        BOOL isRightToLeft,
        IUnknown* clientDrawingEffect
    ) override;
    
    STDMETHOD(GetMetrics)(
        DWRITE_INLINE_OBJECT_METRICS* metrics
    ) override;
    
    STDMETHOD(GetOverhangMetrics)(
        DWRITE_OVERHANG_METRICS* overhangs
    ) override;
    
    STDMETHOD(GetBreakConditions)(
        DWRITE_BREAK_CONDITION* breakConditionBefore,
        DWRITE_BREAK_CONDITION* breakConditionAfter
    ) override;
};

Объект добавляется в IDWriteTextLayout методом SetInlineObject

Детали реализации методов:

GetMetrics - Определение размеров

//GetMetrics — Определение размеров
HRESULT CustomInlineObject::GetMetrics(DWRITE_INLINE_OBJECT_METRICS* metrics) {
    metrics->width = 50.0f;   // Ширина в DIP
    metrics->height = 20.0f;  // Высота в DIP
    metrics->baseline = 16.0f; // Расстояние от верха до базовой линии
    metrics->supportsSideways = FALSE; // Поддержка вертикальной ориентации
    return S_OK;
}

Draw - Отрисовка содержимого

HRESULT CustomInlineObject::Draw(
    void* clientDrawingContext,
    IDWriteTextRenderer* renderer,
    FLOAT originX, FLOAT originY,
    BOOL isSideways, BOOL isRightToLeft,
    IUnknown* clientDrawingEffect)
{
    // Приводим контекст к ожидаемому типу (например, ID2D1RenderTarget*)
    ID2D1RenderTarget* rt = static_cast<ID2D1RenderTarget*>(clientDrawingContext);
    
    // Рисуем прямоугольник на месте объекта
    D2D1_RECT_F rect = D2D1::RectF(originX, originY, originX + 50.0f, originY + 20.0f);
    rt->FillRectangle(rect, brush);
    
    // Или выводим изображение, используя предварительно созданный ID2D1Bitmap
    // rt->DrawBitmap(pBitmap, rect);
    
    return S_OK;
}

GetOverhangMetrics - Определение выступов

HRESULT GetOverhangMetrics(DWRITE_OVERHANG_METRICS* overhangs) {
    overhangs->left = 0.0f;
    overhangs->top = 0.0f;
    overhangs->right = 0.0f; // Положительное значение = выход за правую границу
    overhangs->bottom = 0.0f;
    return S_OK;
}

GetBreakConditions - Условия разрыва строк

HRESULT GetBreakConditions(
    DWRITE_BREAK_CONDITION* breakConditionBefore,
    DWRITE_BREAK_CONDITION* breakConditionAfter)
{
    // Разрешён разрыв строки до и после объекта
    *breakConditionBefore = DWRITE_BREAK_CONDITION_NEUTRAL;
    *breakConditionAfter = DWRITE_BREAK_CONDITION_NEUTRAL;
    return S_OK;
}

Пример кастомного разделителя:

class SeparatorInlineObject : public IDWriteInlineObject {
public:
    HRESULT GetMetrics(DWRITE_INLINE_OBJECT_METRICS* metrics) override {
        metrics->width = 100.0f;  // Ширина разделителя
        metrics->height = 2.0f;   // Высота линии
        metrics->baseline = 1.0f; // Линия посередине высоты текста
        return S_OK;
    }
    
    HRESULT Draw(void* context, ...) override {
        ID2D1RenderTarget* rt = (ID2D1RenderTarget*)context;
        // Рисуем горизонтальную линию
        rt->DrawLine(D2D1::Point2F(originX, originY + 1.0f),
                     D2D1::Point2F(originX + 100.0f, originY + 1.0f),
                     brush, 2.0f);
        return S_OK;
    }
};
описание и функции IDWriteTextAnalyzer

Интерфейс IDWriteTextAnalyzer является центральным компонентом для комплексного анализа текста в DirectWrite. Он выполняет ключевые задачи, такие как определение свойств символов, разбиение на скрипты, анализ направления письма и предоставление информации о форме глифов

Метод AnalyzeScript:

  1. Параметры:

    1. Тип IDWriteTextAnalysisSource* Название analysisSource Назначение: Источник текста для анализа.

    2. Тип UINT32 Название textPosition Назначение: Начальная позиция анализа в тексте.

    3. Тип UINT32 Название textLength Назначение: Длина анализируемого текста.

    4. Тип IDWriteTextAnalysisSink* Название analysisSink Назначение: Приёмник результатов анализа скриптов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Проанализировать текст и определить границы скриптов (систем письменности), возвращая результаты через analysisSink

Метод GetGlyphs:

  1. Параметры:

    1. Тип const WCHAR* Название textString Назначение: Строка текста для преобразования.

    2. Тип UINT32 Название textLength Назначение: Длина строки.

    3. Тип IDWriteFontFace* Название fontFace Назначение: Объект гарнитуры для маппинга символов на глифы.

    4. Тип BOOL Название isSideways Назначение: Флаг вертикальной ориентации текста.

    5. Тип BOOL Название isRightToLeft Назначение: Флаг направления письма справа-налево.

    6. Тип const DWRITE_SCRIPT_ANALYSIS* Название scriptAnalysis Назначение: Результаты анализа скрипта для текста.

    7. Тип const WCHAR* Название localeName Назначение: Имя локали для лингвистической обработки.

    8. Тип IDWriteNumberSubstitution* Название numberSubstitution Назначение: Объект для подстановки числовых форм.

    9. Тип const DWRITE_TYPOGRAPHIC_FEATURES** Название features Назначение: Массив типографских особенностей.

    10. Тип const UINT32* Название featureRangeLengths Назначение: Длины диапазонов для особенностей.

    11. Тип UINT32 Название featureRanges Назначение: Количество диапазонов.

    12. Тип UINT32 Название maxGlyphCount Назначение: Максимальное количество глифов в буфере.

    13. Тип UINT16* Название clusterMap Назначение: Буфер для отображения символов на кластеры.

    14. Тип DWRITE_SHAPING_TEXT_PROPERTIES* Название textProps Назначение: Буфер для свойств текста при формировании.

    15. Тип UINT16* Название glyphIndices Назначение: Буфер для индексов глифов.

    16. Тип DWRITE_SHAPING_GLYPH_PROPERTIES* Название glyphProps Назначение: Буфер для свойств глифов.

    17. Тип UINT32* Название actualGlyphCount Назначение: Указатель для возврата реального количества глифов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Преобразовать строку символов в последовательность индексов глифов, выполнив сложный процесс шейпинга с учетом скрипта, локали и типографских особенностей.

Метод GetGdiCompatibleGlyphPlacements:

  1. Параметры:

    1. Тип const WCHAR* Название textString Назначение: Исходная текстовая строка.

    2. Тип const UINT16* Название clusterMap Назначение: Отображение кластеров из GetGlyphs.

    3. Тип DWRITE_SHAPING_TEXT_PROPERTIES* Название textProps Назначение: Свойства текста из GetGlyphs.

    4. Тип UINT32 Название textLength Назначение: Длина текста.

    5. Тип const UINT16* Название glyphIndices Назначение: Индексы глифов из GetGlyphs.

    6. Тип const DWRITE_SHAPING_GLYPH_PROPERTIES* Название glyphProps Назначение: Свойства глифов из GetGlyphs.

    7. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    8. Тип IDWriteFontFace* Название fontFace Назначение: Гарнитура для расстановки.

    9. Тип FLOAT Название fontEmSize Назначение: Размер шрифта в em.

    10. Тип BOOL Название isSideways Назначение: Флаг вертикальной ориентации.

    11. Тип BOOL Название isRightToLeft Назначение: Флаг направления письма.

    12. Тип const DWRITE_MATRIX* Название transform Назначение: Матрица преобразования для GDI-совместимости.

    13. Тип BOOL Название useGdiNatural Назначение: Использовать естественное размещение GDI.

    14. Тип BOOL Название useGdiClipped Назначение: Использовать обрезанное размещение GDI.

    15. Тип const DWRITE_SCRIPT_ANALYSIS* Название scriptAnalysis Назначение: Анализ скрипта.

    16. Тип const WCHAR* Название localeName Назначение: Имя локали.

    17. Тип const DWRITE_TYPOGRAPHIC_FEATURES** Название features Назначение: Особенности типографики.

    18. Тип const UINT32* Название featureRangeLengths Назначение: Длины диапазонов особенностей.

    19. Тип UINT32 Название featureRanges Назначение: Количество диапазонов.

    20. Тип FLOAT* Название glyphAdvances Назначение: Буфер для ширин глифов.

    21. Тип DWRITE_GLYPH_OFFSET* Название glyphOffsets Назначение: Буфер для смещений глифов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Рассчитать позиции глифов с возможностью совместимости с GDI, включая матрицы преобразования и дополнительные флаги для точного соответствия.

Метод AnalyzeBidi:

  1. Параметры:

    1. Тип IDWriteTextAnalysisSource* Название analysisSource Назначение: Источник текста.

    2. Тип UINT32 Название textPosition Назначение: Начальная позиция анализа.

    3. Тип UINT32 Название textLength Назначение: Длина анализируемого текста.

    4. Тип IDWriteTextAnalysisSink* Название analysisSink Назначение: Приёмник результатов анализа.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Проанализировать двунаправленный текст и определить уровни встраивания для символов, возвращая результаты через analysisSink.

Метод AnalyzeNumberSubstitution:

  1. Параметры:

    1. Тип IDWriteTextAnalysisSource* Название analysisSource Назначение: Источник текста.

    2. Тип UINT32 Название textPosition Назначение: Начальная позиция анализа.

    3. Тип UINT32 Название textLength Назначение: Длина анализируемого текста.

    4. Тип IDWriteTextAnalysisSink* Название analysisSink Назначение: Приёмник результатов анализа.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Проанализировать текст и применить правила подстановки чисел в соответствии с локалью, возвращая результаты через analysisSink.

Метод AnalyzeLineBreakpoints:

  1. Параметры:

    1. Тип IDWriteTextAnalysisSource* Название analysisSource Назначение: Источник текста.

    2. Тип UINT32 Название textPosition Назначение: Начальная позиция анализа.

    3. Тип UINT32 Название textLength Назначение: Длина анализируемого текста.

    4. Тип IDWriteTextAnalysisSink* Название analysisSink Назначение: Приёмник результатов анализа.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Проанализировать текст на наличие возможных точек разрыва строк, возвращая позиции и типы разрывов через analysisSink.

пример IDWriteTextAnalyzer

Объект создаётся через фабрику IDWriteFactory. Это корневой объект для анализа текста. Один IDWriteTextAnalyzer можно переиспользовать для анализа разных текстов. После завершения работы его нужно освободить (Release()).

IDWriteTextAnalyzer* textAnalyzer = nullptr;
HRESULT hr = writeFactory->CreateTextAnalyzer(&textAnalyzer);

AnalyzeScript - Анализ скриптов и направления текста
Определяет границы скриптов (кириллица, латиница, арабский и т.д.) и направление письма (слева-направо, справа-налево).

DWRITE_SCRIPT_ANALYSIS scriptAnalysis;
UINT32 scriptLength = 0;

hr = textAnalyzer->AnalyzeScript(
    this,               // Контекст обратного вызова (IDWriteTextAnalysisSource*)
    0,                  // Начальная позиция в тексте
    textLength,         // Длина текста
    this,               // Приёмник результатов (IDWriteTextAnalysisSink*)
    &scriptAnalysis,    // Результат: информация о скрипте
    &scriptLength       // Результат: длина текущего скрипта
);
typedef struct DWRITE_SCRIPT_ANALYSIS {
    UINT16 script;       // Идентификатор скрипта (например, латиница=0)
    DWRITE_SCRIPT_SHAPES shapes; // Формы глифов (DWRITE_SCRIPT_SHAPES_DEFAULT)
} DWRITE_SCRIPT_ANALYSIS;

AnalyzeBidi - Анализ двунаправленного текста
Определяет границы направлений текста (LTR/RTL). Критически важен для смешанных текстов (например, английский + арабский).

UINT32 bidiLength = 0;
hr = textAnalyzer->AnalyzeBidi(this, 0, textLength, this, &bidiLength);

AnalyzeNumberSubstitution - Анализ подстановки чисел
Определяет, как форматируются цифры (арабские, европейские и т.д.) в зависимости от контекста.

UINT32 numberLength = 0;
hr = textAnalyzer->AnalyzeNumberSubstitution(this, 0, textLength, this, &numberLength);

AnalyzeLineBreakpoints - Анализ точек переноса
Находит возможные места разрыва строк (пробелы, дефисы, правила языка).

DWRITE_LINE_BREAKPOINT* breakpoints = new DWRITE_LINE_BREAKPOINT[textLength];
hr = textAnalyzer->AnalyzeLineBreakpoints(this, 0, textLength, this, breakpoints);
typedef struct DWRITE_LINE_BREAKPOINT {
    UINT8 breakConditionBefore  : 2; // Условие разрыва ДО символа
    UINT8 breakConditionAfter   : 2; // Условие разрыва ПОСЛЕ символа
    UINT8 isWhitespace          : 1; // Является ли символ пробельным
    UINT8 isSoftHyphen          : 1; // Мягкий перенос
    UINT8 padding               : 2; // Зарезервировано
} DWRITE_LINE_BREAKPOINT;
IDWriteTextAnalyzer1

IDWriteTextAnalyzer1 наследует все методы от базового интерфейса IDWriteTextAnalyzer. Он добавляет новые функции для расширенной обработки сложных скриптов, включая анализ ориентации глифов, управление интервалами, выравнивание текста и анализ свойств шрифтов

Метод AnalyzeVerticalGlyphOrientation:

  1. Параметры (синтаксис полной сигнатуры из заголовочного файла недоступен):

    • Предполагаемые основные параметры: analysisSource, textPosition, textLength, analysisSink.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Анализирует диапазон текста для определения ориентации скрипта и глифов, передавая результаты обратному вызову SetGlyphOrientation в приёмнике.

Метод GetGlyphOrientationTransform:

  1. Параметры (синтаксис полной сигнатуры из заголовочного файла недоступен):

    • Предполагаемые параметры: могут включать угол ориентации и матрицу преобразования.

  2. Возвращаемое значение: DWRITE_MATRIX (матрица 2x3) .

  3. Назначение: Возвращает матрицу преобразования для отрисовки последовательности глифов с учётом заданного угла ориентации.

Метод ApplyCharacterSpacing:

  1. Параметры :

    1. Тип FLOAT Название leadingSpacing Назначение: Интервал, добавляемый перед каждым символом.

    2. Тип FLOAT Название trailingSpacing Назначение: Интервал, добавляемый после каждого символа.

    3. Тип FLOAT Название minimumAdvanceWidth Назначение: Минимальная ширина продвижения для символа.

    4. Тип UINT32 Название textLength Назначение: Длина текста.

    5. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    6. Тип const UINT16* Название clusterMap Назначение: Маппинг символов на кластеры глифов.

    7. Тип const FLOAT* Название glyphAdvances Назначение: Массив исходных ширин глифов.

    8. Тип const DWRITE_GLYPH_OFFSET* Название glyphOffsets Назначение: Массив исходных смещений глифов.

    9. Тип const DWRITE_SHAPING_GLYPH_PROPERTIES* Название glyphProperties Назначение: Свойства глифов.

    10. Тип FLOAT* Название modifiedGlyphAdvances Назначение: Выходной массив скорректированных ширин глифов.

    11. Тип DWRITE_GLYPH_OFFSET* Название modifiedGlyphOffsets Назначение: Выходной массив скорректированных смещений глифов.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Корректно применяет межсимвольный интервал, настраивая кластеры глифов и позиции диакритических знаков

Метод GetJustificationOpportunities:

  1. Параметры (синтаксис полной сигнатуры из заголовочного файла недоступен):

    • Предполагаемые основные параметры: textString, textLength, glyphIndices, glyphProperties, justificationOpportunities.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Определяет возможности для выравнивания (жастификации) каждого глифа на основе текста и свойств формирования.

Метод JustifyGlyphAdvances:

  1. Параметры :

    1. Тип FLOAT Название lineWidth Назначение: Целевая ширина строки.

    2. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    3. Тип const DWRITE_JUSTIFICATION_OPPORTUNITY* Название justificationOpportunities Назначение: Информация о возможностях выравнивания.

    4. Тип const FLOAT* Название glyphAdvances Назначение: Массив исходных ширин глифов.

    5. Тип const DWRITE_GLYPH_OFFSET* Название glyphOffsets Назначение: Массив исходных смещений глифов.

    6. Тип FLOAT* Название justifiedGlyphAdvances Назначение: Выходной массив выровненных ширин глифов.

    7. Тип DWRITE_GLYPH_OFFSET* Название justifiedGlyphOffsets Назначение: Выходной массив выровненных смещений глифов.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Выравнивает массив ширин глифов, чтобы они соответствовали заданной ширине строки

Метод GetJustifiedGlyphs:

  1. Параметры (синтаксис полной сигнатуры из заголовочного файла недоступен):

    • Предполагаемые основные параметры: fontFace, fontEmSize, justificationOpportunities, glyphAdvances и другие параметры, связанные с глифами.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Создаёт новые глифы для сложных скриптов (например, арабского с кашидой), где выравнивание привело к увеличению ширины глифов

Метод GetScriptProperties:

  1. Параметры (синтаксис полной сигнатуры из заголовочного файла недоступен):

    • Предполагаемые основные параметры: scriptAnalysis, scriptProperties.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Получает свойства (например, направление письма) для заданного скрипта.

Метод GetTextComplexity:

  1. Параметры :

    1. Тип const WCHAR* Название textString Назначение: Анализируемая текстовая строка.

    2. Тип UINT32 Название textLength Назначение: Длина строки.

    3. Тип IDWriteFontFace* Название fontFace Назначение: Объект шрифта для проверки.

    4. Тип BOOL* Название isTextSimple Назначение: Указатель для получения результата проверки.

    5. Тип UINT32* Название textLengthRead Назначение: Указатель для получения длины обработанного текста.

    6. Тип UINT16* Название glyphIndices Назначение: Указатель для получения индексов глифов (опционально).

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Определяет, является ли текст "простым" (не требует сложного формирования), или необходимо вызывать IDWriteTextAnalyzer::GetGlyphs для полной обработки скрипта .

Метод GetBaseline:

  1. Параметры :

    1. Тип IDWriteFontFace* Название fontFace Назначение: Объект шрифта.

    2. Тип DWRITE_BASELINE Название baseline Назначение: Тип запрашиваемой базовой линии.

    3. Тип BOOL Название isVertical Назначение: Флаг вертикальной базовой линии.

    4. Тип BOOL Название isSimulationAllowed Назначение: Разрешено ли имитировать линию, если её нет в шрифте.

    5. Тип DWRITE_SCRIPT_ANALYSIS Название scriptAnalysis Назначение: Результат анализа скрипта.

    6. Тип const WCHAR* Название localeName Назначение: Имя локали (опционально).

    7. Тип INT32* Название baselineCoordinate Назначение: Указатель для получения координаты линии.

    8. Тип BOOL* Название exists Назначение: Указатель для получения флага существования линии в шрифте.

  2. Возвращаемое значение: HRESULT .

  3. Назначение: Извлекает координату заданной базовой линии (например, Roman, Hanging) из шрифта 

IDWriteTextAnalyzer2

Метод CheckTypographicFeature:

  1. Параметры:

    1. Тип IDWriteFontFace* Название fontFace Назначение: Объект лица шрифта (IDWriteFontFace), из которого считываются данные.

    2. Тип DWRITE_SCRIPT_ANALYSIS Название scriptAnalysis Назначение: Результат анализа скрипта для проверки.

    3. Тип WCHAR const* Название localeName Назначение: Имя локали для проверки (опционально).

    4. Тип DWRITE_FONT_FEATURE_TAG Название featureTag Назначение: Тег функции OpenType (например, liga для лигатур), доступность которой проверяется.

    5. Тип UINT32 Название glyphCount Назначение: Количество проверяемых глифов.

    6. Тип UINT16 const* Название glyphIndices Назначение: Массив индексов глифов для проверки.

    7. Тип UINT8* Название featureApplies Назначение: Выходной массив, куда записывается результат (ненулевое значение, если функция применима к глифу).

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Проверить, доступна ли конкретная типографическая функция OpenType (например, стилистические альтернативы) для заданного набора глифов в шрифте и для определённого скрипта

Метод GetGlyphOrientationTransform:

  1. Параметры:

    1. Тип DWRITE_GLYPH_ORIENTATION_ANGLE (предположительно) Название angle Назначение: Угол ориентации глифа.

    2. Тип BOOL (предположительно) Название isSideways Назначение: Флаг, указывающий, является ли основное направление текста горизонтальным (FALSE) или вертикальным (TRUE).

    3. Тип DWRITE_MATRIX* Название transform Назначение: Указатель на структуру матрицы 2x3, которая будет заполнена.

  2. Возвращаемое значение: DWRITE_MATRIX (согласно описанию в документации).

  3. Назначение: Получить матрицу преобразования 2x3 для рисования последовательности глифов (glyph run) с учётом заданного угла ориентации

Метод GetTypographicFeatures:

  1. Параметры:

    1. Тип IDWriteFontFace* (предположительно) Название fontFace Назначение: Объект лица шрифта для анализа.

    2. Тип DWRITE_SCRIPT_ANALYSIS (предположительно) Название scriptAnalysis Назначение: Результат анализа скрипта.

    3. Тип WCHAR const* (предположительно) Название localeName Назначение: Имя локали (опционально).

    4. Тип UINT32* (предположительно) Название featureCount Назначение: Указатель для получения количества доступных функций.

    5. Тип DWRITE_FONT_FEATURE_TAG* (предположительно) Название features Назначение: Буфер для получения массива тегов функций.

  2. Возвращаемое значение: HRESULT (предположительно).

  3. Назначение: Получить полный список типографических функций OpenType, доступных для данного шрифта, скрипта и локали

описание и функции IDWriteNumberSubstitution

IDWriteNumberSubstitution - это механизм автоматической подстановки форм цифр в зависимости от языка, региона и контекста. Он обеспечивает корректное отображение цифр в разных письменностях (арабские, индийские, персидские цифры и т.д.) без изменения самого текста.

пример IDWriteNumberSubstitution

Объект создаётся через фабрику IDWriteFactory. Важно: объект неизменяем после создания.

IDWriteNumberSubstitution* numberSubstitution = nullptr;
HRESULT hr = writeFactory->CreateNumberSubstitution(
    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE, // Метод подстановки
    L"ar-SA",                                       // Локаль (например, арабский/Саудовская Аравия)
    TRUE,                                           // Учитывать настройки пользователя?
    &numberSubstitution
);

Параметры CreateNumberSubstitution:

  1. Метод подстановки.
    DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE - Использует стандартные цифры для указанной локали
    DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL - Цифры зависят от окружающего текста (для смешанных скриптов)
    DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE - Отключает подстановку, всегда используются европейские (0-9)
    DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL - Национальные цифры для локали (даже если в системе переопределено)
    DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL - Традиционные цифры (иногда отличаются от современных)

  2. Локаль в формате BCP-47 (например, "ar-SA", "fa-IR")

  3. TRUE - использовать системные настройки, FALSE - учитывать настройки пользователя

  4. Выходной параметр

Использование с IDWriteTextLayout

// Создаём макет текста
IDWriteTextLayout* textLayout = nullptr;
writeFactory->CreateTextLayout(L"2025 год", 8, textFormat, 500, 100, &textLayout);

// Применяем подстановку цифр для всего текста
DWRITE_TEXT_RANGE range = {0, 8}; // Весь текст
textLayout->SetNumberSubstitution(numberSubstitution, range);

// Отрисовываем
pRenderTarget->DrawTextLayout(origin, textLayout, pBrush);
описание и функции IDWriteFontCollectionLoader

IDWriteFontCollectionLoader - это интерфейс обратного вызова (callback), который реализуется приложением для обеспечения возможности загрузки пользовательских коллекций шрифтов. Его основная задача - создать перечислитель файлов шрифтов на основе уникального ключа, который приложение определяет самостоятельно

Метод CreateEnumeratorFromKey:

  1. Параметры:

    1. Тип IDWriteFactory* Название factory Назначение: Указатель на фабрику DirectWrite, которая используется для создания объектов (например, самого перечислителя файлов).

    2. Тип void const* Название collectionKey Назначение: Указатель на буфер с данными, уникально идентифицирующими вашу коллекцию шрифтов. Содержимое и формат ключа определяются вашей реализацией (например, путь к файлу или уникальный идентификатор).

    3. Тип UINT32 Название collectionKeySize Назначение: Размер буфера с ключом в байтах.

    4. Тип IDWriteFontFileEnumerator** Название fontFileEnumerator Назначение: Указатель, по адресу которого должен быть возвращён созданный объект перечислителя файлов шрифтов (IDWriteFontFileEnumerator).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Ядро интерфейса. Вызывается системой DirectWrite при создании пользовательской коллекции шрифтов (например, через IDWriteFactory::CreateCustomFontCollection). Ваша реализация должна проанализировать collectionKey, найти соответствующие файлы шрифтов и вернуть объект IDWriteFontFileEnumerator, который сможет их перечислить.

пример IDWriteFontCollectionLoader

IDWriteFontCollectionLoader - это фабричный интерфейс для создания пользовательских коллекций шрифтов из произвольных источников (папка приложения, ресурсы EXE, сеть, БД). Он позволяет загружать шрифты без их установки в систему

IDWriteFontCollectionLoader - это интерфейс, который вы реализуете. Система вызывает его, когда нужно создать коллекцию по кастомному ключу.

Реализация интерфейса:

class CustomFontCollectionLoader : public IDWriteFontCollectionLoader {
public:
    // IUnknown методы (AddRef, Release, QueryInterface)...

    // Единственный обязательный метод
    STDMETHOD(CreateEnumeratorFromKey)(
        IDWriteFactory* factory,
        void const* collectionKey,       // Ключ, переданный в CreateCustomFontCollection
        UINT32 collectionKeySize,
        IDWriteFontFileEnumerator** fontFileEnumerator // Выходной перечислитель файлов
    ) override {
        // Декодируем ключ (например, путь из wchar_t*)
        std::wstring folderPath(static_cast<wchar_t const*>(collectionKey));
        
        // Создаём перечислитель файлов для этой папки
        *fontFileEnumerator = new CustomFontFileEnumerator(factory, folderPath);
        return S_OK;
    }
};

Регистрация в фабрике:

// 1. Создаём экземпляр нашего загрузчика
CustomFontCollectionLoader* loader = new CustomFontCollectionLoader();

// 2. Регистрируем его в фабрике (до создания коллекций!)
writeFactory->RegisterFontCollectionLoader(loader);
loader->Release(); // Фабрика теперь владеет ссылкой

Создание коллекции через загрузчик:

// Ключ коллекции (произвольные данные для идентификации источника)
const void* collectionKey = L".\\Fonts"; // Например, путь к папке
UINT32 keySize = (wcslen(L".\\Fonts") + 1) * sizeof(wchar_t);

// Создаём коллекцию через наш загрузчик
IDWriteFontCollection* customCollection = nullptr;
writeFactory->CreateCustomFontCollection(
    loader,           // Наш зарегистрированный загрузчик
    collectionKey,    // Идентификатор источника
    keySize,          // Размер ключа в байтах
    &customCollection // Выходная коллекция
);

Затем IDWriteFontFileEnumerator - это второй интерфейс, который вы реализуете. Он отвечает за перебор файлов шрифтов в вашем источнике

class CustomFontFileEnumerator : public IDWriteFontFileEnumerator {
    IDWriteFactory* factory_;
    std::vector<std::wstring> fontFiles_;
    size_t currentIndex_;
    IDWriteFontFile* currentFile_;
    
public:
    CustomFontFileEnumerator(IDWriteFactory* factory, std::wstring folderPath) 
        : factory_(factory), currentIndex_(0), currentFile_(nullptr) {
        factory_->AddRef();
        
        // Находим все файлы .ttf/.otf в папке
        WIN32_FIND_DATA findData;
        HANDLE hFind = FindFirstFile((folderPath + L"\\*.ttf").c_str(), &findData);
        if (hFind != INVALID_HANDLE_VALUE) {
            do {
                fontFiles_.push_back(folderPath + L"\\" + findData.cFileName);
            } while (FindNextFile(hFind, &findData));
            FindClose(hFind);
        }
    }
    
    // IUnknown методы...
    
    // 1. Получить текущий файл шрифта
    STDMETHOD(GetCurrentFontFile)(IDWriteFontFile** fontFile) override {
        *fontFile = currentFile_;
        (*fontFile)->AddRef();
        return S_OK;
    }
    
    // 2. Перейти к следующему файлу
    STDMETHOD(MoveNext)(BOOL* hasCurrentFile) override {
        ReleaseCurrentFile();
        
        if (currentIndex_ < fontFiles_.size()) {
            // Создаём объект FontFile для текущего пути
            factory_->CreateFontFileReference(
                fontFiles_[currentIndex_].c_str(),
                nullptr, // Последнее время изменения
                &currentFile_);
            
            currentIndex_++;
            *hasCurrentFile = TRUE;
        } else {
            *hasCurrentFile = FALSE;
        }
        
        return S_OK;
    }
    
private:
    void ReleaseCurrentFile() {
        if (currentFile_) {
            currentFile_->Release();
            currentFile_ = nullptr;
        }
    }
};

Практический пример, загрузка из папки приложения:

// Ключом является путь к папке
void LoadFontsFromFolder(IDWriteFactory* factory) {
    // Регистрируем загрузчик (один раз)
    static CustomFontCollectionLoader loader;
    factory->RegisterFontCollectionLoader(&loader);
    
    // Создаём коллекцию для папки "Fonts"
    std::wstring folder = L".\\Fonts";
    IDWriteFontCollection* collection;
    factory->CreateCustomFontCollection(
        &loader,
        folder.c_str(),
        (folder.size() + 1) * sizeof(wchar_t),
        &collection
    );
    
    // Используем коллекцию
    IDWriteTextFormat* format;
    factory->CreateTextFormat(L"MyFont", collection, ..., &format);
}
описание и функции IDWriteFontFileLoader

Интерфейс IDWriteFontFileLoader - это интерфейс обратного вызова (callback), который вы реализуете в своём приложении для определения способа загрузки данных шрифта из пользовательского источника

Метод CreateStreamFromKey:

  1. Параметры:

    1. Тип void const* Название fontFileReferenceKey Назначение: Указатель на буфер с ключом, уникально идентифицирующим файл шрифта. Формат и содержимое ключа определяются вашей реализацией загрузчика (например, это может быть путь к файлу, указатель на данные в памяти или идентификатор ресурса).

    2. Тип UINT32 Название fontFileReferenceKeySize Назначение: Размер буфера с ключом в байтах.

    3. Тип IDWriteFontFileStream** Название fontFileStream Назначение: Указатель, по адресу которого должен быть возвращён созданный объект потока для чтения данных шрифта (IDWriteFontFileStream).

  2. Возвращаемое значение: HRESULT

  3. Назначение: Ядро интерфейса. Вызывается системой DirectWrite, когда требуется получить доступ к данным шрифта. Ваша реализация должна проанализировать fontFileReferenceKey, создать и вернуть объект потока (IDWriteFontFileStream), через который DirectWrite сможет читать байты файла шрифта.

пример IDWriteFontFileLoader

IDWriteFontCollectionLoader - это фабричный интерфейс для создания пользовательских коллекций шрифтов из произвольных источников (папка приложения, ресурсы EXE, сеть, БД). Он позволяет загружать шрифты без их установки в систему

IDWriteFontCollectionLoader - это интерфейс, который вы реализуете. Система вызывает его, когда нужно создать коллекцию по кастомному ключу.

реализация:

class CustomFontCollectionLoader : public IDWriteFontCollectionLoader {
public:
    // IUnknown методы (AddRef, Release, QueryInterface)...

    // Единственный обязательный метод
    STDMETHOD(CreateEnumeratorFromKey)(
        IDWriteFactory* factory,
        void const* collectionKey,       // Ключ, переданный в CreateCustomFontCollection
        UINT32 collectionKeySize,
        IDWriteFontFileEnumerator** fontFileEnumerator // Выходной перечислитель файлов
    ) override {
        // Декодируем ключ (например, путь из wchar_t*)
        std::wstring folderPath(static_cast<wchar_t const*>(collectionKey));
        
        // Создаём перечислитель файлов для этой папки
        *fontFileEnumerator = new CustomFontFileEnumerator(factory, folderPath);
        return S_OK;
    }
};

регистрация:

// 1. Создаём экземпляр нашего загрузчика
CustomFontCollectionLoader* loader = new CustomFontCollectionLoader();

// 2. Регистрируем его в фабрике (до создания коллекций!)
writeFactory->RegisterFontCollectionLoader(loader);
loader->Release(); // Фабрика теперь владеет ссылкой

Создание коллекции через загрузчик:

// Ключ коллекции (произвольные данные для идентификации источника)
const void* collectionKey = L".\\Fonts"; // Например, путь к папке
UINT32 keySize = (wcslen(L".\\Fonts") + 1) * sizeof(wchar_t);

// Создаём коллекцию через наш загрузчик
IDWriteFontCollection* customCollection = nullptr;
writeFactory->CreateCustomFontCollection(
    loader,           // Наш зарегистрированный загрузчик
    collectionKey,    // Идентификатор источника
    keySize,          // Размер ключа в байтах
    &customCollection // Выходная коллекция
);

Создание IDWriteFontFileEnumerator :

class CustomFontFileEnumerator : public IDWriteFontFileEnumerator {
    IDWriteFactory* factory_;
    std::vector<std::wstring> fontFiles_;
    size_t currentIndex_;
    IDWriteFontFile* currentFile_;
    
public:
    CustomFontFileEnumerator(IDWriteFactory* factory, std::wstring folderPath) 
        : factory_(factory), currentIndex_(0), currentFile_(nullptr) {
        factory_->AddRef();
        
        // Находим все файлы .ttf/.otf в папке
        WIN32_FIND_DATA findData;
        HANDLE hFind = FindFirstFile((folderPath + L"\\*.ttf").c_str(), &findData);
        if (hFind != INVALID_HANDLE_VALUE) {
            do {
                fontFiles_.push_back(folderPath + L"\\" + findData.cFileName);
            } while (FindNextFile(hFind, &findData));
            FindClose(hFind);
        }
    }
    
    // IUnknown методы...
    
    // 1. Получить текущий файл шрифта
    STDMETHOD(GetCurrentFontFile)(IDWriteFontFile** fontFile) override {
        *fontFile = currentFile_;
        (*fontFile)->AddRef();
        return S_OK;
    }
    
    // 2. Перейти к следующему файлу
    STDMETHOD(MoveNext)(BOOL* hasCurrentFile) override {
        ReleaseCurrentFile();
        
        if (currentIndex_ < fontFiles_.size()) {
            // Создаём объект FontFile для текущего пути
            factory_->CreateFontFileReference(
                fontFiles_[currentIndex_].c_str(),
                nullptr, // Последнее время изменения
                &currentFile_);
            
            currentIndex_++;
            *hasCurrentFile = TRUE;
        } else {
            *hasCurrentFile = FALSE;
        }
        
        return S_OK;
    }
    
private:
    void ReleaseCurrentFile() {
        if (currentFile_) {
            currentFile_->Release();
            currentFile_ = nullptr;
        }
    }
};

Загрузчик из папки приложения:

// Ключом является путь к папке
void LoadFontsFromFolder(IDWriteFactory* factory) {
    // Регистрируем загрузчик (один раз)
    static CustomFontCollectionLoader loader;
    factory->RegisterFontCollectionLoader(&loader);
    
    // Создаём коллекцию для папки "Fonts"
    std::wstring folder = L".\\Fonts";
    IDWriteFontCollection* collection;
    factory->CreateCustomFontCollection(
        &loader,
        folder.c_str(),
        (folder.size() + 1) * sizeof(wchar_t),
        &collection
    );
    
    // Используем коллекцию
    IDWriteTextFormat* format;
    factory->CreateTextFormat(L"MyFont", collection, ..., &format);
}
описание и функции IDWriteRenderingParams

Интерфейс IDWriteRenderingParams содержит параметры, управляющие процессом растеризации и сглаживания текста (например, интенсивность ClearType, гамма-коррекция)

Метод GetGamma:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: FLOAT - гамма-значение. Допустимые значения больше 0 и не превышают 256.

  3. Назначение: Получить значение для гамма-коррекции, которое компенсирует нелинейную реакцию яркости большинства мониторов, делая оттенки текста визуально равномерными.

Метод GetEnhancedContrast:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: FLOAT - величина увеличения контрастности. Допустимые значения больше или равны нулю.

  3. Назначение: Получить степень искусственного увеличения контраста между текстом и фоном. Ноль означает отсутствие дополнительного усиления

Метод GetClearTypeLevel:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: FLOAT - уровень ClearType в диапазоне от 0.0 до 1.0.

  3. Назначение: Определить степень использования субпиксельного рендеринга ClearType. Значение 0.0 соответствует отключению ClearType (сглаживание в оттенках серого), 1.0 - максимальному качеству

Метод GetPixelGeometry:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_PIXEL_GEOMETRY - значение перечисления, указывающее геометрию пикселей (например, DWRITE_PIXEL_GEOMETRY_RGB).

  3. Назначение: Узнать, какую физическую структуру субпикселей (красный-зеленый-синий) предполагает монитор. Эта информация используется алгоритмом ClearType для повышения чёткости

Метод GetRenderingMode:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_RENDERING_MODE - значение перечисления, указывающее режим рендеринга.

  3. Назначение: Получить текущий режим сглаживания текста (например, ClearType, градации серого). По умолчанию используется DWRITE_RENDERING_MODE_DEFAULT, при котором режим выбирается автоматически

IDWriteRenderingParams1

Метод GetGrayscaleEnhancedContrast:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение: FLOAT - величина увеличения контрастности для серого сглаживания. Допустимые значения больше или равны нулю.

  3. Назначение: Получить дополнительную степень контрастности, применяемую к тексту при использовании серого (а не субпиксельного ClearType) сглаживания. Значение 0.0f означает отсутствие дополнительного усиления

IDWriteRenderingParams2

Метод GetGridFitMode:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение:
    DWRITE_GRID_FIT_MODE - значение перечисления, определяющее режим привязки к сетке.

  3. Назначение:
    Возвращает текущий режим привязки глифов к пиксельной сетке (grid fitting). Этот режим влияет на то, разрешено ли слегка сдвигать глифы на дробные пиксели для более точного соответствия оригинальному контуру шрифта, что критически важно для чёткости мелкого текста

описание и функции IDWriteFontFace

Интерфейс IDWriteFontFace является основным объектом, представляющим физический шрифт (файл) в DirectWrite. Он предоставляет доступ к низкоуровневым метрикам шрифта, данным глифов, таблицам OpenType и функциям для рендеринга

Метод GetFiles:

  1. Параметры:

    1. Тип UINT32* Название numberOfFiles Назначение: Указатель для получения количества файлов, из которых состоит шрифт.

    2. Тип IDWriteFontFile** Название fontFiles Назначение: Указатель на массив для получения объектов файлов шрифта.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить список файлов, составляющих данную гарнитуру (для коллекционных шрифтов может быть несколько файлов).

Метод GetIndex:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение: UINT32

  3. Назначение: Получить индекс шрифта в файле (например, для семейств TrueType Collection).

Метод GetMetrics:

  1. Параметры:

    1. Тип DWRITE_FONT_METRICS* Название fontFaceMetrics Назначение: Указатель на структуру для получения метрик шрифта.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить основные метрики шрифта: размер em, высоту, базовую линию и т.д.

Метод GetType:

  1. Параметры:
    Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_FONT_FACE_TYPE

  3. Назначение: Определить тип файла шрифта (TrueType, OpenType, CFF и т.д.).

Метод GetGlyphIndices:

  1. Параметры:

    1. Тип UINT32 const* Название codePoints Назначение: Массив кодовых точек (символов).

    2. Тип UINT32 Название codePointCount Назначение: Количество кодовых точек.

    3. Тип UINT16* Название glyphIndices Назначение: Выходной массив для индексов глифов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Преобразовать массив кодовых точек (символов) в индексы глифов этого шрифта.

Метод GetGlyphRunOutline:

  1. Параметры:

    1. Тип FLOAT Название emSize Назначение: Размер шрифта в единицах em.

    2. Тип UINT16 const* Название glyphIndices Назначение: Массив индексов глифов для отрисовки.

    3. Тип FLOAT const* Название glyphAdvances Назначение: Массив ширин глифов (может быть nullptr).

    4. Тип DWRITE_GLYPH_OFFSET const* Название glyphOffsets Назначение: Массив смещений глифов (может быть nullptr).

    5. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    6. Тип BOOL Название isSideways Назначение: Флаг вертикальной ориентации.

    7. Тип BOOL Название isRightToLeft Назначение: Флаг направления письма.

    8. Тип IDWriteGeometrySink* Название geometrySink Назначение: Объект для получения контуров глифов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить геометрические контуры (outline) для последовательности глифов.

Метод TryGetFontTable:

  1. Параметры:

    1. Тип UINT32 Название openTypeTableTag Назначение: Тег (идентификатор) таблицы OpenType (например, 'cmap' для таблицы маппинга символов).

    2. Тип void const** Название tableData Назначение: Указатель для получения адреса данных таблицы в памяти.

    3. Тип UINT32* Название tableSize Назначение: Указатель для получения размера таблицы.

    4. Тип void** Название tableContext Название: Указатель для получения контекста таблицы.

    5. Тип BOOL* Название exists Назначение: Указатель для получения флага существования таблицы.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Попытаться получить прямой доступ к данным конкретной таблицы OpenType, содержащейся в файле шрифта.

Метод ReleaseFontTable:

  1. Параметры:

    1. Тип void* Название tableContext Назначение: Контекст таблицы, полученный из TryGetFontTable.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Освободить ресурсы, связанные с таблицей, полученной через TryGetFontTable.

Метод GetDesignGlyphMetrics:

  1. Параметры:

    1. Тип UINT16 const* Название glyphIndices Название: Массив индексов глифов.

    2. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    3. Тип DWRITE_GLYPH_METRICS* Название glyphMetrics Назначение: Выходной массив структур с метриками глифов.

    4. Тип BOOL Название isSideways Назначение: Флаг вертикальной ориентации.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить метрики глифов в дизайнерских (design) единицах шрифта (не зависят от размера кегля).

Метод GetGdiCompatibleGlyphMetrics:

  1. Параметры:

    1. Тип FLOAT Название emSize Назначение: Размер em.

    2. Тип FLOAT Название pixelsPerDip Название: Пикселей на единицу DIP.

    3. Тип DWRITE_MATRIX const* Название transform Назначение: Матрица преобразования (может быть nullptr).

    4. Тип BOOL Название useGdiNatural Назначение: Использовать GDI-натуральный режим.

    5. Тип BOOL Название useGdiClipped Назначение: Использовать GDI-обрезанный режим.

    6. Тип UINT16 const* Название glyphIndices Назначение: Массив индексов глифов.

    7. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    8. Тип DWRITE_GLYPH_METRICS* Название glyphMetrics Назначение: Выходной массив структур с метриками глифов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить метрики глифов, совместимые с GDI, с учётом размера, преобразования и специфичных для GDI флагов.

IDWriteFontFace1

Метод GetMetrics:

  1. Параметры:

    1. Тип DWRITE_FONT_METRICS1* Название fontMetrics Назначение: Указатель на структуру для получения метрик шрифта.

  2. Возвращаемое значение: void

  3. Назначение: Получить общие метрики шрифта (высота, базовая линия и др.) в дизайнерских единицах. Это расширенная версия метода IDWriteFontFace::GetMetrics

Метод GetRecommendedRenderingMode:

  1. Параметры:

    1. Тип FLOAT Название fontEmSize Назначение: Логический размер шрифта в DIP.

    2. Тип FLOAT Название dpiX, dpiY Назначение: Разрешение экрана по горизонтали и вертикали.

    3. Тип const DWRITE_MATRIX* Название transform Назначение: Матрица преобразования.

    4. Тип BOOL Название isSideways Назначение: Флаг вертикальной ориентации.

    5. Тип DWRITE_OUTLINE_THRESHOLD Название outlineThreshold Назначение: Порог для outline-рендеринга.

    6. Тип DWRITE_MEASURING_MODE Название measuringMode Назначение: Метод измерения.

    7. Тип DWRITE_RENDERING_MODE* Название renderingMode Назначение: Указатель для получения результата.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Определить оптимальный режим рендеринга (сглаживания) для шрифта с учётом размера, разрешения и преобразований

Метод GetKerningPairAdjustments:

  1. Параметры:

    1. Тип UINT32 Название glyphCount Назначение: Количество глифов.

    2. Тип const UINT16* Название glyphIndices Назначение: Массив индексов глифов.

    3. Тип INT32* Название glyphAdvanceAdjustments Назначение: Массив для получения корректировок интервалов.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить поправки кернинга (интервалов между парами глифов) из таблицы 'kern' шрифта. Для проверки наличия такой таблицы сначала вызовите HasKerningPairs

Метод IsMonospacedFont:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: BOOL

  3. Назначение: Определить, является ли шрифт моноширинным (все символы имеют одинаковую ширину). На практике: При использовании этого метода в коде на Windows 7 убедитесь, что вызывается правильная версия интерфейса, чтобы избежать сбоев

IDWriteFontFace2

Метод GetColorPaletteCount:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: UINT32 - количество цветовых палитр в шрифте.

  3. Назначение: Возвращает общее число цветовых палитр, доступных в шрифте (например, 0 для обычных, 1 и более для цветных шрифтов)

Метод GetPaletteEntries:

  1. Параметры (на основе анализа):

    1. Тип UINT32 Название colorPaletteIndex Назначение: Индекс запрашиваемой цветовой палитры.

    2. Тип UINT32 Название firstEntryIndex Назначение: Индекс первой записи цвета для извлечения.

    3. Тип UINT32 Название entryCount Назначение: Количество извлекаемых цветовых записей.

    4. Тип DWRITE_COLOR_F* Название paletteEntries Назначение: Указатель на массив структур для получения цветовых значений.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Копирует указанный диапазон цветовых записей (в формате DWRITE_COLOR_F) из заданной палитры шрифта в предоставленный массив

Метод GetPaletteEntryCount:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: UINT32 - количество цветовых записей в каждой палитре шрифта.

  3. Назначение: Возвращает количество цветов, содержащихся в одной палитре. Предполагается, что все палитры в шрифте имеют одинаковый размер

Метод IsColorFont:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: BOOL - TRUE, если шрифт содержит цветовые данные (например, глифы SVG или многослойные глифы COLR), иначе FALSE.

  3. Назначение: Быстро определить, требуется ли для корректного отображения этого шрифта задействовать цветной путь рендеринга (например, использовать IDWriteColorGlyphRunEnumerator)

IDWriteFontFace3

Метод GetFontFaceReference:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: IDWriteFontFaceReference* - указатель на объект, ссылка на шрифт.

  3. Назначение: Получить объект, который однозначно идентифицирует этот шрифт (например, по имени файла, индексу и другим свойствам)

Метод GetWeight:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_FONT_WEIGHT - значение, указывающее плотность шрифта (например, DWRITE_FONT_WEIGHT_NORMAL, DWRITE_FONT_WEIGHT_BOLD) .

  3. Назначение: Получить насыщенность (вес) данного шрифта

Метод GetStretch:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_FONT_STRETCH - значение, указывающее ширину шрифта (например, DWRITE_FONT_STRETCH_NORMAL, DWRITE_FONT_STRETCH_CONDENSED).

  3. Назначение: Получить относительную ширину (растяжение) данного шрифта

Метод GetStyle:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: DWRITE_FONT_STYLE - значение, указывающее наклон шрифта (например, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STYLE_ITALIC).

  3. Назначение: Получить стиль (наклон) данного шрифта

Метод HasCharacter:

  1. Параметры:

    1. Тип UINT32 Название unicodeValue Назначение: Кодовая точка символа Юникода (UCS-4) для проверки .

  2. Возвращаемое значение: BOOL - TRUE, если шрифт содержит указанный символ, иначе FALSE .

  3. Назначение: Определить, поддерживает ли данный шрифт указанный символ

Метод GetInformationalStrings:

  1. Параметры:

    1. Тип DWRITE_INFORMATIONAL_STRING_ID Название informationalStringID Назначение: Идентификатор запрашиваемой информационной строки (например, описание, лицензия) .

    2. Тип IDWriteLocalizedStrings** Название informationalStrings Назначение: Указатель для получения объекта с локализованными строками .

    3. Тип BOOL* Название exists Назначение: Указатель для получения флага существования запрошенной информации .

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить локализованную коллекцию строк, содержащую указанную информационную строку о шрифте

IDWriteFontFace4

Метод GetFile:

  1. Параметры:

    1. Тип IDWriteFontFile** Название fontFile Назначение: Указатель для получения адреса объекта файла шрифта (IDWriteFontFile), который является источником данных для этой гарнитуры.

  2. Возвращаемое значение: HRESULT

  3. Назначение: Получить прямой доступ к базовому файлу шрифта, из которого была создана данная гарнитура.

Метод IsColorFont:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: BOOL

  3. Назначение: Проверить, содержит ли шрифт цветные глифы. Возвращает TRUE, если шрифт является цветным.

IDWriteFontFace5

Метод Equals:

  1. Параметры:

    1. Тип IDWriteFontFace* Название fontFace Назначение: Указатель на объект IDWriteFontFace для сравнения с текущим.

  2. Возвращаемое значение: BOOL - TRUE, если объекты ссылаются на один и тот же шрифт, иначе FALSE.

  3. Назначение: Выполняет глубокое сравнение, чтобы определить, представляют ли два объекта IDWriteFontFace (например, IDWriteFontFace5 и IDWriteFontFace3) одно и то же «лицо» шрифта в одном файле с одинаковыми симуляциями и значениями осей

Метод GetFontAxisValueCount:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: UINT32 - количество осей шрифта.

  3. Назначение: Получить размер массива, необходимый для вызова GetFontAxisValues. Включает как стандартные оси (например, вес wght), так и пользовательские

Метод GetFontAxisValues:

  1. Параметры:

    1. Тип DWRITE_FONT_AXIS_VALUE* Название fontAxisValues Назначение: Указатель на массив структур, который будет заполнен значениями осей.

    2. Тип UINT32 Название fontAxisValueCount Назначение: Размер выделенного массива (должен совпадать со значением, возвращённым GetFontAxisValueCount).

  2. Возвращаемое значение: HRESULT - S_OK при успехе или E_INVALIDARG, если размер массива неверный.

  3. Назначение: Получить канонический список значений всех осей, которые определяют текущее начертание шрифта. Эти значения уже приведены в поддерживаемый диапазон

Метод GetFontResource:

  1. Параметры:

    1. Тип IDWriteFontResource** Название fontResource Назначение: Указатель, по которому будет возвращён адрес нового объекта ресурса шрифта.

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получить доступ к базовому ресурсу (IDWriteFontResource), что позволяет повторно создать экземпляр шрифта с другими значениями осей или запросить дополнительную информацию

Метод HasVariations:

  1. Параметры: Метод не имеет параметров.

  2. Возвращаемое значение: BOOL - TRUE, если шрифт поддерживает хотя бы одну переменную ось, иначе FALSE.

  3. Назначение: Быстро определить, является ли данный шрифт переменным, то есть позволяет ли он плавно изменять свои атрибуты (жирность, ширину и др.)

IDWriteFontFace6

Метод GetFaceNames:

  1. Параметры:

    1. Тип DWRITE_FONT_FAMILY_MODEL Название fontFamilyModel  Назначение: Модель группировки семейств шрифтов, определяющая, какие названия запрашивать.

    2. Тип IDWriteLocalizedStrings** Название names Назначение: Указатель для получения объекта с локализованными названиями начертаний шрифта (например, "Regular", "Bold").

  2. Возвращаемое значение: HRESULT.

  3. Назначение: Получить локализованные названия для данного начертания шрифта, соответствующие заданной модели семейства

IDWriteFontFace7

Метод GetPaintFeatureLevel:

  1. Параметры:

    1. Тип DWRITE_GLYPH_IMAGE_FORMATS Название glyphImageFormat  Назначение: Запрашивает максимальный уровень возможностей рисования (paint features) для данного конкретного формата изображения глифа (например, DWRITE_GLYPH_IMAGE_FORMATS_COLR).

  2. Возвращаемое значение:
    DWRITE_PAINT_FEATURE_LEVEL - значение перечисления, указывающее максимальный уровень инструкций рисования, поддерживаемый шрифтом для указанного формата.

  3. Назначение:
    Определить, какие сложные графические возможности (например, градиенты, трансформации, составные формы) поддерживаются шрифтом для заданного типа его глифов. Это ключевой метод для проверки совместимости перед попыткой чтения данных через CreatePaintReader

Метод CreatePaintReader:

  1. Параметры:

    1. Тип DWRITE_GLYPH_IMAGE_FORMATS Название glyphImageFormat  Назначение: Определяет формат изображения глифа, для которого будет создан читатель (например, DWRITE_GLYPH_IMAGE_FORMATS_COLR).

    2. Тип DWRITE_PAINT_FEATURE_LEVEL Название paintFeatureLevel Назначение: Запрашиваемый уровень возможностей рисования (paint features). Обычно используется значение, полученное из GetPaintFeatureLevel.

    3. Тип IDWritePaintReader** Название paintReader Назначение: Указатель, по адресу которого будет возвращён созданный объект-читатель (IDWritePaintReader).

  2. Возвращаемое значение:
    HRESULT - стандартный код успеха или ошибки COM.

  3. Назначение:
    Создать объект-читатель (IDWritePaintReader), который позволяет последовательно читать и интерпретировать низкоуровневые инструкции рисования (paint data), содержащиеся в современных цветных векторных шрифтах (например, в формате COLR версии 1). Это основной метод для программного доступа к графическим командам таких шрифтов

Да, получилось много, ну и как сказано в аннотации это комбинация перевода документации о шрифтах + примеры, главная цель была показать конечно как создавать и отображать текст.

Информация на этой странице взята из источника: https://habr.com/ru/articles/983794/