Microsoft DirectX 2

       

IUnknown


Все интерфейсы COM получены из интерфейса, называемого IUnknown. Интерфейс IUnknown обеспечивает DirectX контролем над сроком службы объекта, и способностью управлять многократными интерфейсами. IUnknown имеет только три метода:

AddRef, который увеличивает счет ссылки объекта на 1, когда интерфейс или  прикладная программа привязывает себя к объекту.

Release, который декрементирует счет ссылки объекта на 1. Когда счет достигает 0, объект освобожден.

QueryInterface, который делает запрос объекта относительно особенностей, которые объект поддерживает, возвращает указатель на специфический интерфейс.

AddRef и Release устанавливают счет ссылки специфического объекта. Например, если Вы создаете объект DirectDrawSurface, счет ссылки объекта увеличен на 1. Каждый раз функция возвращает указатель на интерфейс для того объекта, она должна затем вызвать AddRef через тот указатель, чтобы увеличить счет ссылки. Все обращения AddRef должны быть согласованы с обращением Release. Прежде, чем указатель может быть разрушен, Вы должны вызвать Release через тот указатель. Как только счет ссылки специфического объекта достигает 0, объект разрушается, и все интерфейсы к объекту затем недопустимы.

QueryInterface определяет, поддерживает ли объект специфический интерфейс. Если интерфейс поддерживается, QueryInterface возвращает указатель на этот специфический интерфейс. Вы можете затем использовать методы, содержащиеся в том интерфейсе, чтобы связаться с объектом. Если QueryInterface успешно возвращает указатель на интерфейс, он неявно вызывает  AddRef, чтобы увеличить счет ссылки, так что ваша прикладная программа должна вызвать Release для уменьшения счета ссылки перед разрушением указателя на интерфейс.



Изменение режимов и исключительного доступа


Режимы дисплея могут быть изменены, используя метод IDirectDraw2:: SetDisplayMode. Режимы могут быть изменены любой прикладной программой,  совместно использующей плату дисплея.

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

Создание DirectDraw объектов с использованием CoCreateInstance

Вы можете создавать объекты DirectDraw с помощью CoCreateInstance или IDirectDraw::Initialize так же как и функцией DirectDrawCreate. Следующие шаги описывают, как создать объект DirectDraw:

1      Инициализируйте COM в начале вашей прикладной программы, используя CoInitialize (NULL).

if

(FAILED (CoInitialize (NULL)))

return

FALSE;

2      Создайте ваш объект DirectDraw используя CoCreateInstance

и IDirectDraw::Initialize.



ddrval = CoCreateInstance (&CLSID_DirectDraw,



Карты Текстуры


В DirectX 2, карты текстуры могут быть распределены в памяти системы, использующей HEL. Распределяя поверхность текстуры , определяют флажок DDSCAPS_TEXTURE в члене   ddsCaps  поверхностного описания, переданного методу IDirectDraw::CreateSurface.

HEL поддерживает широкий диапазон форматов пикселя текстуры . Следующая таблица описывает эти форматы. Столбец «Масок» содержит красные, зеленые, синие, и альфа маски для каждого набора флажков формата пикселя и разряды.

Pixel Format Flags

Bit Depth

Masks

DDPF_RGB |

1

R: 0x00000000

DDPF_PALETTEINDEXED1

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

1

R: 0x00000000

DDPF_PALETTEINDEXED1 |

G: 0x00000000

DDPF_PALETTEINDEXEDTO8

B: 0x00000000

A: 0x00000000

DDPF_RGB |

2

R: 0x00000000

DDPF_PALETTEINDEXED2

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

2

R: 0x00000000

DDPF_PALETTEINDEXED2 |

G: 0x00000000

DDPF_PALETTEINDEXEDTO8

B: 0x00000000

A: 0x00000000

DDPF_RGB |

4

R: 0x00000000

DDPF_PALETTEINDEXED4

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

4

R: 0x00000000

DDPF_PALETTEINDEXED4 |

G: 0x00000000

DDPF_PALETTEINDEXEDTO8

B: 0x00000000

A: 0x00000000

DDPF_RGB |

8

R: 0x00000000

DDPF_PALETTEINDEXED8

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB

8

R: 0x000000E0

G: 0x0000001C

B: 0x00000003

A: 0x00000000

DDPF_RGB |

16

R: 0x00000F00

DDPF_ALPHAPIXELS

G: 0x000000F0

B: 0x0000000F

A: 0x0000F000

DDPF_RGB

16

R: 0x0000F800

G: 0x000007E0

B: 0x0000001F

A: 0x00000000

DDPF_RGB

16

R: 0x0000001F

G: 0x000007E0

B: 0x0000F800

A: 0x00000000

DDPF_RGB

16

R: 0x00007C00

G: 0x000003E0

B: 0x0000001F

A: 0x00000000

DDPF_RGB |

16

R: 0x00007C00

DDPF_ALPHAPIXELS

G: 0x000003E0

B: 0x0000001F

A: 0x00008000

DDPF_RGB

24

R: 0x00FF0000

G: 0x0000FF00

B: 0x000000FF

A: 0x00000000

DDPF_RGB

24

R: 0x000000FF

G: 0x0000FF00

B: 0x00FF0000

A: 0x00000000

DDPF_RGB

32

R: 0x00FF0000

G: 0x0000FF00

B: 0x000000FF

A: 0x00000000

DDPF_RGB

32

R: 0x000000FF

G: 0x0000FF00

B: 0x00FF0000

A: 0x00000000

DDPF_RGB |

32

R: 0x00FF0000

DDPF_ALPHAPIXELS

G: 0x0000FF00

B: 0x000000FF

A: 0xFF000000

DDPF_RGB |

32

R: 0x000000FF

DDPF_ALPHAPIXELS

G: 0x0000FF00

B: 0x00FF0000

A: 0xFF000000

Форматы, показанные в предыдущей таблице могут быть созданы HEL в памяти системы. DirectDraw драйвер устройства для 3D плат дисплея может создавать текстуры других форматов в памяти дисплея. Такой драйвер должен экспортировать флажок DDSCAPS_TEXTURE, чтобы указать, что может создавать текстуры, и должен быть готов обработать DirectDraw HAL callback CanCreateSurface, чтобы проверить поверхностное описание для карты текстуры.



Краткий обзор


Относительно DirectDraw    

Введение в DirectDraw        

Архитектурный краткий обзор         

Использование DirectDraw  

Использование DirectDrawSurface    

Использование DirectDrawPalette     

Использование DirectDrawClipper    

Поддержка 3D поверхностей           

Интеграция Direct3D с DirectDraw    

Ссылка            

Функции     

Callback Функции    

Интерфейс IDirectDraw       

Интерфейс IDirectDrawSurface

Интерфейс IDirectDrawPalette          

Интерфейс IDirectDrawClipper

Структуры  

Возвращаемые значения     



LpDDBltFx


Адрес структуры DDBLTFX, определяющей дополнительные эффекты  блиттинга.



LpdwCaps


Флажки  dwPalCaps члена структуры DDCAPS, которые определяют возможности палитры.



Mipmaps


В DirectX 2, DirectDraw поддерживает поверхности текстуры mipmapped. Mipmap - последовательность текстур, каждая из которых - прогрессивно более низкая разрешающая способность,  предварительно фильтрованное представление того же самого изображения. Mipmapping - в вычислительном отношении дешевый путь улучшения качества представленных текстур. Каждое изображение или предварительно фильтровано, или уровень, или  мощность в mipmap в два меньшее чем предыдущий уровень. В DirectDraw, mipmaps представляется как цепочка присоединенных поверхностей. Самая высокая текстура разрешающей способности - в главе цепочки и имеет, как присоединение, следующий уровень mipmap, который имеет, в свою очередь, присоединяется, которое является следующим уровнем в mipmap, и так далее до самого низкого уровня разрешающей способности mipmap.

Чтобы создавать поверхность, представляющую одиночный уровень mipmap, определите флажок DDSCAPS_MIPMAP в поверхностном описании, переданном к IDirectDraw:: CreateSurface. Так как mipmap - тоже текстуры, флажок DDSCAPS_TEXTURE должен также быть определен. Возможно создать каждый уровень вручную и формировать цепочку  IDirectDrawSurface:: AddAttachedSurface. Однако, IDirectDraw:: CreateSurface метод может использоваться, чтобы формировать всю mipmap цепочку в одиночной операции.

Следующий пример показывает формирование цепочки пять mipmap уровней размером 256ґ256, 128ґ128, 64ґ64, 32ґ32 и 16ґ16.

DDSURFACEDESC       ddsd;

LPDIRECTDRAWSURFACE lpDDMipMap;

ZeroMemory(&ddsd, sizeof(ddsd));

ddsd.dwSize = sizeof(ddsd);

ddsd.dwFlags = DDSD_CAPS | DDSD_MIPMAPCOUNT;

ddsd.dwMipMapCount = 5;

ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE |



Многочисленные объекты DirectDraw в процессе


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

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

Исключение - объекты DirectDrawClipper, созданные функцией DirectDrawCreateClipper. Эти объекты независимы от любого специфического объекта DirectDraw и могут использоваться с одним или большим количеством объектов DirectDraw.

Поддержка для высоких разрешающих способностей и TRUE Color цветов 

DirectDraw поддерживает все экранные разрешающие способности и число цветов , поддерживаемые драйвером устройства дисплея. DirectDraw позволяет прикладной программе изменять режим на любой поддерживаемый драйвером дисплея компьютера, включая  24- и 32-bpp режимы.

DirectDraw также поддерживает блиттинг  24- и 32-bpp поверхностей аппаратным уровенем эмуляции (HEL). Если драйвер устройства дисплея поддерживает блиттинг в этих разрешающих способностях,  то будут использоваться аппаратные средства. Иначе, будет использоваться  HEL.

Windows 95 позволяет пользователю определять тип используемого монитора. DirectDraw проверяет режимы дисплея.. Если определено, что запрошенный режим не совместим с монитором, IDirectDraw2:: SetDisplayMode  будет возвращать ошибку. Только режимы, поддерживаемые установленным монитором перечисяются в методе  IDirectDraw2:: EnumDisplayModes.



Модель компонентных объектов СОM


Многие API в DirectX 2 SDK составлены из объектов и интерфейсов, основанных на модели компонентных объектов (COM). COM - база для основанной на объектах системы, которая сосредотачивается на повторном использовании интерфейсов и лежит в основе программирования OLE. Это - также спецификация интерфейса из которой может быть сформировано любое число интерфейсов . Это - объектная модель на уровне операционной системы.

Многие DirectX 2 API  установлены как набор объектов OLE. Объект может рассматриваться черным ящиком, который представляет аппаратные средства и требует связи с прикладными программами через интерфейс. Команды, посланные к и от объекта с помощью интерфейса COM называются методами. Например, метод IDirectDraw:: GetDisplayMode послан через интерфейс IDirectDraw, чтобы получить текущий режим дисплея из объекта DirectDraw.

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



Модели использования основной поверхности


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

DirectDraw неявно создает GDIPrimarySurface, это необходимо для DirectDraw,чтобы   совместно использовать GDI. GDI - предоставленный распределенный доступ к основной поверхности. DirectDraw следит за поверхностной памятью, которую GDI распознает как основную поверхность. DirectDrawSurface, который обладает основной поверхностью GDI можно всегда получать используя метод IDirectDraw:: GetGDISurface.

GDI не разрешает кэшировать шрифты, кисти, и устройство-зависимые растры (DDBs) в памяти дисплея, управляемой DirectDraw. HAL должен зарезервировать необходимую  память дисплея DIB драйвера перед описанием доступной памяти менедженром памяти DirectDraw или прежде, чем драйвер устройства дисплея может распределить свободную память для кэшируемых данных из программы управления динамической областью DirectDraw.



Названия методов интерфейса и синтаксис


Все методы интерфейса COM, описанные в этом документе используют C ++ имена классов. Это соглашение наименования используется для непротиворечивости, и различимости между методами, используемыми для различных объектов DirectX, которые используют то же самое имя, типа QueryInterface, AddRef, и Release. Это не подразумевает, что эти методы могут только использоваться с C ++.

Кроме того, синтаксисом предусмотрено, что методы используют для непротиворечивости соглашения C ++  . Это не включает  указатель this на интерфейс. Когда программирование происходит на C, указатель на интерфейс должен быть включен в каждый метод. Например, следующий пример показывает C ++ синтаксис для IDirectDraw:: GetCaps:

HRESULT GetCaps (LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps);

Тот же самый пример, использующий C синтаксис:

HRESULT

GetCaps (LPDIRECTDRAW lpDD,

LPDDCAPS lpDDDriverCaps, LPDDCAPS lpDDHELCaps);

Параметр lpDD - указатель на структуру DirectDraw, которая представляет объект DirectDraw.



Новые типы палитры


В DirectX 2, DirectDraw поддерживает палитры с 1, 2, 4 битами в дополнение к 8 битной  палитре, поддерживаемой предыдущей версией. Такие палитры могут быть созданы,  определяя один из новых флажков возможности палитры: DDPCAPS_1BIT, DDPCAPS_2BIT, и DDPCAPS_4BIT. Соответственно флажки возможности были добавлены для поверхностных форматов пикселя: DDPF_PALETTEINDEXED1, DDPF_PALETTEINDEXED2, и DDPF_PALETTEINDEXED4.

Палитра может только быть присоединена к поверхности только с соответствующим форматом пикселя. Например, 2 битная палитра, созданная с флажком DDPCAPS_1BIT может быть присоединена только к поверхности с 1 битом, созданной с форматом пикселя DDPF_PALETTEINDEXED1.

Кроме того, теперь возможно создать индексированные палитры. Индексированная палитра  не содержит RGB цвета, но является индексами  в массиве PALETTEENTRY некоторой целевой палитры. Таблица цвета индексированной палитры - массив 2, 4, 16, или 256 байтов, где каждый байт - индекс в некоторой неопределенной палитре адресата.

Чтобы создать индексированную палитру, определите флажок DDPCAPS_8BITENTRIES при вызове IDirectDraw:: CreatePalette. Например, чтобы создать индексированную палитру с 4 битами, определите DDPCAPS_4BIT | DDPCAPS_8BITENTRIES. При создании индексированной палитры, указатель на массив байтов передается как указатель на массив структур PALETTEENTRY. Указатель на массив байтов должен привестись к LPPALETTEENTRY при вызове IDirectDraw:: CreatePalette.



NULL);


Объект DirectDraw, связанный с новой поверхностью вызван параметром lpDD. Этот метод заполняет поверхностную структуру описания &ddsd  и возвращает указатель на новую поверхность (&lpDDS).

Вызвав IDirectDraw:: CreateSurface, Вы сначала опишите vtable объекта DirectDraw, затем опишите метод из vtable. Первый параметр в методе - ссылка к объекту DirectDraw, который был создан и вызывает метод.

Чтобы иллюстрировать различие между вызовом метода объекта COM в C и C ++, тот же самый метод на C ++ показывается ниже (C ++ неявно описывает указатель и передает его):

ret = lpDD- > CreateSurface (&ddsd, &lpDDS, NULL)


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




CLSCTX_ALL,

&IID_IDirectDraw,

&lpdd);

if

(! FAILED (ddrval))

dDdrval = IDirectDraw_Initialize (lpdd, NULL);

CLSID_DirectDraw - идентификатор  DirectDraw класса объекта драйвера, и IID_IDirectDraw - часть интерфейса DirectDraw.lpdd - возвращенный объект DirectDraw. CoCreateInstance возвращает неинициализированный объект.

3      Прежде, чем Вы используете объект DirectDraw, Вы должны вызвать IDirectDraw:: Initialize. Этот метод берет параметр GUID драйвера, который функция DirectDrawCreate обычно использует (NULL в этом случае). Как только объект DirectDraw инициализирован, Вы можете использовать и разрушатть объект DirectDraw, как будто это было создано, используя функцию DirectDrawCreate. Если Вы не вызовете IDirectDraw::Initialize перед использованием одного из методов, связанных с объектом DirectDraw, произойдет ошибка DDERR_NOTINITIALIZED .

Перед закрытием прикладной программы, закроте COM , как показано ниже.

CoUnitialize ();




if( ddrval != DD_OK )

return;

ddrval = lpSurf->QueryInterface(

IID_IDirectDrawSurface2, (LPVOID

*)&lpSurf2);

if( ddrval != DD_OK )

return;

ddrval = lpSurf2->PageLock( 0 );

if( ddrval != DD_OK )

return;

ddrval = lpSurf2->PageUnlock( 0 );

if( ddrval != DD_OK )

return;

Интерфейс IDirectDrawSurface2 содержит все методы, обеспечиваемые интерфейсом IDirectDrawSurface, и имеет три новых метода: IDirectDrawSurface2:: GetDDInterface, IDirectDrawSurface2:: PageLock, и IDirectDrawSurface2:: PageUnlock.

Для большего количества информации относительно получения интерфейса IDirectDraw2, см. Интерфейс IDirectDraw2.




CLSCTX_ALL,

&IID_IDirectDrawClipper,

&lpClipper);

if

(!FAILED(ddrval))

ddrval = IDirectDrawClipper_Initialize(lpClipper,

lpDD, 0UL);

CLSID_DirectDrawClipper - идентификатор класса объекта DirectDrawClipper, IID_IDirectDrawClipper - в настоящее время поддерживаемый интерфейс и lpClipper - возвращенный объект ограничителя.

Ограничители, созданные механизмом  класса должны быть инициализированы  IDirectDrawClipper::Initialize прежде, чем Вы можете использовать объект. 0UL - параметр dwFlags, который в этом случае имеет значение 0, так как никакие флажки в настоящее время не поддержаны. В примере, показанном здесь, lpDD - объект DirectDraw, который обладает объект DirectDrawClipper. Однако, Вы могли бы задать NULL, который создаст независимый ограничитель (эквивалент созданию объекта DirectDrawClipper с использованием функции DirectDrawCreateClipper).

Перед закрытием прикладной программы, закройтей COM используя CoUninitialize, как показано ниже.

CoUnitialize ();




if

(FAILED(ddres))

                ...

ddres = lpDDSurface->QueryInterface(lpGuid,

&lpD3DDevice);

if

(FAILED(ddres))

                ...

Те же самые правила для счета ссылки и состояния срока службы для объектов (см. Интерфейс драйвера Direct3D ) предъявляются и к DirectDraw поверхностям и к Direct3D устройствам. Дополнительно, другие Direct3D интерфейсы устройства могут быть получены для той же самой DirectDraw поверхности. Это возможно, следовательно, одиночная DirectDraw поверхность может быть адресатом , и для ramp-основанного устройства и rgb-основанного устройства.




if

(FAILED(ddres))

                ...

ddres = lpDDSurface->QueryInterface(

IID_IDirect3DTexture, &lpD3DTexture);

if

(FAILED(ddres))

                ...

Те же самые правила для счета ссылки и состояния сроки службы, обсужденные для объектов (см. Интерфейс драйвера Direct3D ) прилагаются к текстурам Direct3D. Возможно использовать одиночный DirectDrawSurface, и как адресат представления и как текстуру.



Определение Color Key


Color key определен в формате пикселя поверхности. Если поверхность находится в формате с палитрой, color key определен как индекс или диапазон индексов. Если формат пикселя поверхности определен кодом FourCC, который описывает формат YUV, YUV color key определен тремя байтами младшего разряда, и в dwColorSpaceLowValue и dwColorSpaceHighValue членах структуры DDCOLORKEY. Самый младший байт по  порядку имеет V данные, второй по порядку имеет U данные, и самый старший байт  имеет Y данные. Метод  IDirectDrawSurface:: SetColorKey имеет флажки, которые определяют, должен ли color key использоваться для оверлейных операций или операций блиттинга, и для кого он служит, для источника или адресата. Некоторые примеры следуют:



Относительно DirectDraw


DirectDraw™ - компонент DirectX™ 2 SDK , который позволяет напрямую манипулировать памятью дисплея, аппаратными средствами блиттинга, аппаратными оверлеями, и переключающимися страницами. DirectDraw обеспечивает эти функциональные возможности при поддержкесовместимости с существующими для Microsoft Windows 95 прикладными программами и драйверами устройств.

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

DirectDraw для Windows 95 - интерфейс программного обеспечения, который обеспечивает прямой доступ к дисплею при поддержке совместимости с интерфейсом устройства графики Windows (GDI). DirectDraw обеспечивает аппаратно-независимые решения для игр и программного обеспечения Windows, типа пакетов 3D графики  и цифровых кодер-декодеров видео, и позволяет получать доступ аппаратно-зависимым особенностям дисплея.

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

DirectDraw обеспечивает следующие аппаратно-зависимые операции:

Поддерживает двойной буфер и переключаемые страницы.

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

Поддерживает 3D  z-буфер.

Поддерживает аппаратные средства оверлеи с z-упорядочиванием.

Улучшает графическое качество,  обеспечивая доступ к масштабирующим аппаратным средствам.

Обеспечивает одновременный доступ к стандартной и расширенной областям памяти  дисплея.

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

DirectDraw представляет высококлассную графику  на компьютерах под управлением Windows 95 и Windows NT.



Отсекаемые списки


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

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

HAL рассматривает отсекающийся список для оверлеев только если оверлейные аппаратные средства могут поддерживать отсечение и если не активен color key адресата. Совместное использование ограничителей

В DirectX 2, ограничители могут быть разделены между поверхностями. Например, тот же самый ограничитель может быть установлен, и на передней и на обратной стороне буфера. Когда ограничитель присоединен к поверхности,  используя метод IDirectDrawSurface:: SetClipper, поверхность увеличивает счет ссылки того ограничителя. Когда счет ссылки поверхности достигает 0, это будет декремент счет ссылки присоединенного ограничителя. Кроме того, если ограничитель отсоединяется из поверхности,  вызывая DirectDrawSurface::SetClipper с указателем интерфейса ограничителя NULL, счет ссылки ограничителя поверхности будет десрементирован.



Оверлейный z-порядок


Оверлейный z-порядок определяет порядок, в котором оверлеи отсекают друг друга, допуская аппаратную систему спрайтов быть выполненной под DirectDraw. Оверлеи разработаны, чтобы быть в верху всех других экранных компонентов. Color key адресата  воздействуют только на биты первичной поверхности.. Исходные color key работают на оверлее, не зависимо от наличия определенного z-порядока. Оверлеи, которые не имеют определенного z-порядка, ведут себя неопределенным способом когда записывается та же самая область на основной поверхности. Для оверлеев без определенного z-порядка принят z-порядок 0. Возможный z-порядок оверлеев начинается с 0, и вверх до 4 миллиардов. Оверлей с z-порядком 2 затенил бы оверлей с z-порядком 1. Оверлею не позволяется иметь тот же самый z-порядок как у другого оверлея.



Палитровый режим с 8 битами


// индекс палитры 26 - color key

dwColorSpaceLowValue = 26;

dwColorSpaceHighValue = 26;



Палитры и форматы пикселя


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

DirectDraw поддерживает создание стандартных палитровых поверхностей с 8 битами, способных к показу 256 цветов, и двух видов палитровых поверхностей с 4 битами, способных к показу 16 цветов. Первый вид  поверхности с 4 битами индексирован в истинную цветную таблицу палитры; второй вид индексирован в индексированную таблицу палитры основной поверхности. Этот второй тип палитры обеспечивает 50 процентов сжатия.

Если эти поверхности должны быть созданы, blitter должен быть способен к замене палитры в течение операции блиттинга.  При блиттинге одной  поверхности в другую, палитра игнорируется. Декодирование палитры выполнимо только к истинным цветным поверхностям, или когда палитра с 4 битами - индекс к индексу в палитре с 8 битами. Во всех других случаях, индексированная палитра - палитра адресата.

Растровые операции для палитровых поверхностей игнорируются. Изменение присоединенной палитры поверхности - очень быстрая операция. Вся три из этих поверхностей должны быть поддержаны как текстуры на 3D ускоренные аппаратные средства.



Поддержка форматов поверхностей для HEL


Следующая таблица показывает форматы пикселей для вне экранных простых поверхностей, поддерживаемых DirectX 2 HEL. Столбец «Масок» показывает красные, зеленые, синие, и алфавитные маски для каждого набора флажков формата пикселя и разрядной глубины изображения.

Pixel Format Flags

Bit Depth

Masks

DDPF_RGB |

1

R: 0x00000000

DDPF_PALETTEINDEXED1

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

2

R: 0x00000000

DDPF_PALETTEINDEXED2

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

4

R: 0x00000000

DDPF_PALETTEINDEXED4

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB |

8

R: 0x00000000

DDPF_PALETTEINDEXED8

G: 0x00000000

B: 0x00000000

A: 0x00000000

DDPF_RGB

16

R: 0x0000F800

G: 0x000007E0

B: 0x0000001F

A: 0x00000000

DDPF_RGB

16

R: 0x00007C00

G: 0x000003E0

B: 0x0000001F

A: 0x00000000

DDPF_RGB

24

R: 0x00FF0000

G: 0x0000FF00

B: 0x000000FF

A: 0x00000000

DDPF_RGB

24

R: 0x000000FF

G: 0x0000FF00

B: 0x00FF0000

A: 0x00000000

DDPF_RGB

32

R: 0x00FF0000

G: 0x0000FF00

B: 0x000000FF

A: 0x00000000

DDPF_RGB

32

R: 0x000000FF

G: 0x0000FF00

B: 0x00FF0000

A: 0x00000000

В дополнение к обеспечению более широкого диапазона вне экранных поверхностных форматов, HEL также поддерживает поверхности, предназначенные для использования Direct3D, или другими 3D пакетами.



Потеря поверхностей


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

Поверхности можно потерять, при изменении режима платы дисплея  или при получении программой  исключительного доступа к плате дисплея и освобождении ей всей поверхностной памяти, в настоящее время распределенной на плате. Метод IDirectDrawSurface::Restore  восстановливает эти потерянные поверхности и повторно соединяет их с их объектами DirectDrawSurface.



Преобразование цвета и форматов


Не - rgb поверхностные форматы описаны кодами FourCC. Когда запрошен формат пикселя, если поверхность - не - rgb, будет установлен флажок DDPF_FOURCC , и член dwFourCC  в структуре DDPIXELFORMAT будет иметь силу. Если FourCC код представляет формат YUV, флажок DDPF_YUV будет также установлен и члены dwYUVBitCount, dwYBits, dwUBits, dwVBits, и dwYUVAlphaBits будут использоваться, чтобы извлечь информацию из пикселей.

Если формат RGB присутствует, флажок DDPF_RGB будет установлен и члены dwRGBBitCount, dwRBits, dwGBits, dwBBits, и dwRGBAlphaBits будут  использоваться, чтобы извлечь информацию из пикселей. Флажок DDPF_RGB может быть установлен вместе с флажком DDPF_FOURCC, если описывается ненормативный формат RGB.

Для преобразования цвета и формата, существует два набора FourCC кодов. Один набор FourCC кодов представляет то, к чему способны аппаратные средства блиттинга; другой представляет то, к чему способны оверлейные аппаратные средства.



Причины для разработки DirectX программ


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

Одной из первичных причин для создания DirectX  была необходимость поддержать разработку игр на платформе Windows. Большинство игр, разработанных для персонального компьютера сегодня основаны на MS DOS. Однако, при разработке MS DOS игр, Вы должны учитывать различие реализаций аппаратных средств для ряда плат, усложняющее программирование. Кроме того, разработка MS DOS игры может быть намного сложнее на персональном компьютере чем на игровой платформе, из-за унифицированного процессора, большого размера оперативной и постоянной памяти персонального компьютера.

Быстродействующая же Windows игра будет:

Успешно установлена.

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

Пользоваться преимуществом аппаратных и программных средств Windows, таких как Plug and Play.

Пользоваться преимуществом коммуникаций, встроенных в Windows.

Обеспечение стандартов для аппаратных акселераторов

Основные задачи DirectX 2 SDK состоят в том, чтобы обеспечить переход с  MS DOS платформы , не ставя под угрозу эффективность MS-DOS или игровых платформ, и удалить препятствия доступа к аппаратным ресурсам персонального компьютера.

Другая важная цель состоит в том, чтобы обеспечить руководящие принципы для компаний, разработчиков аппаратных средств, основанные на создании обратной связи от  разработчиков быстродействующих прикладных программ и независимых аппаратных продавцов (IHV). Следовательно, DirectX 2 SDK компоненты часто обеспечивают спецификации для аппаратных особенностей акселератора, которые еще не существуют. Во многих случаях, эти спецификации эмулированы в программном обеспечении. Возможности аппаратных средств должны быть сначала опрошены, и должны игнорироваться если они не поддерживаются.


Некоторые аппаратные средства дисплея появятся в ближайшем будущем:

Оверлеи. Оверлеи для переключения страниц будут работать внутри окна в графическом интерфейсе устройства (GDI). Переключение страниц - схема двойного буфера, используемая, чтобы отобразить фреймы на всем экране.

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

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

Альфа смешивание, используемое, чтобы смешать цвета на аппаратном уровне.

Трехмерные (3D) акселераторы с перспективно - правильными текстурами. Это позволяет текстурам отображаться на поверхности 3D; например, прихожие в замке, сгенерированные 3D могут быть покрыты текстурой с кирпичом и стенки будут иметь правильную перспективу.

Z-buffer для 3D графики .

2 МБ памяти дисплея как стандарт. 3D игры  нуждаются по меньшей мере в этой оперативной памяти дисплея.

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

Звуковые аппаратные средства будут  включать:

3D аудио расширение, которое обеспечивает  размещение различных звуков. Это будет особенно эффективно с наушниками.

Встроенная память для звуковых плат.

Комбинированные аудио-видео платы совместно использующие встроенную память.

Кроме того, воспроизведение видео будет улучшено для аппаратных акселераторов, которые будут совместимы с DirectX 2 SDK. Одна из особенностей, которые будут поддержаны будущими выпусками DirectX 2 SDK - ускоренная аппаратными средствами декомпрессия YUV видео.


Так как некоторые методы ведут


Так как некоторые методы ведут себя несколько по-разному в этих интерфейсах, смешивание методов из IDirectDraw и IDirectDraw2 может вызывать непредсказуемые результаты. Вы должны  использовать функции только из одного из этих интерфейсов одновременно; не используйте некоторые функции из IDirectDraw и функции из IDirectDraw2.
Для большего количества информации относительно использования интерфейса IDirectDrawSurface2, см. Интерфейс IDirectDrawSurface2.


Если IDirectDrawSurface:: SetPalette вызывается несколько раз последовательно для той же самой поверхности с той же самой палитрой, ссылка на палитру, будет увеличена только однажды. Последующие обращения не будут воздействовать на счет ссылки палитры.


Операции блиттинга обращаются только к одиночному уровню в mipmap цепочке. Для блиттинга всей цепочки mipmap, каждый уровень должен быть обработан отдельно.
Метод IDirectDrawSurface::Flip переключит все уровни mipmap из уровня, присоединненного к самому низкому уровню в карте. Поверхность адресата может также обеспечивать, что все уровни в mipmap переключатся на обратный буфер во всей цепочке. Этот обратный буфер соответствует обеспеченной отмене. Например, если третий обратный буфер в переключающейся цепочке обеспечен, все уровни в mipmap переключатся на третий обратный буфер.
Число уровней в mipmap цепочке сохранено явно. Когда поверхностное описание mipmap получено (используя IDirectDrawSurface:: Lock или IDirectDrawSurface:: GetSurfaceDesc), dwMipMapCount член будет содержать число уровней в mipmap, включая верхний уровень. Для других уровней  в карте, dwMipMapCount определит число уровней от той карты до самой маленькой карты в цепочке.


Фактическая интерпретация значения глубины  - специфична для 3D просчета.


Эффективность операционной системы может быть ухудшена, если слишком много памяти блокировано.
Возвращает DD_OK если успешно, или одно из следующих значений ошибки:
DDERR_CANTPAGELOCK         DDERR_INVALIDOBJECT      
DDERR_INVALIDPARAMS       DDERR_SURFACELOST         
dwFlags
Этот параметр не используется в это время и должен быть установлен в 0.
Этот метод работает только на поверхностях системной памяти;  не будет блокироваться страница поверхности памяти дисплея или эмулированной основной поверхности. Если этот метод обратился к поверхности памяти дисплея,он не будет делать ничего за исключением возвращения DD_OK.
Чтобы гарантировать согласие с  COM, этот метод - не,  часть интерфейса IDirectDrawSurface, но принадлежит интерфейсу IDirectDrawSurface2. Чтобы использовать этот метод, Вы должны сначала сделать запрос для интерфейса IDirectDrawSurface2. Для большего количества информации, см. Интерфейс IDirectDrawSurface2.

Release


Разнообразные           GetAvailableVidMem            


Все интерфейсы COM наследуют методы интерфейса IUnknown, которые перечислены в группе “IUnknown” выше. Эти три метода позволяют дополнительным интерфейсам быть добавленными к объекту DirectDrawClipper без воздействия на функциональные возможности первоначального интерфейса.




Возможности палитры          GetCaps        

                       

Входы палитры          GetEntries     



ReleaseDC


Переключение поверхностей          Flip    

                       

IUnknown        AddRef          



Restore


Управление поверхностями             AddAttachedSurface



в настоящее время видимая пользователю.


Основная поверхность - поверхность, в настоящее время видимая пользователю. Когда Вы создаете основную поверхность, Вы фактически создаете объект DirectDrawSurface, чтобы обратиться к уже существующей поверхности,  используемой GDI. Следовательно, в то время как все другие типы поверхностей требуют значений dwHeight и dwWidth, основная поверхность не должна иметь их определенными, даже если Вы знаете, что они - те же самые размеры как у существующей поверхности.

Члены структуры DDSURFACEDESC (ddsd ниже) подготовленные к созданию основной поверхности.

DDSURFACEDESC ddsd;

ddsd.dwSize = sizeof( ddsd );

//Tell DDRAW, которые поля имеют силу

ddsd.dwFlags = DDSD_CAPS;

//Ask для первичной поверхности

ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;


Создайте простую вне экранную поверхность


Создайте простую вне экранную поверхность типа, который мог бы использоваться, чтобы кэшировать растры, которые будут позже составлены для блиттинга. Высота и ширина требуется для всех поверхностей за исключением основной поверхности. Члены в структуре DDSURFACEDESC (ddsd ниже) подготовлены к созданию простой вне экранной поверхности.

DDSURFACEDESC ddsd;

ddsd.dwSize = sizeof( ddsd );

//Tell DDRAW, которые поля имеют силу

ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;

//Ask для простой off-screen поверхности, установленной по размеру

//100 100 пикселями

ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;

dwHeight = 100;

dwWidth = 100;

DirectDraw создает эту поверхность в памяти дисплея, если это не будет успешно, тогда поверхность будет создана в памяти системы. Если поверхность была создана, используйте флажки DDSCAPS_SYSTEMMEMORY или DDSCAPS_VIDEOMEMORY в dwCaps, чтобы определить где, в памяти системы или памяти дисплея, соответственно. Ошибка возвращается, если поверхность не может быть создана в определенном расположении.

DirectDraw также учитывает создание сложных поверхностей. Сложная поверхность - набор поверхностей, созданных с одиночным обращением к IDirectDraw:: CreateSurface. Если флажок DDSCAPS_COMPLEX установлен в IDirectDraw:: CreateSurface, одна или много неявных поверхностей будут созданы DirectDraw в дополнение к поверхности, явно определенной. Сложные поверхности управляются вместе,одиночное обращение к IDirectDraw::Release разрушит все поверхности в структуре, и одиночное обращение к IDirectDrawSurface::Restore  восстановит их все.


Одна из наиболее полезных сложных


Одна из наиболее полезных сложных поверхностей, которые Вы можете определять,  составлена из первичной поверхности и одного или многих обратных буферов, которые формируют переключающуюся поверхность. Члены в структуре DDSURFACEDESC (ddsd ниже) подготовлены к сложному поверхностному созданию и заполнены, чтобы описать переключающуюся поверхность, которая имеет один обратный буфер.

DDSURFACEDESC      ddsd;

ddsd.dwSize = sizeof( ddsd );

//Tell DDRAW which fields are valid

ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;

//Ask для первичной поверхности с одиночным

//back буфер

ddsd.ddsCaps.dwCaps = DDSCAPS_COMPLEX | DDSCAPS_FLIP |

DDSCAPS_PRIMARYSURFACE;

ddsd.dwBackBufferCount = 1;

Пример создает поверхность с двойным буфером и переключающимися страницами, a одиночное обращение к IDirectDrawSurface::Flip обменивает поверхностную память  основной поверхности с обратным буфером. Если BackBufferCount  определен значением 2, будут созданы два обратных буфера, и каждое обращение к IDirectDrawSurface:: Flip вращает поверхности по кругу, обеспечивая тройную буфернуюпереключающуюся среду.


SetClipper


Описание поверхностей        GetPixelFormat        



SetEntries


Все интерфейсы COM наследуют методы интерфейса IUnknown, которые перечислены в группе “IUnknown” выше. Эти три метода позволяют дополнительным интерфейсам быть добавленными к объекту DirectDrawPalette без воздействия на функциональные возможности первоначального интерфейса.



SetPalette


Все интерфейсы COM наследуют методы интерфейса IUnknown, которые перечислены в группе “IUnknown” выше. Эти три метода позволяют дополнительным интерфейсам быть добавленными к объекту DirectDrawSurface без воздействия на функциональные возможности первоначального интерфейса.



Соглашения


Используются следующие соглашения .

Соглашение      Означает      

Курсивный текст              Обозначает значение или переменную. Вы должны обеспечить фактическое значение. Например, утверждение SetCursorPos (X, Y) требует, чтобы Вы заменили значениями параметров X и Y.          

[]             Включают дополнительные параметры.           

|              Отделяет или / или выбор.      

...             Определяет, что предшествующая единица может быть повторена.     

.  Представляет опущенную часть типовой прикладной программы.        

.             

.             

Кроме того, некоторые типичные соглашения используются, чтобы помочь Вам понять этот материал.

Соглашение      Означающий           

МАЛЕНЬКИЕ ЗАГЛАВНЫЕ БУКВЫ              Указывают имена клавиш, последовательностей клавиш - типа  ALT + ПРОБЕЛ.          

ПОЛНЫЕ ЗАГЛАВНЫЕ БУКВЫ        Указывают большинство типов и имен структур, которые  также выделяются  полужирными символами, и константы.            

Monospace            Примеры кода и синтаксиса.   



Сolor Keying


Поддерживается исходный и адресуемый color key для блиттинга и оверлеев. Для обоих типов color key, может быть установлен цвет или цветовой диапазон.

Исходный color key определяет цвет или цветовой диапазон, который при блиттинге не будет скопирован, или, в случае оверлея, не будет видимым в адресате. Адресуемый color key определяет цвет или цветовой диапазон,который при блиттинге будет заменен или, в случае оверлея, заменен на адресате. Исходный color key определяет то, что может и не может читаться из исходной поверхности. Адресуемый colot key определяет то, что может и не может быть записано, или заменено в поверхности адресата. Если поверхность адресата имеет color key, то только пикселы, цвет которых соответствует color key будут изменены на адресуемой поверхности.

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

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



Совместное использование палитр


В DirectX 2, палитры могут быть разделены между поверхностями. Та же самая палитра может быть установлена на передней и обратной стороне буфераили разделяться между  поверхностями текстуры. Когда палитра присоединена к поверхности методом IDirectDrawSurface:: SetPalette, поверхность увеличивает счет ссылки той палитры. Когда счет ссылки поверхности достигает 0, это будет декремент ссылки присоединенной палитры. Кроме того, если палитра отсоединяется из поверхности,  вызывая IDirectDrawSurface:: SetPalette с указателем интерфейса палитры NULL, счет ссылки палитры поверхности будет декрементирован.



Типовые прикладные программы


Типовые прикладные программы, которые показывают компоненты Windows 95 DirectX 2 SDK,  размещены в каталоге SDK\SAMPLES.



Типы объектов DirectDraw


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

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

Объект DirectDrawPalette представляет 16 или 256  цветные палитры. Палитры предусмотрены для текстуры, внеэкранной поверхности, и оверлейной поверхности, для которых не требуются, иметь ту же самую палитру как первичную поверхность.

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



Точность операций с плавающей запятой


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

Различия Между Game SDK и DirectX 2 SDK

DirectX 2 SDK обеспечивает большее количество услуг, большее количество нововведений для разработки, чем Game SDK. Хотя DirectX 2 SDK содержит дополнительные функции и услуги, все прикладные программы написанные в Game SDK,  компилируются и выполняются  без изменений.

Этот раздел  содержит некоторые из наиболее значительных различий и усовершенствований DirectX 2 SDK над Game SDK. Цель этого раздела состоит в том, чтобы помочь разработчикам, знакомым с Game SDK, быстро рассмотреть несколько важных частей DirectX SDK, которые значительно различны.



Typedef struct _DDBLTBATCH {


LPRECT lprDest;

LPDIRECTDRAWSURFACE lpDDSSrc;

LPRECT lprSrc;

DWORD dwFlags;

LPDDBLTFX lpDDBltFx;

} DDBLTBATCH, FAR * LPDDBLTBATCH;

Подготавливает операции блиттинга для метода IDirectDrawSurface:: BltBatch.

lprDest

Адрес структуры RECT, которая определяет адресата для блиттинга.

lpDDSSrc

Адрес DirectDrawSurface, который будет источником  блиттингаt.

lprSrc

Адрес структуры RECT, которая определяет исходный прямоугольник  блиттинга.

dwFlags

Определяет дополнительные флажки управления.



Typedef struct _DDBLTFX {


DWORD dwSize;

DWORD dwDDFX;

DWORD dwROP;

DWORD dwDDROP;

DWORD

dwRotationAngle;

DWORD

dwZBufferOpCode;

DWORD

dwZBufferLow;

DWORD

dwZBufferHigh;

DWORD

dwZBufferBaseDest;

DWORD

dwZDestConstBitDepth;

union

{

DWORD

dwZDestConst;

LPDIRECTDRAWSURFACE lpDDSZBufferDest;

};

DWORD

dwZSrcConstBitDepth;

union

{

DWORD

dwZSrcConst;

LPDIRECTDRAWSURFACE lpDDSZBufferSrc;

};

DWORD

dwAlphaEdgeBlendBitDepth;

DWORD

dwAlphaEdgeBlend;

DWORD

dwReserved;

DWORD

dwAlphaDestConstBitDepth;

union

{

DWORD

dwAlphaDestConst;

LPDIRECTDRAWSURFACE lpDDSAlphaDest;

};

DWORD

dwAlphaSrcConstBitDepth;

union

{

DWORD

dwAlphaSrcConst;

LPDIRECTDRAWSURFACE lpDDSAlphaSrc;

};

union

{

DWORD

dwFillColor;

DWORD

dwFillDepth;

LPDIRECTDRAWSURFACE lpDDSPattern;

};

DDCOLORKEY ddckDestColorkey;

DDCOLORKEY ddckSrcColorkey;

} DDBLTFX, FAR * LPDDBLTFX;

Передает растровые операции, эффекты в метод IDirectDrawSurface:: Blt. А также часть структуры DDBLTBATCH, используемой с IDirectDrawSurface:: BltBatch.

dwSize

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

dwDDFX

Определяет тип операций FX.



Typedef struct _DDCAPS {


DWORD

dwSize;

DWORD

dwCaps;

DWORD

dwCaps2;

DWORD

dwCKeyCaps;

DWORD

dwFXCaps;

DWORD

dwFXAlphaCaps;

DWORD

dwPalCaps;

DWORD

dwSVCaps;

DWORD

dwAlphaBltConstBitDepths;

DWORD

dwAlphaBltPixelBitDepths;

DWORD

dwAlphaBltSurfaceBitDepths;

DWORD

dwAlphaOverlayConstBitDepths;

DWORD

dwAlphaOverlayPixelBitDepths;

DWORD

dwAlphaOverlaySurfaceBitDepths;

DWORD

dwZBufferBitDepths;

DWORD dwVidMemTotal;

DWORD dwVidMemFree;

DWORD

dwMaxVisibleOverlays;

DWORD

dwCurrVisibleOverlays;

DWORD

dwNumFourCCCodes;

DWORD

dwAlignBoundarySrc;

DWORD

dwAlignSizeSrc;

DWORD

dwAlignBoundaryDest;

DWORD

dwAlignSizeDest;

DWORD

dwAlignStrideAlign;

DWORD

dwRops [DD_ROP_SPACE];

DDSCAPS ddsCaps;

DWORD

dwMinOverlayStretch;

DWORD

dwMaxOverlayStretch;

DWORD

dwMinLiveVideoStretch;

DWORD

dwMaxLiveVideoStretch;

DWORD

dwMinHwCodecStretch;

DWORD

dwMaxHwCodecStretch;

DWORD

dwReserved1;

DWORD

dwReserved2;

DWORD

dwReserved3;

DWORD

dwSVBCaps;

DWORD

dwSVBCKeyCaps;

DWORD

dwSVBFXCaps;

DWORD

dwSVBRops [DD_ROP_SPACE];

DWORD

dwVSBCaps;

DWORD

dwVSBCKeyCaps;

DWORD

dwVSBFXCaps;

DWORD

dwVSBRops [DD_ROP_SPACE];

DWORD

dwSSBCaps;

DWORD

dwSSBCKeyCaps;

DWORD

dwSSBCFXCaps;

DWORD

dwSSBRops [DD_ROP_SPACE];

DWORD

dwReserved4;

DWORD

dwReserved5;

DWORD

dwReserved6;

} DDCAPS, FAR * LPDDCAPS;

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

dwSize

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

dwCaps

Определяет драйвер-специфические возможности.



Typedef struct _DDCOLORKEY {


DWORD

dwColorSpaceLowValue;

DWORD

dwColorSpaceHighValue;

} DDCOLORKEY, FAR * LPDDCOLORKEY;

Описывает color key или color space источника или адресата. Color key определяется если начальное и конечное значение одинаковое.

dwColorSpaceLowValue

Начальное значение, включительно, цветного диапазона, который должен использоваться как color key.

dwColorSpaceHighValue

Высоко значение, включительно, цветного диапазона, который должен использоваться как color key.



Typedef struct _DDOVERLAYFX {


DWORD dwSize;

DWORD dwAlphaEdgeBlendBitDepth;

DWORD dwAlphaEdgeBlend;

DWORD dwReserved;

DWORD dwAlphaDestConstBitDepth;

union

{

DWORD dwAlphaDestConst;

LPDIRECTDRAWSURFACE lpDDSAlphaDest;

};

DWORD dwAlphaSrcConstBitDepth;

union

{

DWORD dwAlphaSrcConst;

LPDIRECTDRAWSURFACE lpDDSAlphaSrc;

};

DDCOLORKEY dckDestColorkey;

DDCOLORKEY dckSrcColorkey;

DWORD dwDDFX;

DWORD dwFlags;

} DDOVERLAYFX, FAR * LPDDOVERLAYFX;

Проход отменяет информацию метода IDirectDrawSurface:: UpdateOverlay.

dwSize

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

dwAlphaEdgeBlendBitDepth

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

dwAlphaEdgeBlend

Константа, чтобы использовать как alpha для края смешивания.

dwReserved

Резервируется для будущего использования.

dwAlphaDestConstBitDepth

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

dwAlphaDestConst

Константа, чтобы использовать как канал alpha для адресата.

lpDDSAlphaDest

Адрес поверхности, чтобы использовать как канал alpha для адресата.

dwAlphaSrcConstBitDepth

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

dwAlphaSrcConst

Константа, чтобы использовать как канал alpha для источника.

lpDDSAlphaSrc

Адрес поверхности, чтобы использовать как канал alpha для источника.

dckDestColorkey

Отмена сolor key адресата.

dckSrcColorkey

Отмена исходного color key.

dwDDFX

Оверлейные FX флаги.



Typedef struct _DDPIXELFORMAT {


DWORD dwSize;

DWORD dwFlags;

DWORD

dwFourCC;

union

{

DWORD

dwRGBBitCount;

DWORD

dwYUVBitCount;

DWORD

dwZBufferBitDepth;

DWORD

dwAlphaBitDepth;

};

union

{

DWORD

dwRBitMask;

DWORD

dwYBitMask;

};

union

{

DWORD

dwGBitMask;

DWORD

dwUBitMask;

};

union

{

DWORD

dwBBitMask;

DWORD

dwVBitMask;

};

union

{

DWORD

dwRGBAlphaBitMask;

DWORD

dwYUVAlphaBitMask;

};

} DDPIXELFORMAT, FAR * LPDDPIXELFORMAT;

Описывает формат пикселя объекта DirectDrawSurface.

dwSize

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

dwFlags

Определяет дополнительные флажки управления.



Typedef struct _DDSCAPS {


DWORD

dwCaps;

} DDSCAPS, FAR * LPDDSCAPS;

Определяет возможности DirectDrawSurface. Это - часть структуры DDCAPS, которая используется, чтобы описать возможности объекта DirectDraw.

dwCaps

Определяет возможности поверхности.



Unlock


Разнообразные           GetDDInterface        

                       

Оверлеи          AddOverlayDirtyRect           



Установка палитр на неосновныхПоверхностях


В DirectX 2, палитры могут быть присоединены к любой палитровой поверхности (основной, обратному буферу, вне экранной плоскость, или текстурную карту). Только те палитры, которые присоединены к основной поверхности будут иметь любой эффект на системной палитре. Важно обратить внимание, что блиттинг DirectDraw  никогда не выполняет преобразование цвета — все палитры, присоединенные к источнику, или поверхности адресата блиттинга игнорируются. Кроме того,  метод IDirectDrawSurface::GetDC, также игнорирует любой DirectDrawPalette, выбранный для поверхности.

Неосновные поверхностные палитры предназначены для использования прикладными программами или Direct3D.



Возвращает DDERR_ALREADYINITIALIZED.


lpGUID

Адрес GUID, используемого как идентификатор интерфейса.

Этот метод предусматривает согласие с моделью компонентных объектов (COM). Так как объект DirectDraw инициализируется, когда он создан, вызов этого метода будет всегда кончаться значением возврата DDERR_ALREADYINITIALIZED.

См. также IDirectDraw:: AddRef, IDirectDraw:: QueryInterface, IDirectDraw:: Release


lpDD

Адрес структуры DirectDraw, которая представляет объект DirectDraw.

lpDDSurfaceDesc

Адрес структуры DDSURFACEDESC для  заполнения релевантными подробностями относительно поверхности.

Этот метод предусмотрен для согласия с COM протоколом. Так как объект DirectDrawSurface инициализирован при создании, вызов этого метода будет всегда возвращать DDERR_ALREADYINITIALIZED.

См. также IDirectDrawSurface:: AddRef, IDirectDrawSurface:: QueryInterface, IDirectDrawSurface:: Release




lpDD

Адрес структуры DirectDraw, которая представляет объект DirectDraw.

dwFlags

Этот параметр не используется в настоящеео время и должен быть установлен в 0.

Этот метод предусмотрен для согласия COM протоколом. Так как объект DirectDrawClipper инициализирован при создании, вызов этого метода будет всегда кончаться значением возврата DDERR_ALREADYINITIALIZED.

См. также IDirectDrawClipper:: AddRef, IDirectDraw:: CreateClipper, IDirectDrawClipper:: QueryInterface, IDirectDrawClipper:: Release



Возвраты DDERR_ALREADYINITIALIZED.


lpDD

Адрес структуры DirectDraw, которая представляет объект DirectDraw.

dwFlags

Этот параметр не используется в настоящее время и должен быть установлен в 0.

lpDDColorTable

Этот параметр не используется в настоящее время и должен быть установлен в 0.

Этот метод предусмотрен для согласия  с COM протоколом. Так как объект DirectDrawPalette инициализирован при создании, вызов этого метода будет всегда кончаться значением возврата DDERR_ALREADYINITIALIZED.

См. также IDirectDrawPalette:: AddRef, IDirectDrawPalette:: QueryInterface, IDirectDrawPalette:: Initialize



Введение в DirectDraw


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



Вызов COM объектов из C


Любой метод интерфейса COM может вызываться из программы на C. Имеются две вещи, которые Вы должны помнить при вызове метода интерфейса из C:

Первый параметр метода - всегда ссылка на объект, который был создан и вызывает метод ( параметр this).

Каждый метод в интерфейсе вызывается через указатель на vtable объекта.

Следующий пример создает поверхность, связанную с объектом DirectDraw,  вызывая метод IDirectDraw:: CreateSurface , использующий язык программирования C:

ret = lpDD- > lpVtbl- > CreateSurface (lpDD, &ddsd, &lpDDS,



WaitForVerticalBlank


Установка поведения            SetCooperativeLevel            

                       

Поверхности  DuplicateSurface      



Z-буферы


В DirectX 2, DirectDraw HEL может создавать z-буферы для использования Direct3D или другим 3D, представляющим программное обеспечение. HEL поддерживает z-буферы, и 16- и с 32 битами. DirectDraw драйвер устройства для 3D ускоренной плата дисплея может разрешать создание z-буферов в памяти дисплея,  экспортируя поверхностную возможность DDSCAPS_ZBUFFER. Он должен также определить z-буфер глубину используя dwZBufferBitDepths член структуры DDCAPS.

Z-буферы могут быть очищены, используя  IDirectDrawSurface:: Blt. Новый DirectDraw флажок  блиттинга (DDBLT_DEPTHFILL) был определен, чтобы указать, что блиттинг очищает z-буфер. Если этот флажок определен, структура DDBLTFX, переданная в IDirectDrawSurface:: Blt должна иметь dwFillDepth набор членов к требуемой z-глубине . Если DirectDraw драйвер устройства для 3D ускоренной платы дисплея разработан, чтобы обеспечить поддержку для очистки z-буфера в аппаратных средствах, то экспортируя эту возможность, помечают DDCAPS_BLTDEPTHFILL и должен существовать  код, чтобы обработать DDBLT_DEPTHFILL блиттинг. Поверхность адресата при блиттинге  должна быть z-буфером.