Direct draw термины и концепции интерфейс directdrawclipper


Direct Draw 1

Автор Randall Glass Software (Сайт)
Языки Английский
Лицензия Freeware (Бесплатно )
Системы Windows All
Размер 159 Кб

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

DirectDraw — полнофункциональный менеджер видеопамяти. Это серьезный программный механизм, дающий пользователю возможность буквально напрямую использовать ресурсы видео ускорителя (графического адаптера). Его основное назначение предоставить программисту прямой доступ к работе с видеопамятью. С помощью данной утилиты можно легко осуществлять такие серьезные операции, как копирование, например, видеопамять -> видеопамять, работа со спрайтами (массивы из цветов, образовывающие анимацию), z — буферизация и т.д.

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

How do you draw text in DirectX 11?

In DirectX 10 you could use the font interface provided by D3DX10. In DirectX 11 you are supposed to use DirectWrite. But it looks like DirectWrite doesn’t speak natively to Direct3D? Is there something basic I’m missing? How do you draw simple text with DirectX 11?

4 Answers 4

As pointed out in comment, the link to RasterTek tutorials no longer functions, here is a link to Webarchive of RasterTek provided by RadioSpace.

The second point of the original answer is no longer valid either, because its now possible to share D3D11 backbuffer with Direct2D and through it draw text with DirectWrite.

RasterTek is still running: font rendering in D3D11

I know about two options

make your own font rendering engine see Rastertek DX11 tutorial

second option regarding direct write requires sharing backbuffer between d3d11 and d3d10.1 devices and using dwrite + d2d + d3d10.1 to render gui and d3d11 device to render 3d geometry and merge it all in backbuffer see the post from DieterVW on this thread

At this moment dwrite and d2d dont accept surface created with d3d11 device for rendering. But hopefully MS will make it so soon.

I recently converted a DirectX 10 application over to DirectX 11 and came across this post while searching for the same answer. The Rastertek tutorial mentioned by Zeela is good, but I continued searching and found FW1FontWrapper. After only about 30 minutes, I just finished integrating it into my project and it appears to be working great. The download section provides both x86 and x64 packages including header, library, and DLL. I am just doing a simple text output, so I can’t say a lot about the API, except that for what I did (outputting frames per second), it only took about 5 lines of code (including creating/releasing the wrapper object). Based on his samples it seems to provide a lot more options than what I’m using so far.

There’s a SpriteFont class in the DirectXTK library that can render text to a DirectX11 device context.

Use DirectWrite , it support high-quality text rendering, resolution-independent outline fonts, and full Unicode text and layout support.

Direct Draw 1.0

Размер: 159 Кб

Скачать

Автор Randall Glass Software
  • (Сайт)
  • Языки Русский
    Лицензия Freeware (Бесплатная)
  • Основная информация о программе

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

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

    В то же время DirectDraw использует не только видеопамять, но и обычную оперативную память (RAM). Кроме этого, при проектировании менеджеров памяти основное внимание уделяется не быстродействию, а надежности. При проектировании DirectDraw главной целью ставилось именно быстродействие.

    С технической точки зрения DirectDraw – это переносимый API в сочетании с набором драйверов устройств. В работе DirectDraw целиком обходит стандартный графический механизм Windows (GDI, интерфейс графических устройств). GDI за счет своего низкого быстродействия завоевал дурную славу, поэтому для достижения оптимальной скорости крайне важна независимость от него.

    Читать онлайн «Графика для Windows средствами DirectDraw» автора Трухильо Стэн — RuLit — Страница 8

    Далее рассмотрены функции интерфейса DirectDraw. Обратите внимание на то, что в оставшейся части этой главы термин интерфейс DirectDraw относится как к интерфейсу DirectDraw, так и к DirectDraw2. Уточнения будут приведены лишь в тех случаях, когда функция отличается в двух интерфейсах.

    Функции создания интерфейсов

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

    Функция CreateClipper() создает экземпляры интерфейса DirectDrawClipper. Объекты отсечения (clipper) используются не всеми приложениями DirectDraw, так что в некоторых программах эта функция может отсутствовать. Вскоре мы рассмотрим интерфейс DirectDrawClipper подробнее.

    Функция CreatePalette() создает экземпляры интерфейса DirectDrawPalette. Палитры, как и интерфейс DirectDrawClipper, используются не всеми приложениями DirectDraw. Например, приложению, работающему только с 16-битными видеорежимами, палитра не понадобится. Тем не менее приложение, работающее в 8-битном видеорежиме, должно создать хотя бы один экземпляр DirectDrawPalette.

    Экземпляры интерфейса DirectDrawSurface создаются функцией CreateSurface(). Поверхности обязательно присутствуют в любом приложении DirectDraw, работающем с графическими данными, поэтому данная функция используется очень часто.

    Экземпляры самого интерфейса DirectDraw создаются функцией DirectDraw Create(). DirectDrawCreate() — одна из немногих самостоятельных функций DirectDraw, не принадлежащих никакому COM-интерфейсу.

    Интерфейс DirectDraw позволяет точно узнать, какие возможности поддерживаются как на программном, так и на аппаратном уровне. Функция GetCaps() инициализирует два экземпляра структуры DDCAPS. Первая структура показывает, какие возможности поддерживаются непосредственно видеокартой, а вторая — что доступно посредством программной эмуляции. Функция GetCaps() помогает определить, поддерживаются ли нужные возможности.


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

    В DirectX SDK входит программа DXVIEW, которая сообщает о возможностях всех компонентов DirectX, в том числе и DirectDraw. На большинстве компьютеров информация о DirectDraw отображается в двух категориях: Primary Display Driver и Hardware Emulation Layer. Первая категория сообщает о возможностях аппаратных видеосредств. Во второй перечислены возможности, эмулируемые DirectDraw при отсутствии аппаратной поддержки. На компьютерах с двумя и более видеокартами, поддерживаемыми DirectDraw, DXVIEW выводит сведения о способностях каждой из них.

    Функция SetCooperativeLevel() определяет уровень кооперации — степень контроля над видеокартой, необходимую для данного приложения. Например, нормальный (normal) уровень кооперации означает, что приложение не сможет изменить текущий видеорежим или задать содержимое всей системной палитры. Монопольный (exclusive) уровень допускает переключение видеорежимов и предоставляет приложению полный контроль над палитрой. Независимо от выбранного уровня вам необходимо вызвать SetCooperativeLevel().

    Функции для работы с видеорежимами

    Интерфейс DirectDraw содержит четыре функции для работы с видеорежимами:

    С помощью функции EnumDisplayModes() можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes() перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes() не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640×480×8.

    Функция SetDisplayMode() активизирует заданный видеорежим. Версия SetDisplay Mode() из интерфейса DirectDraw2 позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisplayMode() присутствует в любой программе, осуществляющей переключение видеорежимов.

    Direct draw термины и концепции интерфейс directdrawclipper

    • UpdateOverlayDisplay()

    • UpdateOverlayZOrder()

    Функции GetOverlayPosition() и SetOverlayPosition() управляют положением оверлеев. Функция UpdateOverlay() изменяет параметры оверлея; в частности, она определяет, должен ли оверлей отображаться на экране и следует ли применять для него альфа-наложение или копирование с цветовым ключом.

    Функция UpdateOverlayDisplay() обновляет изображение с учетом новых значений параметров. Данная функция может обновить все изображение оверлея или ограничиться его прямоугольными областями, заданными функцией AddOverlayDirtyRect(). Наконец, функция EnumOverlayZOrders() используется для перебора оверлеев в порядке их Z-координаты (Z-координата определяет, какие оверлеи выводятся поверх других). Возможен перебор как в прямом порядке (от передних оверлеев к задним), так и в обратном (от задних — к передним).

    Функции для работы с объектами отсечения

    DirectDraw позволяет присоединить к поверхности экземпляр интерфейса DirectDrawClipper (который мы еще не рассматривали). После того как такое присоединение состоится, операция блиттинга на данную поверхность будет регулироваться объектом отсечения. Для работы с объектами отсечения в интерфейсе DirectDrawSurface имеются две функции:

    • GetClipper()

    • SetClipper()

    Функция SetClipper() присоединяет объект отсечения к поверхности. Функция GetClipper() возвращает указатель на присоединенный ранее объект отсечения. С помощью функции SetClipper() можно разорвать связь между поверхностью и объектом отсечения, для этого в качестве указателя на интерфейс DirectDrawClipper следует задать NULL.

    Палитры, как и объекты отсечения, можно присоединять к поверхностям. Для этой цели в интерфейсе DirectDrawSurface предусмотрены две функции:

    • GetPalette()

    • SetPalette()

    Функция SetPalette() присоединяет к поверхности экземпляр интерфейса DirectDrawPalette (о нем речь пойдет ниже). Функция GetPalette() применяется для получения указателя на палитру, присоединенную ранее.

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

    Интерфейс DirectDrawPalette предназначен для работы с палитровыми видеорежимами и поверхностями. Несмотря на то что в Windows поддерживается ряд видеорежимов с глубиной пикселей менее 8 бит, DirectDraw поддерживает лишь 8-битные палитровые режимы.

    Экземпляры интерфейса DirectDrawPalette создаются функцией CreatePalette() интерфейса DirectDraw. Функция CreatePalette() получает набор флагов, определяющих тип палитры.

    Интерфейс DirectDrawPalette содержит всего три функции:

    • GetCaps()

    • GetEntries()

    • SetEntries()

    Функция GetCaps() определяет возможности палитры. В числе получаемых сведений — количество элементов палитры, поддержка палитрой вертикальной синхронизации и (в случае 8-битной палитры) возможность заполнения всех 256 элементов.

    Для заполнения палитры используется функция SetEntries(). Содержимое палитры чаще всего берется из файла. Тем не менее значения элементов палитры можно рассчитать и занести в палитру во время выполнения программы. Функция GetEntries() возвращает значения элементов, ранее занесенных в палитру.

    Экземпляры интерфейса DirectDrawPalette присоединяются к поверхности функцией SetPalette() интерфейса DirectDrawSurface. Палитровая анимация выполняется либо присоединением разных палитр к первичной поверхности, либо изменением содержимого палитры функцией SetEntries().

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

    Экземпляры интерфейса DirectDrawClipper создаются функцией CreateClipper() интерфейса DirectDraw. Интерфейс DirectDrawClipper содержит следующие функции:

    • SetHWnd()

    • GetHWnd()

    • IsClipListChanged()

    • SetClipList()


    • GetClipList()

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

    Отсечение для рабочего стола активизируется функцией SetHWnd(). Функция SetHWnd() присоединяет объект отсечения к логическому номеру (handle) окна. В результате инициируется взаимодействие Windows с объектом отсечения. Объект отсечения получает уведомления обо всех изменениях окон на рабочем столе и действует соответствующим образом. Функция GetHWnd() определяет, к какому логическому номеру окна присоединен заданный объект отсечения (и присоединен ли он вообще). Функция IsClipListChanged() определяет, был ли внутренний список отсечений изменен вследствие изменений на рабочем столе.

    Функции SetClipList() и GetClipList() упрощают нестандартное использование интерфейса DirectDrawClipper. Функция SetClipList() определяет набор прямоугольных областей, для которых разрешено выполнение блиттинга. Функция GetClipList() извлекает внутренние данные объекта отсечения.

    После того как экземпляр DirectDrawClipper будет присоединен к поверхности, происходит автоматическое отсечение операций блиттинга, выполняемых функциями Blt(), BltBatch() и UpdateOverlay(). Обратите внимание на то, что в список не входит функция BltFast(). Для нее отсечение не поддерживается.

    Дополнительные интерфейсы DirectDraw

    Строго говоря, DirectDraw содержит еще три интерфейса, не рассмотренных нами:

    • DDVideoPortContainer

    • DirectDrawColorControl

    • DirectDrawVideoPort

    Эти интерфейсы, появившиеся в DirectX 5, предназначены для низкоуровневого управления видеопортами. Точнее, они предоставляют средства для потоковой пересылки «живого видео» на поверхности DirectDraw. Хотя с их помощью можно организовать в приложениях DirectDraw поддержку работы с видео, это не рекомендуется, за исключением случаев, когда высокоуровневые видео-API не отвечают вашим потребностям. В книге эти интерфейсы не рассматриваются.

    После рассмотрения всех интерфейсов и функций DirectDraw мы переходим к структурам данных. Всего в DirectDraw определено восемь структур:

    • DDBLTFX

    • DDCAPS

    • DDOVERLAYFX

    • DDPIXELFORMAT

    • DDSURFACEDESC

    • DDSCAPS

    • DDBLTBATCH

    • DDCOLORKEY

    С некоторыми из этих структур мы уже встречались. Например, структура DDCOLORKEY упоминалась при обсуждении функции SetColorKey() интерфейса DirectDrawSurface. В настоящем разделе мы не станем детально рассматривать каждую структуру, а вместо этого разберемся с одной особенностью DirectDraw, которая способна причинить немало бед, если о ней забыть.

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

    Например, фрагмент для работы со структурой DDSURFACEDESC может выглядеть так:

    Сначала мы объявляем структуру, затем присваиваем полю dwSize значение, используя функцию sizeof(). После этого структура передается функции GetSurfaceDesc() интерфейса DirectDrawSurface. Если забыть присвоить значение полю dwSize, вызов функции закончится неудачей.

    На первый взгляд это выглядит глупо. С какой радости DirectDraw настаивает на передаче размера структуры, в ней же и определенной? Причина, по которой эти пять структур содержат поле dwSize, состоит в том, что в будущем они могут измениться. DirectDraw будет проверять размер структуры и по нему определять ее версию. Сейчас DirectDraw требует передачи правильного размера, чтобы приучить к этому разработчиков. Позднее это окупится, поскольку дальнейшие версии DirectDraw смогут корректно работать со старыми программами DirectDraw.

    «Графика для Windows средствами DirectDraw»: Стэн Трухильо 1
    Предисловие 1
    Введение 1
    Для чего написана эта книга 1
    Требования к читателю 1
    Программные требования 2
    Аппаратные требования 2
    Глава 1. Краткий курс DirectDraw 2
    Что такое DirectDraw? 2
    Спецификация COM фирмы Microsoft 4
    DirectDraw API 4
    Интерфейсы DirectDraw и DirectDraw2 4
    Интерфейсы DirectDrawSurface 6
    Интерфейс DirectDrawPalette 8
    Интерфейс DirectDrawClipper 8
    Дополнительные интерфейсы DirectDraw 8
    Структуры DirectDraw 8
    Создание приложений DirectDraw 9
    Подготовка инструментов 9
    Глава 2. Проблемы быстродействия 10
    Глава 3. За кулисами DirectDraw 12
    DirectDraw AppWizard 12
    Создание приложения Bounce 13
    Структура приложения 13
    Инициализация DirectDraw 14
    Создание поверхностей 16
    Графический вывод 18
    Оконные приложения 20
    Глава 4. Видеорежимы и частота смены кадров 21
    Переключение видеорежимов 21
    Обнаружение видеорежимов и частот смены кадров 22
    Вычисление FPS 23
    Графический вывод 24
    Обработка пользовательского ввода 25
    Частота смены кадров 26
    Глава 5. Поверхности и форматы пикселей 28
    Поверхности 28
    BMP-файлы 31
    Программа BmpView 34
    Глава 6. DirectInput 38
    Что такое DirectInput? 38
    DirectInput API 39
    Программа Qwerty 40
    Инициализация DirectInput 40
    Управление версией DirectInput 42
    Программа Smear 42
    Глава 7. Проблема курсора 44
    Частичное обновление экрана 44
    Многопоточность 45
    Решение проблемы курсора 46
    Программа Cursor 47
    Глава 8. Воспроизведение видеороликов 50
    Начальные сведения 50
    Программа AviPlay 52
    Глава 9. Проверка столкновений 55
    Общее решение 55
    Функции проверки столкновений 56
    Класс Sprite 57
    Программа Bumper 59
    Приложение А. Информация для разработчиков 60
    Отладка 60
    Замечания о Visual C++ 64
    Советы и рекомендации 66

    Лучшие электронные книги в формате fb2
    Наш портал – это библиотека интересных электронных книг разнообразных жанров. Здесь вы найдете произведения как российских, так и зарубежных писателей. Все электронные книги, представленные на нашем сайте, можно скачать бесплатно. Наша библиотека содержит только лучшие бесплатные электронные книги, ведь каждую электронную книгу мы тщательно изучаем перед добавлением в базу. Мы выбираем интереснейшие произведения в удобном формате fb2, все они достойны вашего внимания. Чтение электронных книг наверняка принесет вам удовольствие. Всё что, что вам нужно сделать, — найти и скачать книгу, которая понравится вам по заголовку и описанию.
    Библиотека fb2-электронных книг – полезнейшее изобретение человечества. Для того чтобы, читать книгу, вам нужно просто загрузить ее с нашего сайта. Вы можете наслаждаться чтением, не совершая лишние траты. Электронная книга, в отличие от бумажной, обладает множеством преимуществ. Вы экономите время и силы, не совершая утомительные походы по магазинам. Вам также не нужно обременять себя ношением тяжеловесной макулатуры. Скачать и читать электронную книгу легко и просто . Мы позаботились о том, чтобы вам всегда было что почитать. Электронная книга fb2 принесет вам море положительных эмоций: она способна поделиться с вами мудростью, поднять настроение или просто скрасить досуг.

    Графика для Windows средствами DirectDraw (5 стр.)

    Функции создания интерфейсов

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

    • CreateClipper()

    • CreatePalette()

    • CreateSurface()

    Функция CreateClipper() создает экземпляры интерфейса DirectDrawClipper. Объекты отсечения (clipper) используются не всеми приложениями DirectDraw, так что в некоторых программах эта функция может отсутствовать. Вскоре мы рассмотрим интерфейс DirectDrawClipper подробнее.

    Функция CreatePalette() создает экземпляры интерфейса DirectDrawPalette. Палитры, как и интерфейс DirectDrawClipper, используются не всеми приложениями DirectDraw. Например, приложению, работающему только с 16-битными видеорежимами, палитра не понадобится. Тем не менее приложение, работающее в 8-битном видеорежиме, должно создать хотя бы один экземпляр DirectDrawPalette.

    Экземпляры интерфейса DirectDrawSurface создаются функцией CreateSurface(). Поверхности обязательно присутствуют в любом приложении DirectDraw, работающем с графическими данными, поэтому данная функция используется очень часто.

    Экземпляры самого интерфейса DirectDraw создаются функцией DirectDraw Create(). DirectDrawCreate() — одна из немногих самостоятельных функций DirectDraw, не принадлежащих никакому COM-интерфейсу.


    Интерфейс DirectDraw позволяет точно узнать, какие возможности поддерживаются как на программном, так и на аппаратном уровне. Функция GetCaps() инициализирует два экземпляра структуры DDCAPS. Первая структура показывает, какие возможности поддерживаются непосредственно видеокартой, а вторая — что доступно посредством программной эмуляции. Функция GetCaps() помогает определить, поддерживаются ли нужные возможности.

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

    DirectX Viewer

    В DirectX SDK входит программа DXVIEW, которая сообщает о возможностях всех компонентов DirectX, в том числе и DirectDraw. На большинстве компьютеров информация о DirectDraw отображается в двух категориях: Primary Display Driver и Hardware Emulation Layer. Первая категория сообщает о возможностях аппаратных видеосредств. Во второй перечислены возможности, эмулируемые DirectDraw при отсутствии аппаратной поддержки. На компьютерах с двумя и более видеокартами, поддерживаемыми DirectDraw, DXVIEW выводит сведения о способностях каждой из них.

    Функция SetCooperativeLevel() определяет уровень кооперации — степень контроля над видеокартой, необходимую для данного приложения. Например, нормальный (normal) уровень кооперации означает, что приложение не сможет изменить текущий видеорежим или задать содержимое всей системной палитры. Монопольный (exclusive) уровень допускает переключение видеорежимов и предоставляет приложению полный контроль над палитрой. Независимо от выбранного уровня вам необходимо вызвать SetCooperativeLevel().

    Функции для работы с видеорежимами

    Интерфейс DirectDraw содержит четыре функции для работы с видеорежимами:

    • EnumDisplayModes()

    • GetDisplayMode()

    • RestoreDisplayMode()

    • SetDisplayMode()

    С помощью функции EnumDisplayModes() можно получить от DirectDraw список доступных видеорежимов. По умолчанию EnumDisplayModes() перечисляет все видеорежимы, но по описаниям можно исключить из списка режимы, не представляющие для вас интереса. Функция EnumDisplayModes() не обязана присутствовать в программе, однако это желательно, если вы собираетесь организовать переключение видеорежимов. На рынке существует огромное количество видеоустройств, каждое из которых обладает своими возможностями и ограничениями. Не стоит полагаться на автоматическую поддержку любого конкретного видеорежима, за исключением принятого по умолчанию в Windows режима 640×480×8.

    Функция SetDisplayMode() активизирует заданный видеорежим. Версия SetDisplay Mode() из интерфейса DirectDraw2 позволяет дополнительно задать частоту смены кадров. Этим она отличается от функции из интерфейса DirectDraw, в которой можно задать только горизонтальное и вертикальное разрешения и глубину пикселей. Функция SetDisplayMode() присутствует в любой программе, осуществляющей переключение видеорежимов.

    Функция RestoreDisplayMode() восстанавливает видеорежим, действовавший до вызова SetDisplayMode(). Перед вызовом функций SetDisplayMode() и RestoreDisplayMode() необходимо предварительно установить монопольный уровень кооперации вызовом функции SetCooperativeLevel().

    Функции для работы с поверхностями

    Помимо функции CreateSurface() интерфейс DirectDraw содержит следующие функции для работы с поверхностями:

    • DuplicateSurface()

    • EnumSurfaces()

    • FlipToGDISurface()

    • GetGDISurface()

    • GetAvailableVidMem()

    • Compact()

    Функция DuplicateSurface() создает копию существующей поверхности. Она копирует только интерфейс поверхности, но не ее содержимое. Копия поверхности использует ту же область памяти, поэтому модификация содержимого памяти приведет к изменению изображения, представленного обеими поверхностями.

    Функция EnumSurfaces() используется для перебора всех поверхностей, удовлетворяющих заданному критерию. Если критерий не указан, составляется список всех существующих поверхностей.

    Функция FlipToGDISurface() используется перед завершением приложения, осуществляющего переключение страниц, чтобы обеспечить правильное восстановление первичной поверхности. Вспомните о том, что при переключении страниц происходит попеременное отображение двух поверхностей. Это означает, что приложение может завершиться, не восстановив исходной поверхности, отображаемой на экране. Если это произойдет, Windows будет осуществлять вывод на невидимую поверхность. Такой ситуации можно легко избежать с помощью функции FlipToGDISurface().

    Функция GetGDISurface() возвращает указатель на единственную поверхность, с которой работает GDI. Весь графический вывод Windows осуществляется именно на поверхность GDI. Примером ситуации, когда эта функция может оказаться полезной, является программа копирования экрана, в которой DirectDraw используется для копирования произвольной части рабочего стола.

    Функция GetAvailableVidMem() возвращает объем текущей доступной видеопамяти. Эта функция присутствует в интерфейсе DirectDraw2, но отсутствует в DirectDraw. С ее помощью приложение может определить, сколько поверхностей ваше приложение сможет создать в видеопамяти.

    Функция Compact() не реализована в DirectX, однако в будущем она обеспечит механизм дефрагментации видеопамяти. Если ваше приложение постоянно создает и уничтожает поверхности, находящиеся в видеопамяти, дефрагментация может высвободить немало места.

    Рисование с Direct2D

    В июня выпуске журнала MSDN Magazine (msdn.microsoft.com/magazine/dd861344.aspx), представленные Direct2D, новой ДВУМЕРНАЯ графика API предназначены для поддержки наиболее ресурсоемких и визуально форматированного настольных приложений с наиболее возможную производительность. В этой статье я описал, где Direct2D поместился в среди различных графических API Windows, его архитектуру и принципы. В частности я подробно описаны основы использования Direct2D надежно и эффективно для отрисовки внутри окна. Включить создание ресурсов для конкретных устройств, а также аппаратно независимых ресурсов и их соответствующих жизненных циклов. Если вы еще не сделано, я бы рекомендую прочитать статью перед продолжением работы здесь, как в этой статье многом построение после основой определены извлечение существует.

    Отображение и управление

    Полезно подумать о Direct2D как аппаратным ускорением отрисовка 2-D API. Конечно поддерживает возврата программного обеспечения, но момент здесь является Direct2D о визуализации. В отличие от других рисунков API Windows Direct2D использует компонентную подход к рисункам. Он не предоставляет собственной API для кодирования и декодирования точечные рисунки, макет текста, управления шрифтов, анимации, объем и т. д. Вместо этого уделяется визуализации и контролировать обработки графики (GPU) обеспечивая первым классом ловит другие API, сосредоточиться на макет текста и изображений. Direct2D однако, обеспечить примитивы для представления различных типов кистей, а также простые и сложные фигуры, строительные блоки для любого приложения ДВУМЕРНАЯ графика.

    В этой статье я собираюсь показать, как рисовать Direct2D. Я будет начинаться путем введения структуры цвет Direct2D и продемонстрировать способы создания различных типов кистей. В отличие от большинства других графических интерфейсов API Windows Direct2D не предоставляет «Перо»простые, поэтому кисти важны довольно используемые для всех задач контура и заполнения. С этим в сторону, я покажу, как Рисование простых фигур.

    Цвета

    Direct2D использует простую структуру, представляющий цвета с компонентами цвета с плавающей запятой. Тип D2D1_COLOR_F является typedef для структуры D3DCOLORVALUE, используемое Direct3D для описания значения цвета. Он включает отдельные значения с плавающей запятой для красного, зеленого, синего и альфа-каналов. Значения в диапазоне от 0.0 до 1.0 с 0.0 черные цветовые каналы и полностью прозрачным для альфа-канала.

    Вот как выглядит:

    Direct2D предоставляет вспомогательный класс ColorF D2D1 пространства имен, наследует D2D1_COLOR_F и определяет некоторые общие константы цвета, но важнее предоставляет несколько полезных конструкторы, инициализировать структуру D2D1_COLOR_F. Можно, например, определить красный следующим образом:


    Другой конструктор принимает упакованный RGB-значение и преобразует его отдельные цветовые каналы. Вот красный снова:

    Это именно то же самое как с помощью следующие значения перечисления:

    Хотя краткая, используя упакованный представление RGB съесть вверх небольшое больше циклов ПРОЦЕССОРА необходимости различные цветовые каналы для извлечения и преобразуется в их перемещаемые точки эквиваленты, поэтому использовать его с осторожностью.

    Все конструкторы принимать дополнительное альфа-значение, которое по умолчанию 1.0, или полностью непрозрачным. Таким образом полупрозрачным синего цвета можно выразить следующим образом:

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

    Кисти

    В отличие от структур простой цвет кисти являются ресурсами, через интерфейсы. Они используются для рисования линий, для рисования и заполнения фигур и рисования текста. Интерфейсы, которые являются производными от ID2D1Brush представляют различные типы кистей, предоставляемых Direct2D. Сам интерфейс ID2D1Brush позволяет управления непрозрачности кисти как единое целое, а не изменение альфа-канала цвета кисти. Это может быть особенно полезно с некоторыми интереснее типов кистей.

    Вот как может Установите непрозрачность кисти на 50 процентов.

    ID2D1Brush также позволяет управлять преобразование, применяемое к кисти с момента, в отличие от Windows Presentation Foundation (WPF), кисти адаптировать система координат целевого буфера визуализации, а не с определенной фигуры, они могут рисования.

    Различные методы целевого визуализации для создания кисти все принимают структуру необязательных D2D1_BRUSH_PROPERTIES, которые могут использоваться для задания начального непрозрачности и преобразования.

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

    Как его названию, интерфейс ID2D1SolidColorBrush представляет сплошной цветной кисти. Он добавляет методы для управления цветом, используемым кисти. Сплошной цветной кисти создается с помощью метода CreateSolidColorBrush целевого буфера визуализации:

    Я собираюсь оставить полное обсуждение фигуры для следующего раздела, но в целях обеспечения необходимости что-нибудь для просмотра, я будет просто заполнения целевого буфера визуализации в окне с помощью прямоугольника, на основе размера целевого буфера визуализации. Следует помнить, что Direct2D использует аппаратно независимых точек (DIPs). Как следствие размер, сообщенные конкретного устройства, например клиентской области окна рабочего стола, может не соответствовать размера целевого буфера визуализации. К счастью очень легко получить размер целевого буфера визуализации в с помощью метода GetSize DIPs. Возвращает GetSize D2D1_SIZE_F структуры, Direct2D используется для представления размеры с двумя с плавающей запятой указывать значения ширины и высоты. Затем я может предоставить описание области для заполнения с помощью вспомогательная функция RectF и подключить сообщенные целевого буфера визуализации размер переменной D2D1_RECT_F. И, наконец, я могу использовать метод FillRectangle целевого буфера визуализации выполнить фактическое рисунка.

    Вот как выглядит код:

    На рис. 1 показано окно как выглядит сплошной зеленой кистью. Очень интересные действительно!

    Direct2D также поддерживает два типа градиентные кисти. Кисти градиента является, заполняет область цвета смешением вдоль оси. Кисти линейного градиента определяет ось как прямую линию с начальной и конечной точки. Кисти радиального градиента определяет ось как эллипса, где цвета radiate наружу из некоторые точки относительно центра эллипса.

    Градиент определяется как последовательность относительные позиции от 0,0 до 1,0. Каждый имеет собственный цвет и вызывается ограничителя градиента. Имеется возможность использовать позиций за пределами этого диапазона для создания различных эффектов. Чтобы создать градиентную кисть, сначала необходимо создать коллекцию ограничителя градиента. Начните определение массива структур D2D1_GRADIENT_STOP.

    Далее вызовите метод CreateGradientStopCollection целевого буфера визуализации для создания объекта коллекции зависимости массив позициями градиента:

    Первый параметр — указатель на массив и второй параметр предоставляет размер массива. Здесь я просто использую макрос стандартных _countof. Метод CreateGradientStopCollection возвращает новой коллекции. Для создания кисти линейного градиента, необходимо также обеспечивают структуру D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES для указания начала и конечная точка оси градиента. В отличие от позиции градиента эти точки находятся в пространстве координат кисть, которая обычно это для целевого буфера визуализации Если преобразование не установлен на кисти. Например можно создать кисть с ось, которая следующим запускается из верхнего левого угла целевого буфера визуализации нижний правый угол:

    LinearGradientBrushProperties является другой функцией вспомогательный, предоставляемые Direct2D инициализировать структуру D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES. Метод CreateLinearGradientBrush принимает это вместе с коллекцией градиента, показанного выше и возвращает указатель интерфейса ID2D1LinearGradientBrush, представляющий новой кисти.

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

    Вот как выглядит код прорисовки.

    На рис. 2 показано окно как выглядит с помощью кисти линейного градиента.

    Для создания кисти радиального градиента, необходимо предоставить структуру D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES. Эта структура определяет эллипса, а также смещением относительно центра эллипса, представляющий начало координат, из которых кисть «излучает»цвет, в зависимости от коллекции ограничителя градиента. Следующий пример формирует эллипс, центрируется целевого буфера визуализации, имеет X и Y radius в соответствии с целевого буфера рендеринга и происхождение половину способ сторону нижний правый угол:

    RadialGradientBrushProperties является другой функцией вспомогательный, предоставляемые Direct2D инициализировать структуру D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES. Метод CreateRadialGradientBrush принимает это вместе с коллекцией градиента, показанного выше и возвращает указатель интерфейса ID2D1RadialGradientBrush, представляющий новой кисти.

    Можно также изменить эллипс и происхождение кисти в любое время следующим образом:

    На рис. 3 показано кисти радиального градиента.

    Direct2D также предоставляет кисти точечного рисунка, но Оставим обсуждение Direct2D точечные рисунки для будущей статьи.

    Фигуры

    До сих я показал, можно только способы заливки прямоугольника, так что МНЕ удалось сосредоточиться на кисти, но Direct2D сделать так много более простой прямоугольников. Новичкам следует иметь в виду прямоугольники, закругленные прямоугольники и эллипсы предоставляются примитивов. По примитивы я просто значит является обычный старую структуру данных для каждого из этих.

    D2D1_RECT_F представляет прямоугольник с плавающей запятой и сам является typedef D2D_RECT_F:

    D2D1_ROUNDED_RECT представляет Скругленный прямоугольник и определен с radiuses, определение эллипсы квартал, который будет использоваться для рисования углы следующим образом:

    D2D1_ELLIPSE представляет эллипса и определен с центральной точки, а также radiuses:

    Хотя эти структуры может показаться не слишком интересными, существуют две причины их упомянуть заранее. Во-первых они используются для создания более сложных объектов геометрии. Во-вторых Если необходимо заполнить или один из этих примитивов рисования, вы должны придерживаться с ними как обычно возникнет лучшую производительность, если избежать геометрических объектов.

    Целевые буферы визуализации предоставляют набор из заполнения действия методы и для заполнения и структура этих примитивов. Пока я показал как использовать метод FillRectangle. Я не расточки, с примерами FillRoundedRectangle и FillEllipse методов, как они работают точно так же. В отличие от для методов заливки методы рисования может использоваться для структуры конкретной фигуры и являются весьма гибким. Как методов заливки действия методы, охватывающие все три примитивов работать в точно так же, поэтому расскажу только метод DrawRectangle.

    В простейшем виде можно нарисовать контур прямоугольника следующим образом:

    Третий параметр указывает ширину штрих, который рисуется контур прямоугольника. Штриха сам центрируется на прямоугольник, если заполнено этот же прямоугольник будет видно штриха и заливки перекрываются по 10.0 DIPs. Дополнительный четвертый параметр может быть предоставлено для управления стиль штрих, который рисуется. Это полезно, если требуется Рисование пунктирной линии или просто хотите управлять типом соединения с вершины фигуры.


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

    Если требуется просто штриха использовать определенный тип соединения, можно создать стиль штриха следующим образом:

    Структура D2D1_STROKE_STYLE_PROPERTIES предоставляет множество элементов управления различными аспектами стиля штриха, в частности фигуры или отрезка на каждом конце структуры или тире, а также сам стиль тире. Второй и третий параметр для метода CreateStrokeStyle являются необязательными и необходимо предоставить их только при определении стиля пользовательские пунктирной штриха. Чтобы определить стиль штрихов пунктирной линией, убедитесь, в пары указан тире. Первый элемент в каждой паре равна длине дефиса, а второй — длина пробел перед следующей тире. Сами значения умножаются ширина штриха. Можно задать столько пар при необходимости произвести нужный шаблон. Приведем пример:

    Можно выбрать любой из количество различных тире стилей из перечисления D2D1_DASH_STYLE вместо определения собственных. На рис. 4 показан некоторые стили, различные штрих на работе. Если внимательно посмотрите вы увидите, что переходит Direct2D автоматически альфа-сглаживание примитива для лучше выглядящие результатов.

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

    Использование Direct2D и DirectWrite в .Net-среде

    Несмотря что «нагуглить» в интернете можно все, для новых технологий это далеко не так. В частности, когда я захотел использовать достаточно новые технологии Direct2D (не бойтесь, это никак не связано с DirectX 7) и DirectWrite в своем .Net-приложении, то столкнулся с проблемой что примеров взаимодействия этих библиотек и .Net нет. Поэтому пришлось самому покопаться.
    Upd.: переношу в C++ т.к. дотнетчикам явно не интересно.

    Сначала следует пояснить что это за библиотеки. Direct2D – это новый API от Microsoft для быстрого, аппаратно-усторенного рисования двухмерной графики. Такое нововведение обрадовало бы тех, кто пока должен смиряться с тормозами GDI+ но, увы, на данный момент этот функционал доступен только из С++. Да, работа над оберткой ведется, например, командой SlimDX, но использовать хочется сегодня, поэтому снова лезем в P/Invoke.

    Вторая библиотечка – DirectWrite – сделана для качественного отображения текста. Под «качественным» подразумевается поддержка ClearType и OpenType-фич, которые важны в основном для тех кто любит типографику. Естественно, DirectWrite намного быстрее чем другие кустарные и неэффективные методы получения аналогичного результата.

    Warning: все это счастье доступно через DirectX 10.1, т.е. работает только в Висте и 7ке (а также в 2008 и 2008R2 соответственно). Да и еще, для того чтобы разрабатывать под эти фреймворки нужно скачать и установить последний Windows SDK (имеется ввиду тот, который для Windows 7/2008R2, я его в подписке долго искал) т.к. by default эти фичи с Visual Studio не поставляются.

    Библиотека DirectDraw использует т.н. «легковесный COM» что в переводе на русский означает что собственно COM-конструкты à la QueryInterface() не будут появляться в вашем коде слишком часто. Единственное – останутся постоянные проверки возвращаемых результатов на корректность. Да, и еще нужно после использования интерфейсов релизить их, или использовать что-нть вроде CComPtr (хотя для этого вроде как нужно втыкать поддержку ATL – точно не знаю т.к. не пробовал).

    Помимо DirectDraw, мы будем использовать некий компонент под названием Windows Imaging Component или просто WIC. Для наших (точнее моих) целей этот компонент актуален т.к. я планирую пробрасывать все тот же старый добрый System.Drawing.Bitmap из моего .Net-кода, и рисовать в него с помощью D2D/DWrite.

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

    [DllImport( «Typografix.Bitmap.dll» , CallingConvention = CallingConvention.Cdecl, ExactSpelling = true ,

    EntryPoint = «?RenderMarkup@@YAXPEAEPEB_WHHH1M@Z» , CharSet = CharSet.Unicode)]

    public static extern void RenderMarkup(IntPtr dst, string markup, int width,

    int height, int str >string fontFamily, float fontSize);

    Прошу прощения за многословность в опредении – это проблема 64-битной разработки и я об этом уже писал. Вот собственно аналог на С++. Как вы уже наверное догадались, функция просто рисует текст на предоставленной картинке. Для начального примера пойдет.

    MYAPI void RenderMarkup( BYTE * dst, LPCWSTR markup, int w >int height,

    int str >LPCWSTR fontFamily, float fontSize)

    Итак, суть всей затеи в том чтобы воспользоваться конструктами D2D и DW для того чтобы что-то там нарисовать. Первый этап – это создать фабрики, причем не одну а целых три – для Direct2D, DirectWrite и WIC соответственно. Тем кто работал в DirectX это будет знакомо:

    IWICImagingFactory *pWICFactory = NULL;

    Загрузка изображений(DirectDraw)

    Вопрос номер 1. Какого формата загружаются картинки в видеопамять через DirectDraw?

    oistalker уверен?!
    RAW это вроде аудио файл!
    Где то слыхал что BMP либо DDS но точно не уверен!

    @ndrei
    В принципе можно любой формат загрузить.

    HappyMan а какой посоветуешь!

    @ndrei
    Я когда програмил под DirectDraw грузил из BMP с палитрой. (256 цветов сжатый)
    Если умело рисовать, то 256 цветов должно хватить, а размер у таких файлов очень маленький.
    А тебе для чего вообще?

    Делать порты игр Dendy

    RAW это сырые данные, не суть важно, что это — аудиовыборка или набор пикселей, DirectDraw предоставляет поверхности с определенным форматом пикселя, т.е. напрямую можно загрузить только сырые данные с соответствующим форматом пикселя. А если не напрямую, то можно загрузить все, что угодно начиная с jpg и заканчивая белым шумом.

    Напрямую нехочеться! Лучше тогда BMP. Кто знает структуру BMP на 256 цветов?

    @ndrei
    >Кто знает структуру BMP на 256 цветов?
    MSDN знает!

    MSDN не ставиться. Ошибку выдаёт. dDIMA если знаешь, подскажи!

    @ndrei
    >MSDN не ставиться. Ошибку выдаёт. dDIMA если знаешь, подскажи!
    Ай яй яй. Неужели к gamedev.ru доступ есть, а к http://msdn.microsoft.com/library/ нету?
    Самому искать ссылки лень, посмотри описание структур BITMAPINFOHEADER и BITMAPINFO. В этом разделе все есть.

    >Лучше тогда BMP. Кто знает структуру BMP на 256 цветов?

    54 (иногда 56 байт) заголовок
    768 байт палитра
    далее идут данные, построчно с выравниванием на 8 байт к каждой строке, изображение
    перевернуто сверху вниз.

    oistalker
    Выравнивание в БМП — 4 байта

    А не проще ли тогда загружать BMP через стандартные функции LoadImage/StretchBlt и класс HBITMAP? Просто поищи в примерах для DirectDraw

    Илон Маск рекомендует:  Валидация тегов
  • Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL