Графика для Windows средствами DirectDraw | страница 97
Таблица 5.3. Типичные данные формата для 24-битных пикселей
Поле | Значение | Двоичное значение | Стартовый бит | Количество бит |
---|---|---|---|---|
dwRBitMask | 16711680 | 111111110000000000000000 | 16 | 8 |
dwGBitMask | 65280 | 000000001111111110000000 | 8 | 8 |
dwBBitMask | 255 | 000000000000000011111111 | 0 | 8 |
Помните — данные в этих таблицах относятся к конкретной аппаратуре. Они представлены лишь для примера того, как могут выглядеть такие данные, а не как исчерпывающее руководство по форматам пикселей.
При описании класса 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