Поделиться через


Знакомство с DirectWrite

Люди взаимодействовать с текстом все время в их повседневной жизни. Это основной способ для людей, которые потребляют больший объем информации. В прошлом он использовался для печати содержимого, в первую очередь документов, газет, книг и т. д. Все чаще это онлайн-содержимое на компьютере с Windows. Типичный пользователь Windows тратит много времени на чтение с экрана компьютера. Это может быть серфинг в Интернете, сканирование электронной почты, создание отчета, заполнение электронной таблицы или написание программного обеспечения, но то, что они действительно делают, читает. Несмотря на то, что текст и шрифты пронизывают почти каждую часть пользовательского интерфейса в Windows, для большинства пользователей чтение на экране не так приятно, как чтение печатных выходных данных.

Для разработчиков приложений Windows написание кода обработки текста является проблемой из-за повышенных требований для повышения удобочитаемости, сложного форматирования и управления макетом, а также поддержки нескольких языков, которые должно отображаться приложением. Даже самая простая система обработки текста должна разрешать ввод текста, макет, отображение, редактирование и вставку и вставку. Пользователи Windows обычно ожидают даже больше этих основных функций, требуя даже простых редакторов для поддержки нескольких шрифтов, различных стилей абзацев, внедренных изображений, орфографии проверка и других функций. Современный дизайн пользовательского интерфейса также не ограничивается одним форматом, обычным текстом, но должен обеспечить более широкий интерфейс с форматированными шрифтами и текстовыми макетами.

Это введение в то, как DirectWrite позволяет приложениям Windows улучшить текстовый интерфейс для пользовательского интерфейса и документов.

Улучшение интерфейса текста

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

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

Независимость системы отрисовки

DirectWrite не зависит от любой конкретной графической технологии. Приложения могут использовать технологию отрисовки, оптимальную для своих потребностей. Это дает приложениям гибкость для продолжения отрисовки некоторых частей приложения через GDI и другие части через Direct3D или Direct2D. На самом деле, приложение может выбрать отрисовку DirectWrite через собственный стек отрисовки.

Высококачественная типография

DirectWrite использует преимущества технологии OpenType Font, чтобы обеспечить высококачественную типографию в приложении Windows. Система шрифтов DirectWrite предоставляет службы для работы с перечислением шрифтов, резервным копированием шрифтов и кэшированием шрифтов, которые необходимы приложениям для обработки шрифтов.

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

Поддержка расширенных функций типографических функций

DirectWrite позволяет разработчикам приложений разблокировать функции шрифтов OpenType, которые они не могли использовать в WinForms или GDI. Объект DirectWrite IDWriteTypography предоставляет множество расширенных функций шрифтов OpenType, таких как стилистические альтернативные и швы. Пакет средств разработки программного обеспечения Microsoft Windows (SDK) предоставляет набор примеров шрифтов OpenType , разработанных с широкими возможностями, такими как шрифты Pericles и Pescadero. Дополнительные сведения о возможностях OpenType см. в разделе Возможности шрифта OpenType.

Поддержка международного текста

DirectWrite использует шрифты OpenType , чтобы обеспечить широкую поддержку международного текста. Поддерживаются такие функции Юникода, как суррогаты, BIDI, разрыв строк и UVS. Элементы скрипта с помощью языка, подстановка чисел и глифы обеспечивают правильность макета и отрисовки текста в любом скрипте.

В настоящее время поддерживаются следующие скрипты.

Примечание.

Для скриптов, помеченных символом *, системные шрифты по умолчанию отсутствуют. Приложения должны устанавливать шрифты, поддерживающие эти скрипты.

 

  • Арабский
  • Армянский
  • Бенгала
  • Бопомофо
  • Брайля*
  • Канадские аборигены syllabics
  • Чероки
  • Китайский (упрощенное и традиционное)
  • Кириллица
  • Коптский*
  • Девангари
  • Ethiopic
  • Грузинский
  • Glagolitic*
  • Греческий
  • Гуджарати
  • Гурмукхи
  • Иврит
  • Японский
  • Каннада
  • Кхмерский
  • Корейский
  • Лаосский
  • Латинская
  • Малаялам
  • Монгольский
  • Мьянма
  • Новый Тай Лу
  • Огхэм*
  • Ория
  • 'Phags-pa
  • Рунический*
  • Сингальский
  • Сирийский
  • Тай Ле
  • Тамильский
  • Телугу
  • мальдивский
  • Тайский
  • Тибетский
  • Носу

Несколько уровней функциональности

DirectWrite предоставляет факторные слои функциональных возможностей, при этом каждый слой легко взаимодействует со следующим. Проектирование API дает разработчикам приложений свободу и гибкость для внедрения отдельных слоев в зависимости от их потребностей и расписаний. На следующей схеме показана связь между этими слоями.

diagram of directwrite layers and how they communicate with an application or ui framework and the graphics api

API макета текста предоставляет функциональные возможности самого высокого уровня, доступные в DirectWrite. Он предоставляет службы для приложения для измерения, отображения и взаимодействия с форматированными текстовыми строками. Этот текстовый API можно использовать в приложениях, которые в настоящее время используют DrawText Win32 для создания современного пользовательского интерфейса с форматированным текстом.

Приложения с интенсивным текстом, реализующие собственный механизм макета, могут использовать следующий слой вниз: обработчик скриптов. Обработчик скриптов разбивает фрагмент текста в блоки скриптов и обрабатывает сопоставление между представлениями Юникода с соответствующим представлением глифа в шрифте, чтобы текст скрипта можно было правильно отображать на правильном языке. Система макета, используемая слоем API макета текста, основана на системе обработки шрифтов и скриптов.

Уровень глиф-отрисовки является самым низким уровнем функциональности и предоставляет функции отрисовки глифов для приложений, реализующих собственный механизм макета текста. Уровень отрисовки глифа также полезен для приложений, реализующих пользовательский отрисовщик для изменения поведения рисования глифов с помощью функции обратного вызова в API форматирования текста DirectWrite .

Система шрифтов DirectWrite доступна всем функциональным слоям DirectWrite и позволяет приложению получать доступ к сведениям о шрифте и глифе. Он предназначен для обработки общих технологий шрифтов и форматов данных. Модель шрифта DirectWrite следует распространенной типографической практике поддержки любого количества весов, стилей и растянутых в одном семействе шрифтов. Эта модель, та же модель, за которой следует WPF и CSS, указывает, что шрифты, отличающиеся только в весе (полужирный, светлый и т. д.), стиль (вертикальный, курсив или косой) или растяжения (узкие, сжатые, широкие и т. д.) считаются членами одной семьи шрифтов.

Улучшенная отрисовка текста с помощью ClearType

Улучшение удобочитаемости на экране является ключевым требованием для всех приложений Windows. Доказательства исследования в когнитивной психологии свидетельствуют о том, что нам нужно иметь возможность распознавать каждую букву точно и что даже интервал между буквами критически важен для быстрой обработки. Буквы и слова, которые не симметричные, воспринимаются как уродливые и ухудшают процесс чтения. Кевин Ларсон, группа Microsoft Advanced Reading Technologies, написала статью по теме, опубликованной в Spectrum IEEE. Статья называется "Технология текста".

Текст в DirectWrite отрисовывается с помощью Microsoft ClearType, что повышает четкость и удобочитаемость текста. ClearType использует преимущество того, что современные дисплеев LCD имеют полосы RGB для каждого пикселя, который можно контролировать по отдельности. DirectWrite использует последние улучшения ClearType, впервые включенные в Windows Vista с Windows Presentation Foundation, что позволяет оценивать не только отдельные буквы, но и интервал между буквами. До этих улучшений ClearType текст с размером "чтение" размером 10 или 12 точек было трудно отобразить: мы могли бы разместить либо 1 пиксель между буквами, которые часто слишком мало, либо 2 пикселя, что часто было слишком много. Использование дополнительного разрешения в подпикселях обеспечивает нам дробное интервалирование, что улучшает равномерность и симметрию всей страницы.

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

На следующем рисунке показана версия GDI отрисовщика ClearType, которая не использовала положение вложенного пикселя.

illustration of

На следующем рисунке показана версия отрисовщика ClearType DirectWrite , которая использует положение вложенного пикселя.

illustration of

Обратите внимание, что интервал между буквами h и n более даже в втором изображении, и буква o находится дальше от буквы n, более даже с буквой l. Кроме того, обратите внимание, что стебли на буквах l более естественно выглядят.

Вложенная позиция ClearType обеспечивает наиболее точный интервал символов на экране, особенно при небольших размерах, где разница между вложенным пикселем и целым пикселем представляет значительную долю ширины глифа. Он позволяет измерять текст в идеальном пространстве разрешения и отображаться в естественной позиции на цветовой полосе LCD с детализацией подпикселя. Текст измеряется и отрисовывается с помощью этой технологии по определению, независимо от разрешения, что означает, что точно такой же макет текста достигается в диапазоне различных разрешений отображения.

В отличие от любого типа отрисовки GDI ClearType, вложенный пиксель ClearType предлагает самую точную ширину символов.

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

Для большого размера текст DirectWrite также позволяет использовать псевдонимы вдоль оси Y, чтобы сделать края более гладкими и отрисовывать буквы в качестве предполагаемого конструктора шрифтов. На следующем рисунке показана защита от псевдонима y.

illustration of

Хотя текст DirectWrite расположен и отрисовывается с помощью вложенного пикселя ClearType по умолчанию, доступны другие параметры отрисовки. Многие существующие приложения используют GDI для отображения большей части пользовательского интерфейса, а некоторые приложения используют элементы управления редактирования системы, которые продолжают использовать GDI для отрисовки текста. При добавлении текста DirectWrite в эти приложения может потребоваться пожертвовать улучшениями взаимодействия с чтением, предоставляемыми вложенным пикселем ClearType, чтобы текст имеет согласованный внешний вид в приложении.

Для удовлетворения этих требований DirectWrite также поддерживает следующие параметры отрисовки:

  • Вложенный пиксель ClearType (по умолчанию).
  • Вложенный пиксель ClearType с анти-псевдонимом в горизонтальных и вертикальных измерениях.
  • Псевдонимный текст.
  • Естественная ширина GDI (например, используется в режиме чтения Microsoft Word).
  • Совместимая с GDI ширина (включая внедренное растровое изображение Восточной Азии).

Каждый из этих режимов отрисовки можно точно настроить с помощью API DirectWrite и с помощью нового настраиваемого настраивателя ClearType для Windows 7.

Примечание.

Начиная с Windows 8, в большинстве случаев следует использовать защиту от серого цвета текста. Этот процесс описан в следующем разделе.

 

Поддержка естественного макета

Естественный макет не зависит от разрешения, поэтому интервалы символов не изменяются при увеличении или увеличении масштаба или в зависимости от DPI отображения. Дополнительное преимущество заключается в том, что интервал соответствует дизайну шрифта. Естественный макет становится возможным благодаря поддержке DirectWrite для естественной отрисовки, что означает, что отдельные глифы могут быть расположены до доли пикселя.

Хотя естественный макет является стандартным, некоторые приложения должны отображать текст с тем же интервалом и внешним видом, что и GDI. Для таких приложений DirectWrite предоставляет классические и GDI естественные режимы измерения GDI и соответствующие режимы отрисовки.

Любой из указанных выше режимов отрисовки можно сочетать с двумя режимами защиты: ClearType или серой шкалы. Симуляция ClearType с более высоким разрешением путем индивидуального управления значениями красного, зеленого и синего цветов каждого пикселя. Для каждого пикселя вычисляется только одно значение покрытия (или альфа). ClearType — это значение по умолчанию, но для приложений Магазина Windows рекомендуется использовать антимасштабирование серого уровня, так как оно быстрее и совместимо со стандартными антиализамиями, а также является высокочитаемым.

Обзор API

Интерфейс IDWriteFactory — это отправная точка для использования функций DirectWrite. Фабрика — это корневой объект, который создает набор объектов, которые можно использовать вместе.

Операция форматирования и макета является обязательным условием для операций, так как текст должен быть правильно отформатирован и выложен в указанный набор ограничений, прежде чем его можно будет нарисовать или проверить. Двумя ключевыми объектами, которые можно создать с помощью IDWriteFactory для этой цели, являются IDWriteTextFormat и IDWriteTextLayout. Объект IDWriteTextFormat представляет сведения о форматировании абзаца текста. Функция IDWriteFactory::CreateTextLayout принимает входную строку, связанные ограничения, такие как измерение пробела, и объект IDWriteTextFormat , и помещает полностью проанализированный и отформатированный результат в IDWriteTextLayout для использования в последующих операциях.

Затем приложение может отобразить текст с помощью функции DrawTextLayout, предоставленной Direct2D или реализуя функцию обратного вызова, которая может использовать GDI, Direct2D или другие графические системы для отрисовки глифов. Для одного формата функция DrawText в Direct2D предоставляет более простой способ рисования текста, не создавая объект IDWriteTextLayout.

Форматирование и рисование "Hello World" с помощью DirectWrite

В следующем примере кода показано, как приложение может отформатировать один абзац с помощью IDWriteTextFormat и нарисовать его с помощью функции Direct2DDrawText.

HRESULT DemoApp::DrawHelloWorld(
    ID2D1HwndRenderTarget* pIRenderTarget
    )
{
    HRESULT hr = S_OK;
    ID2D1SolidColorBrush* pIRedBrush = NULL;
    IDWriteTextFormat* pITextFormat = NULL;
    IDWriteFactory* pIDWriteFactory = NULL;

    if (SUCCEEDED(hr))
    {
        hr = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED,
                __uuidof(IDWriteFactory),
                reinterpret_cast<IUnknown**>(&pIDWriteFactory));
    }

    if(SUCCEEDED(hr))
    {
        hr = pIDWriteFactory->CreateTextFormat(
            L"Arial", 
            NULL,
            DWRITE_FONT_WEIGHT_NORMAL, 
            DWRITE_FONT_STYLE_NORMAL, 
            DWRITE_FONT_STRETCH_NORMAL, 
            10.0f * 96.0f/72.0f, 
            L"en-US", 
            &pITextFormat
        );
    }

    if(SUCCEEDED(hr))
    {
        hr = pIRenderTarget->CreateSolidColorBrush(
            D2D1:: ColorF(D2D1::ColorF::Red),
            &pIRedBrush
        );
    }
    
   D2D1_RECT_F layoutRect = D2D1::RectF(0.f, 0.f, 100.f, 100.f);

    // Actually draw the text at the origin.
    if(SUCCEEDED(hr))
    {
        pIRenderTarget->DrawText(
            L"Hello World",
            wcslen(L"Hello World"),
            pITextFormat,
            layoutRect, 
            pIRedBrush
        );
    }

    // Clean up.
    SafeRelease(&pIRedBrush);
    SafeRelease(&pITextFormat);
    SafeRelease(&pIDWriteFactory);

    return hr;
}

Доступ к системе шрифтов

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

Объект IDWriteFontCollection — это коллекция семейств шрифтов. DirectWrite предоставляет доступ к набору шрифтов, установленных в системе, через специальную коллекцию шрифтов, называемую коллекцией системных шрифтов. Это получается путем вызова метода GetSystemFontCollection объекта IDWriteFactory. Приложение также может создать настраиваемую коллекцию шрифтов из набора шрифтов, перечисленных в определяемом приложением обратном вызове, то есть частные шрифты, установленные приложением, или шрифты, внедренные в документ.

Затем приложение может вызвать GetFontFamily, чтобы получить определенный объект FontFamily в коллекции, а затем вызвать IDWriteFontFamily::GetFirstMatchingFont, чтобы получить к конкретному объекту IDWriteFont. Объект IDWriteFont представляет шрифт в коллекции шрифтов и предоставляет свойства и несколько базовых метрик шрифта.

IdWriteFontFace — это другой объект, представляющий шрифт и предоставляющий полный набор метрик на шрифте. IdWriteFontFace можно создать непосредственно из имени шрифта; приложению не нужно получать коллекцию шрифтов для доступа к ней. Это полезно для приложения макета текста, такого как Microsoft Word, которое должно запрашивать сведения для определенного шрифта.

На следующей схеме показана связь между этими объектами.

diagram of the relationship between a font collection, font family, and font face

IDWriteFontFace

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

Большинство основных приложений не будут использовать эти API напрямую, а вместо этого будут использовать IDWriteFont или указать имя семейства шрифтов напрямую.

В следующей таблице приведены сценарии использования для двух объектов.

Категория IDWriteFont IDWriteFontFace
API для поддержки взаимодействия пользователей, таких как пользовательский интерфейс выбора шрифта: описание и другие информационные API Да Нет
API для поддержки сопоставления шрифтов: семейство, стиль, вес, растяжение, покрытие символов Да Нет
DrawText API Да Нет
API, используемые для отрисовки No Да
API- интерфейсы, используемые для макета текста: метрики глифа и т. д. No Да
API для элементов управления пользовательского интерфейса и текстового макета: метрики на уровне шрифта Да Да

 

Ниже приведен пример приложения, которое перечисляет шрифты в системной коллекции шрифтов.

#include <dwrite.h>
#include <string.h>
#include <stdio.h>
#include <new>

// SafeRelease inline function.
template <class T> inline void SafeRelease(T **ppT)
{
    if (*ppT)
    {
        (*ppT)->Release();
        *ppT = NULL;
    }
}

void wmain()
{
    IDWriteFactory* pDWriteFactory = NULL;

    HRESULT hr = DWriteCreateFactory(
            DWRITE_FACTORY_TYPE_SHARED,
            __uuidof(IDWriteFactory),
            reinterpret_cast<IUnknown**>(&pDWriteFactory)
            );

    IDWriteFontCollection* pFontCollection = NULL;

    // Get the system font collection.
    if (SUCCEEDED(hr))
    {
        hr = pDWriteFactory->GetSystemFontCollection(&pFontCollection);
    }

    UINT32 familyCount = 0;

    // Get the number of font families in the collection.
    if (SUCCEEDED(hr))
    {
        familyCount = pFontCollection->GetFontFamilyCount();
    }

    for (UINT32 i = 0; i < familyCount; ++i)
    {
        IDWriteFontFamily* pFontFamily = NULL;

        // Get the font family.
        if (SUCCEEDED(hr))
        {
            hr = pFontCollection->GetFontFamily(i, &pFontFamily);
        }

        IDWriteLocalizedStrings* pFamilyNames = NULL;
        
        // Get a list of localized strings for the family name.
        if (SUCCEEDED(hr))
        {
            hr = pFontFamily->GetFamilyNames(&pFamilyNames);
        }

        UINT32 index = 0;
        BOOL exists = false;
        
        wchar_t localeName[LOCALE_NAME_MAX_LENGTH];

        if (SUCCEEDED(hr))
        {
            // Get the default locale for this user.
            int defaultLocaleSuccess = GetUserDefaultLocaleName(localeName, LOCALE_NAME_MAX_LENGTH);

            // If the default locale is returned, find that locale name, otherwise use "en-us".
            if (defaultLocaleSuccess)
            {
                hr = pFamilyNames->FindLocaleName(localeName, &index, &exists);
            }
            if (SUCCEEDED(hr) && !exists) // if the above find did not find a match, retry with US English
            {
                hr = pFamilyNames->FindLocaleName(L"en-us", &index, &exists);
            }
        }
        
        // If the specified locale doesn't exist, select the first on the list.
        if (!exists)
            index = 0;

        UINT32 length = 0;

        // Get the string length.
        if (SUCCEEDED(hr))
        {
            hr = pFamilyNames->GetStringLength(index, &length);
        }

        // Allocate a string big enough to hold the name.
        wchar_t* name = new (std::nothrow) wchar_t[length+1];
        if (name == NULL)
        {
            hr = E_OUTOFMEMORY;
        }

        // Get the family name.
        if (SUCCEEDED(hr))
        {
            hr = pFamilyNames->GetString(index, name, length+1);
        }
        if (SUCCEEDED(hr))
        {
            // Print out the family name.
            wprintf(L"%s\n", name);
        }

        SafeRelease(&pFontFamily);
        SafeRelease(&pFamilyNames);

        delete [] name;
    }

    SafeRelease(&pFontCollection);
    SafeRelease(&pDWriteFactory);
}

Отрисовка текста

API-интерфейсы отрисовки текста позволяют отображать глифы в шрифте DirectWrite в поверхности Direct2D или на независимом растровом рисунке устройства GDI или преобразовываться в контуры или растровые изображения. Отрисовка ClearType в DirectWrite поддерживает размещение вложенных пикселей с улучшенной резкостью и контрастностью по сравнению с предыдущими реализациями в Windows. DirectWrite также поддерживает псевдонимы черного и белого текста для поддержки сценариев, связанных с шрифтами Восточной Азии с внедренными растровыми изображениями, или где пользователь отключил сглаживание шрифтов любого типа.

Все параметры настраиваются всеми доступными ручками ClearType, доступными через API DirectWrite , а также предоставляются с помощью новой панели управления Windows 7 ClearType.

Существует два API-интерфейса для отрисовки глифов, один обеспечивает аппаратно-ускоренную отрисовку с помощью Direct2D и другую, обеспечивающую отрисовку программного обеспечения на растровом рисунке GDI. Приложение с помощью IDWriteTextLayout и реализация обратного вызова IDWriteTextRenderer может вызывать любой из этих функций в ответ на обратный вызов DrawGlyphRun. Кроме того, приложения, реализующие собственный макет или имеющие доступ к данным уровня глифов, могут использовать эти API.

  1. ID2DRenderTarget::D rawGlyphRun

    Приложения могут использовать API Direct2D DrawGlyphRun для обеспечения аппаратного ускорения отрисовки текста с помощью GPU. Аппаратное ускорение влияет на все этапы конвейера отрисовки текста— от объединения глифов в глифы и фильтрации растрового изображения с глифом до применения алгоритма смешивания ClearType к окончательным отображаемым выходным данным. Это рекомендуемый API для получения оптимальной производительности отрисовки.

  2. IDWriteBitmapRenderTarget::D rawGlyphRun

    Приложения могут использовать метод IDWriteBitmapRenderTarget::D rawGlyphRun для выполнения программной отрисовки глифов на 32-bpp-растрового изображения. Объект IDWriteBitmapRenderTarget инкапсулирует растровое изображение и контекст устройства памяти, который можно использовать для отрисовки глифов. Этот API полезен, если вы хотите остаться в GDI, так как у вас есть существующая база кода, которая отрисовывается в GDI.

Если у вас есть приложение с существующим кодом макета текста, использующим GDI, и вы хотите сохранить существующий код макета, но использовать DirectWrite только для последнего шага отрисовки глифов, IDWriteGdiInterop::CreateFontFaceFromHdc предоставляет мост между двумя API. Перед вызовом этой функции приложение будет использовать функцию IDWriteGdiInterop::CreateFontFaceFromHdc для получения ссылки на шрифт из контекста устройства.

Примечание.

В большинстве сценариев приложения могут не использовать эти API-интерфейсы глиф-отрисовки. После создания объекта IDWriteTextLayout приложение может использовать метод ID2D1RenderTarget::D rawTextLayout для отрисовки текста.

 

Настраиваемые режимы отрисовки

Ряд параметров влияет на отрисовку текста, например гамма, уровень ClearType, геометрию пикселей и улучшенную контрастность. Параметры отрисовки инкапсулируются объектом, который реализует открытый интерфейс IDWriteRenderingParams . Объект параметров отрисовки автоматически инициализирован на основе свойств оборудования и (или) пользовательских настроек, указанных с помощью applet панели управления ClearType в Windows 7. Как правило, если клиент использует API макета DirectWrite , DirectWrite автоматически выбирает режим отрисовки, соответствующий указанному режиму измерения.

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

Ниже приведены различные доступные параметры отрисовки:

  • Защита от псевдонима под пикселя

    Приложение задает параметр renderingMode для DWRITE_RENDERING_MODE_NATURAL, чтобы указать отрисовку с анти-псевдонимом только в горизонтальном измерении.

  • Защита от псевдонима под пикселя в горизонтальных и вертикальных измерениях.

    Приложение задает параметр renderingMode для DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, чтобы указать отрисовку с анти-псевдонимом как в горизонтальных, так и вертикальных измерениях. Это делает кривые и диагональные линии выглядят более гладко за счет некоторой мягкости, и обычно используется при размерах выше 16 ppem.

  • Псевдонимный текст

    Приложение задает параметр renderingMode для DWRITE_RENDERING_MODE_ALIASED для указания псевдонима текста.

  • Текст с серой шкалой

    Приложение задает параметр pixelGeometry для DWRITE_PIXEL_GEOMETRY_FLAT для указания текста серого уровня.

  • Совместимая с GDI ширина (включая внедренное растровое изображение Восточной Азии)

    Приложение задает параметр renderingMode для DWRITE_RENDERING_MODE_GDI_CLASSIC, чтобы указать анти-псевдоним GDI, совместимый с GDI.

  • Естественная ширина GDI

    Приложение задает параметр renderingMode для DWRITE_RENDERING_MODE_GDI_NATURAL для указания защиты от псевдонимов, совместимых с естественной шириной GDI.

  • Текст структуры

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

Взаимодействие GDI

Интерфейс IDWriteGdiInterop обеспечивает взаимодействие с GDI. Это позволяет приложениям продолжать свои существующие инвестиции в базы кода GDI и выборочно использовать DirectWrite для отрисовки или макета.

Ниже приведены API-интерфейсы, позволяющие приложению перенестися в систему шрифтов GDI или из нее:

Заключение

Улучшение взаимодействия с чтением имеет большое значение для пользователей, будь то на экране или на бумаге. DirectWrite обеспечивает простоту использования и многоуровневую модель программирования для разработчиков приложений, чтобы улучшить текстовый интерфейс для своих приложений Windows. Приложения могут использовать DirectWrite для отображения форматированного текста для пользовательского интерфейса и документов с помощью API макета. Для более сложных сценариев приложение может работать непосредственно с глифами, шрифтами доступа и т. д. и использовать возможности DirectWrite для обеспечения высококачественной типографии.

Возможности взаимодействия DirectWrite позволяют разработчикам приложений перенаправлять существующие базы кода Win32 и применять DirectWrite выборочно в своих приложениях.