Графика для 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 для зеленой составляющей).