Обзор API Direct2D
Direct2D предоставляет API, аналогичный Direct3D, для использования с C или C++. API предоставляет различные функциональные возможности, связанные с рисованием:
- Целевые объекты отрисовки для отображения и отрисовки вне экрана с помощью Direct2D, Direct3D или GDI.
- Объекты для управления состоянием рисования, такими как преобразования пространства координат и режимы сглаживания.
- Представления геометрических данных и функций для обработки геометрии.
- Функции отрисовки для растровых изображений, геометрий и текста.
- Положения об использовании графического содержимого, созданного с помощью GDI или Direct3D.
В этом разделе представлен обзор объектов, составляющих API Direct2D. Он содержит следующие разделы:
- Файлы заголовков Direct2D
- интерфейсы Direct2D
- Интерфейс ID2D1Factory
- цели рендеринга
- ресурсы чертежа
- рисование текста
- примитивы Direct2D
- Связанные темы
Файлы заголовков Direct2D
API Direct2D определяется следующими файлами заголовков.
Файл заголовка | Описание |
---|---|
d2d1.h | Определяет версии C и C++ основного API Direct2D. |
d2d1helper.h | Определяет вспомогательные функции, классы и структуры C++. |
d2dbasetypes.h | Определяет примитивы рисования для Direct2D, например точек и прямоугольников. Этот заголовок включен в d2d1.h. |
d2derr.h | Определяет коды ошибок для Direct2D. Этот заголовок включен в d2d1.h. |
d2d1_1.h | Определяет версии C и C++ основного API Direct2D для Windows 8 и более поздних версий. |
d2d1_1helper.h | Определяет вспомогательные функции, классы и структуры C++ для Windows 8 и более поздних версий. |
d2d1effects.h | Определяет версии эффектов изображения C и C++ в API Direct2D для Windows 8 и более поздних версий. |
d2d1effecthelpers.h | Определяет вспомогательные функции, классы и структуры C++ для части API эффектов изображений в Direct2D для Windows 8 и более поздних версий. |
Чтобы использовать Direct2D, приложение должно включать файл заголовка d2d1.h.
Чтобы скомпилировать приложение Direct2D, добавьте d2d1.lib в список библиотек. Вы можете найти d2d1.h и d2d1.lib в SDK под Windows 7.
В следующих разделах описаны некоторые распространенные интерфейсы, предоставляемые API Direct2D.
Интерфейсы Direct2D
В корне API Direct2D находятся интерфейсы ID2D1Factory и ID2D1Resource. Объект ID2D1Factory создает объекты ID2D1Resource и служит отправной точкой для использования Direct2D. Все остальные объекты Direct2D наследуются от интерфейса ID2D1Resource. Существует два типа ресурсов Direct2D: независимые от устройств ресурсы и ресурсы, зависящие от устройств.
- Независимые от устройств ресурсы не связаны с определенным устройством отрисовки и могут сохраняться в течение всего времени существования приложения.
- Ресурсы, зависящие от устройств, связаны с определенным устройством отрисовки и перестают функционировать, если это устройство удалено.
(Дополнительные сведения о ресурсах и совместном использовании ресурсов см. в разделе Обзор ресурсов.)
Интерфейс ID2D1Factory
Интерфейс ID2D1Factory является отправной точкой для использования Direct2D. Вы используете ID2D1Factory для создания экземпляров ресурсов Direct2D. Чтобы создать ID2D1Factory, используйте один из методов CreateFactory.
Фабрика определяет набор методов CreateResource, которые могут создавать следующие рисовательные ресурсы:
- Целевые объекты отрисовки — это объекты, которые отрисовывают команды рисования.
- Блоки состояния рисования — это объекты, в которых хранятся сведения о состоянии рисования, такие как текущее преобразование и режим сглаживания.
- Геометрии — это объекты, представляющие простые и потенциально сложные фигуры.
Одним из наиболее полезных объектов, которые может создать фабрика, является ID2D1RenderTarget, описанном в следующем разделе.
Целевые объекты отрисовки
Целевой объект отрисовки — это ресурс, который наследует интерфейс ID2D1RenderTarget. Целевой объект отрисовки создает ресурсы для рисования и выполняет операции рисования. Существует несколько типов целевых объектов отрисовки, которые можно использовать для отрисовки графики следующими способами:
- ID2D1HwndRenderTarget объекты выводят содержимое в окно.
- ID2D1DCRenderTarget объекты рендерятся в контекст устройства GDI.
- Объекты растровой поверхности отрисовки отображают содержимое в растровом изображении вне экрана.
- Целевые объекты отображения DXGI выводятся на поверхность DXGI для использования с Direct3D.
Так как целевой объект отрисовки связан с определенным устройством отрисовки, он является ресурсом, зависящим от устройства, и перестает функционировать, если устройство удалено.
Рендеринг целевых функций
Можно указать, должен ли целевой объект отрисовки использовать аппаратное ускорение и должен ли удаленный дисплей отображаться локальным или удаленным компьютером. Целевые объекты отрисовки можно настроить для отрисовки с алиасингом или с антиалиасингом. Для отрисовки сцен с большим количеством примитивов разработчик может также отображать 2-D графику в режиме с алиасингом и использовать мультисемплинговое сглаживание D3D для повышения масштабируемости.
Целевые объекты отрисовки также могут группировать операции рисования на слои, представленные интерфейсом ID2D1Layer. Слои полезны для сбора операций рисования, чтобы объединять их при отрисовке кадра. В некоторых сценариях это может быть полезной альтернативой отрисовке в растровом целевом объекте и последующему использованию содержимого растрового изображения, поскольку затраты на выделение для слоев ниже, чем для ID2D1BitmapRenderTarget.
Целевые объекты отрисовки могут создавать новые, совместимые с ними целевые объекты, что полезно для промежуточной внеэкранной отрисовки при сохранении различных свойств, заданных на исходном целевом объекте.
Кроме того, можно выполнять отрисовку с помощью GDI на целевом объекте отрисовки Direct2D путем вызова QueryInterface на объекте отрисовки для ID2D1GdiInteropRenderTarget, который имеет методы GetDC и ReleaseDC, которые можно использовать для получения контекста устройства GDI. Отрисовка с помощью GDI возможна только в том случае, если целевой объект отрисовки был создан с набором флагов D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE. Это полезно для приложений, которые в основном отрисовываются с помощью Direct2D, но имеют возможность расширения или содержат устаревший контент, требующий отрисовки с помощью GDI. Дополнительные сведения см. в обзоре взаимодействия Direct2D и GDI.
Отрисовка целевых ресурсов
Как и фабрика, целевой объект отрисовки может создавать ресурсы для рисования. Все ресурсы, созданные целевым объектом отрисовки, — это ресурсы, зависящие от устройств (как и целевой объект отрисовки). Целевой объект отрисовки может создать следующие типы ресурсов:
- Растровые изображения
- Кисти
- Слои
- Сетки
Команды рисования
Для отрисовки содержимого используются методы рисования целевого объекта отрисовки. Перед началом рисования вызовите метод ID2D1RenderTarget::BeginDraw. После завершения рисования вызовите метод ID2D1RenderTarget::EndDraw. Между этими вызовами вы используете методы Draw и Fill для прорисовки графических ресурсов. Большинство методов отрисовки и заливки принимают форму (примитив или геометрию) и кисть для заполнения или обводки фигуры.
Целевые объекты отрисовки также предоставляют методы для обрезки, применения маски непрозрачности и преобразования пространства координат.
Direct2D использует левоориентированную систему координат: положительные значения оси x направлены вправо, а положительные значения оси Y увеличиваются вниз.
Обработка ошибок
Команды рисования целевого объекта не указывают, была ли запрошенная операция успешной. Чтобы узнать, были ли ошибки рисования, вызовите целевой метод Flush или метод EndDraw, чтобы получить HRESULT.
Ресурсы рисования
В следующих разделах описываются некоторые ресурсы, которые можно создать с помощью целевых и заводских интерфейсов отрисовки.
Кисти
Кисть, представленная интерфейсом ID2D1Brush, является ресурсом, зависящим от устройства, созданным целевым объектом отрисовки, который красит область с его выходными данными. Разные кисти дают разные результаты. Некоторые кисти красят участок однотонным цветом, другие - градиентом или изображением. Direct2D предоставляет четыре типа кистей:
- ID2D1SolidColorBrush покрывает область сплошным цветом.
- ID2D1LinearGradientBrush красит область линейным градиентом, который смешивает два или более цветов по линии, ось градиента.
- ID2D1RadialGradientBrush красит область с радиальным градиентом, который смешивает два или более цветов вокруг эллипса.
- ID2D1BitmapBrush красит область с растровым изображением.
Чтобы создать кисть, используйте один из методов ID2D1RenderTarget::Create*<Type>*Brush, например CreateRadialGradientBrush. Кисти можно использовать с методами рисования и заливки объектов отрисовки, либо для рисования штриха или контура фигуры, либо в качестве маски непрозрачности.
Дополнительные сведения о кистях см. в разделе Обзор кистей.
Геометрии
Помимо основных примитивов рисования, таких как точки, прямоугольники и многоточия, Direct2D предоставляет интерфейс ID2D1Geometry для описания простых и сложных фигур. Интерфейсы, наследуемые от ID2D1Geometry определяют различные типы фигур, например, ID2D1RectangleGeometry для представления прямоугольников, ID2D1RoundedRectangleGeometry для представления округлых прямоугольников и ID2D1EllipseGeometry для представления многоточий.
Более сложные фигуры можно создать с помощью интерфейса ID2D1GeometrySink, чтобы указать ряд фигур, состоящих из линий, кривых и дуг. идентификатор ID2D1GeometrySink передается методу Open ID2D1PathGeometry для создания сложной геометрии. ID2D1SimplifiedGeometrySink также можно использовать с API DirectWrite для извлечения контуров отформатированного текста для художественной отрисовки.
Интерфейсы геометрии предоставляют методы для управления фигурами путем расширения или упрощения существующих геометрий, а также путем создания пересечения или объединения нескольких геометрий. Они также предоставляют методы для определения того, пересекаются ли геометрии или перекрываются, получения информации о границах, вычисления площади или длины геометрии, и интерполяции местоположений вдоль геометрии. Direct2D также обеспечивает возможность создания сетки треугольников, тесселлированной из геометрии.
Чтобы создать геометрию, используйте один из методов ID2D1Factory::Create*<Type>*Geometry, например CreatePathGeometry. Геометрия — это независимый от устройства ресурс.
Чтобы отобразить геометрию, используйте методы DrawGeometry и FillGeometry целевого объекта отрисовки.
Дополнительные сведения о геометрии см. в Обзор геометрии.
Растровые изображения
Direct2D не предоставляет методы для загрузки или хранения растровых изображений; скорее, он позволяет создавать растровые изображения с помощью компонента образов Windows (WIC). Ресурсы растрового изображения можно загрузить с помощью WIC, а затем использовать для создания ID2D1Bitmap с помощью метода ID2D1RenderTarget::CreateBitmapFromWicBitmap.
Растровые изображения также можно создавать из данных в памяти, настроенных с помощью других средств. После создания растрового изображения его можно нарисовать с помощью целевого объекта отрисовки метода DrawBitmap или с помощью кисти растрового изображения.
Поскольку создание растровых ресурсов на аппаратных целевых ресурсах рисования часто является дорогой операцией, Direct2D может обновлять содержимое растрового изображения (или его части) с помощью методов CopyFromBitmap, CopyFromRenderTargetи CopyFromMemory. Использование этих методов может снизить затраты, связанные с дополнительными выделениями текстур GPU.
Рисование текста
Direct2D предназначен для работы с текстовыми операциями нового API текста DirectWrite. Чтобы упростить использование API DirectWrite, целевые объекты отрисовки предоставляют три метода для отрисовки текстовых ресурсов DirectWrite: DrawTextText, DrawTextLayoutи DrawGlyphRun. Так как Direct2D использует GPU для процесса отрисовки текста ClearType, Direct2D обеспечивает более низкое использование ЦП, чем GDI для текстовых операций и более высокую масштабируемость, так как доступно больше возможностей обработки GPU.
ID2D1RenderTarget::DrawText предназначен для самых простых сценариев, связанных с отрисовкой строки текста в формате Юникода с минимальным форматированием. Через метод ID2D1RenderTarget::DrawTextLayout предоставляется более сложная компоновка и гибкость типографики, который использует объект IDWriteTextLayout для указания содержимого и форматирования для отрисовки. IDWriteTextLayout позволяет указать индивидуальное форматирование для подстроок текста и других расширенных параметров типографии.
В сценариях, где требуется точный контроль макета уровня глифа, метод ID2D1RenderTarget::DrawGlyphRun можно использовать вместе с средствами измерения, предоставляемыми DirectWrite.
Чтобы использовать API DirectWrite, включите заголовок dwrite.h. Как и Direct2D, DirectWrite использует фабрику IDWriteFactory для создания объектов текста. Используйте функцию DWriteCreateFactoryдля создания фабрики, а затем используйте методы Create для создания ресурсов DirectWrite (например, IDWriteTextFormat).
Дополнительные сведения о DirectWrite см. в разделе Введение DirectWrite.
Примитивы Direct2D
Direct2D определяет набор примитивов, аналогичных тем, которые предоставляются другими API рисования. Предоставляется цветовая структура, матричная структура для выполнения преобразований, а также версии с плавающей запятой и целочисленные для точек, прямоугольников, эллипсов и структур размера. Обычно вы используете версии этих структур с плавающей запятой.
Вы не используете фабрику или целевой объект визуализации для создания экземпляров примитивов Direct2D. Их можно создать напрямую или использовать вспомогательные методы, определенные в d2d1helper.h для их создания.
Связанные разделы