Графика для Windows средствами DirectDraw | страница 53



создает две поверхности: первичную поверхность и вторичный буфер. Позднее указатель на вторичный буфер понадобится нам для подготовки кадров. Чтобы получить этот указатель, следует вызвать функцию 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 для зеленой составляющей).