Вызов CreateSurface()создает две поверхности: первичную поверхность и вторичный буфер. Позднее указатель на вторичный буфер понадобится нам для подготовки кадров. Чтобы получить этот указатель, следует вызвать функцию GetAttachedSurface()интерфейса DirectDrawSurfaceи передать ей структуру DDSCAPSс описанием типа интересующей нас присоединенной поверхности. Задавая флаг DDSCAPS_BACKBUFFER, мы вызываем функцию GetAttachedSurface(), которая инициализирует переменную backsurf. Она, как и переменная primsurf, объявлена защищенной, поэтому классы, производные от DirectDrawWin, могут легко обратиться к вторичному буферу.
После того как указатели primsurfи backsurfбудут инициализированы, ActivateDisplayMode()вызывает функцию StorePixelFormatData(). Эта функция с помощью функции GetPixelFormat()интерфейса DirectDrawSurfaceполучает информацию о формате хранения цветовых RGB-составляющих для отдельных пикселей. Формат пикселей зависит от видеокарты, а иногда даже от видеорежима, так что эти сведения оказываются полезными при прямых манипуляциях с поверхностями. Функция StorePixelFormatdata()выглядит так:
BOOL DirectDrawWin::StorePixelFormatData() {
DDPIXELFORMAT format;
ZeroMemory(&format, sizeof(format));
format.dwSize=sizeof(format);
if (backsurf->GetPixelFormat(&format)!=DD_OK) {
return FALSE;
}
loREDbit = LowBitPos(format.dwRBitMask);
WORD hiREDbit = HighBitPos(format.dwRBitMask);
numREDbits=(WORD)(hiREDbit-loREDbit+1);
loGREENbit = LowBitPos(format.dwGBitMask);
WORD hiGREENbit = HighBitPos(format.dwGBitMask);
numGREENbits=(WORD)(hiGREENbit-loGREENbit+1);
loBLUEbit = LowBitPos(format.dwBBitMask);
WORD hiBLUEbit = HighBitPos(format.dwBBitMask);
numBLUEbits=(WORD)(hiBLUEbit-loBLUEbit+1);
return TRUE;
}
Структура DDPIXELFORMATиспользуется в функции GetPixelFormat()для получения масок, показывающих, какие биты в каждом пикселе заняты красной, зеленой и синей цветовыми составляющими. Маски точно описывают формат пикселя, но на практике работать с ними оказывается не очень удобно. Вместо того чтобы просто сохранить полученные маски, мы на основании каждой из них инициализируем два целых числа. Первое число равно позиции младшего бита цветовой составляющей, а второе — количеству бит, необходимых для ее представления. Для поверхностей True color (24- и 32-битных) цветовые составляющие всегда представляются 8 битами, но для поверхностей High color (16-битных) это число изменяется (обычно 5, но иногда 6 для зеленой составляющей).
Класс DirectDrawWinсодержит шесть переменных для описания формата пикселей: loREDbit, numREDbits, loGREENbit, numGREENbits, loBLUEbitи numBLUEbits. Они используются некоторыми функциями DirectDrawWin, однако эти переменные объявлены как защищенные ( protected), поэтому к ним можно обращаться и из классов, производных от DirectDrawWin. Эти переменные будут рассмотрены в главе 5.
На этом инициализация приложения подходит к концу. Функция ActivateDisplayMode()вызывает еще одну функцию, CreateCustomSurfaces(), которая создает вспомогательные поверхности, но к этому моменту инициализация DirectDraw уже завершена. Функция CreateCustomSurfaces()будет рассмотрена в следующем разделе.
Но сначала давайте подведем итоги. Приложение состоит из двух объектов, BounceWinи BounceApp. Объект BounceAppотвечает за создание объекта BounceWin, а BounceWinв свою очередь инициализирует DirectDraw. Сначала он обнаруживает все имеющиеся драйверы DirectDraw, выбирает один из них и использует его для создания экземпляра интерфейса DirectDraw2. Затем он обнаруживает видеорежимы, поддерживаемые инициализированным драйвером, выбирает один из режимов и активизирует его. Далее создается первичная поверхность с возможностью переключения страниц (и вторичным буфером) и, наконец, анализируется формат пикселей для активизированного видеорежима.
Приложение почти готово к работе, но пока у него нет графических данных. Мы подходим к следующему этапу.
Подготовка поверхностей
Последняя функция, вызываемая в ActivateDisplayMode() (см. листинг 3.2), — CreateCustomSurfaces(). Эта функция является чисто виртуальной, поэтому классы, производные от DirectDrawWin, должны реализовать ее. Функция CreateCustomSurfaces()создает вспомогательные поверхности, а также инициализирует переменные и структуры данных. В классе BounceWinэта функция выглядит так:
BOOL BounceWin::CreateCustomSurfaces() {
CString filename;
if (GetCurDisplayDepth()==8) filename="tri08.bmp";
Читать дальше