Стэн Трухильо - Графика для Windows средствами DirectDraw
- Название:Графика для Windows средствами DirectDraw
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стэн Трухильо - Графика для Windows средствами DirectDraw краткое содержание
Графика для Windows средствами DirectDraw - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Палитру можно присоединить к любой поверхности, однако действовать она будет лишь в том случае, если поверхность является первичной. Палитра, присоединенная к первичной поверхности, управляет палитрой видеокарты.
Интерфейс DirectDrawPalette
Интерфейс DirectDrawPaletteпредназначен для работы с палитровыми видеорежимами и поверхностями. Несмотря на то что в Windows поддерживается ряд видеорежимов с глубиной пикселей менее 8 бит, DirectDraw поддерживает лишь 8-битные палитровые режимы.
Экземпляры интерфейса DirectDrawPaletteсоздаются функцией CreatePalette()интерфейса DirectDraw. Функция CreatePalette()получает набор флагов, определяющих тип палитры.
Интерфейс DirectDrawPalette содержит всего три функции:
• GetCaps()
• GetEntries()
• SetEntries()
Функция GetCaps()определяет возможности палитры. В числе получаемых сведений — количество элементов палитры, поддержка палитрой вертикальной синхронизации и (в случае 8-битной палитры) возможность заполнения всех 256 элементов.
Для заполнения палитры используется функция SetEntries(). Содержимое палитры чаще всего берется из файла. Тем не менее значения элементов палитры можно рассчитать и занести в палитру во время выполнения программы. Функция GetEntries()возвращает значения элементов, ранее занесенных в палитру.
Экземпляры интерфейса DirectDrawPaletteприсоединяются к поверхности функцией SetPalette()интерфейса DirectDrawSurface. Палитровая анимация выполняется либо присоединением разных палитр к первичной поверхности, либо изменением содержимого палитры функцией SetEntries().
Интерфейс DirectDrawClipper
Интерфейс 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 мы переходим к структурам данных. Всего в DirectDraw определено восемь структур:
• DDBLTFX
• DDCAPS
• DDOVERLAYFX
• DDPIXELFORMAT
• DDSURFACEDESC
• DDSCAPS
• DDBLTBATCH
• DDCOLORKEY
С некоторыми из этих структур мы уже встречались. Например, структура DDCOLORKEYупоминалась при обсуждении функции SetColorKey()интерфейса DirectDrawSurface. В настоящем разделе мы не станем детально рассматривать каждую структуру, а вместо этого разберемся с одной особенностью DirectDraw, которая способна причинить немало бед, если о ней забыть.
Пять (точнее, первые пять) из восьми перечисленных структур содержат поле с именем dwSize, в котором хранится размер структуры. Присвоение значения этому полю лежит на вашей ответственности. Более того, все функции DirectDraw, получающие эти структуры в качестве аргументов, не смогут работать, если полю dwSizeне будет присвоено правильное значение.
Например, фрагмент для работы со структурой DDSURFACEDESCможет выглядеть так:
DDSURFACEDESC surfdesc;
surfdesc.dwSize = sizeof(surfdesc);
surf->GetSurfaceDesc(&surfdesc);
Сначала мы объявляем структуру, затем присваиваем полю dwSizeзначение, используя функцию sizeof(). После этого структура передается функции GetSurfaceDesc()интерфейса DirectDrawSurface. Если забыть присвоить значение полю dwSize, вызов функции закончится неудачей.
На первый взгляд это выглядит глупо. С какой радости DirectDraw настаивает на передаче размера структуры, в ней же и определенной? Причина, по которой эти пять структур содержат поле dwSize, состоит в том, что в будущем они могут измениться. DirectDraw будет проверять размер структуры и по нему определять ее версию. Сейчас DirectDraw требует передачи правильного размера, чтобы приучить к этому разработчиков. Позднее это окупится, поскольку дальнейшие версии DirectDraw смогут корректно работать со старыми программами DirectDraw.
Раз уж речь зашла о структурах, следует упомянуть, что перед использованием структур желательно заполнять их нулями. В этом случае предыдущий фрагмент будет выглядеть так:
Читать дальшеИнтервал:
Закладка: