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




Таблица 5.3. Типичные данные формата для 24-битных пикселей

ПолеЗначениеДвоичное значениеСтартовый битКоличество бит
dwRBitMask16711680111111110000000000000000168
dwGBitMask6528000000000111111111000000088
dwBBitMask25500000000000000001111111108

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

Переменные формата пикселей в классе DirectDrawWin

При описании класса DirectDrawWin в главе 3 мы видели, что функция DirectDrawWin::ActivateDisplayMode() после активизации нового видеорежима, но до создания вспомогательных поверхностей приложения, вызывает функцию StorePixelFormatData(). Описание этой функции было отложено до настоящего момента.

Функция StorePixelFormatData() присваивает значения шести переменным класса DirectDrawWin в соответствии с форматом пикселей текущего активного видеорежима; эти переменные определяют стартовый бит и количество бит для каждой цветовой составляющей пикселя. В следующем разделе мы увидим, как эти переменные используются при манипуляциях с памятью поверхности. Функция StorePixelFormatData() выглядит так:

>BOOL DirectDrawWin::StorePixelFormatData() {

> DDPIXELFORMAT format;

> ZeroMemory(&format, sizeof(format));

> format.dwSize=sizeof(format);

> if (primsurf->GetPixelFormat(&format)!=DD_OK) {

>  TRACE("StorePixelFormatData() failed\n");

>  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;

>}

Функция StorePixelFormatData() присваивает значения шести переменным формата с помощью масок, полученных функцией GetPixelFormat() интерфейса DirectDrawSurface. Это следующие переменные:

• loREDbit

• numREDbits

• loGREENbit

• numGREENbits

• loBLUEbit

• numBLUEbits

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

Блокировка поверхностей

Для прямого доступа к поверхности необходимо предварительно вызвать функцию Lock() интерфейса DirectDrawSurface. Lock() получает экземпляр структуры DDSURFACEDESC