ПРОГРАМИРУЕМ 3D ГРАФИКУ ИСПОЛЬЗУЯ DirectX


Интерфейс DirectDraw - часть 20


После того как мы будем знать количество бит на пиксель и маски для красной, зеленой и синей составляющих (или индексы палитры), можно приступать к рисованию. Чтобы определить смещение в буфере, по которому нужно записать пиксель, умножьте ширину буфера на номер строки. Ширина буфера измеряется в байтах. Она может отличаться от количества пикселей, умноженного на количество байт на пиксель, потому что строки часто дополняются по границе ближайших 4 байтов (32-разрядное выравнивание).

Приведенный ниже фрагмент определяет формат пикселей для вторичного буфера:

void CTestWnd::TestDirectPixels() (

// Получить информацию о вторичном буфере

int iBpp = pBB-»GetBitsPerPixel () ;

ASSERT(iBpp »= 8);

int iWidth - pBB-»GetWidth() ;

int iHeight = pBB-»GetHeight () ;

int iPitch = pBB-»GetPitch() ;

// Получить RGB-маски DWORD dwRMask, dwGMask, dwBMask;

pBB-»GetRGBMasks (dwRMask, dwGMask, dwBMask) ;

// Для каждой маски определить ширину в битах // и количество бит, на которые маска // смещена от конца младшего байта DWORD dwRShift, dwGShift, dwBShift;

DWORD dwRBits, dwGBits dwBBits;

dwRShift = dwRBits = 0 dwGShift = dwGBits = 0 dwBShift = dwBBits = 0 if (iBpp » 8) {

DWORD d = dwRMask;

while ((d & 0х1) == 0) ( d = d »» 1;

dwRShift++;

)

while (d & 0х01) { d = d »» 1;

dwRBits++;

}

Работа с DirectDraw ж! 297

d = dwGMask;

while ( (d & 0х1) ==0) {

d = d »» 1;

dwGShift++;

}

while (d & 0х01) { d = d »» 1;

dwGBits++;

} d = dwBMask;

while ((d & 0х1) == 0) (

d = d »» 1;

dwBShift++;

}

while (d & 0х01) { d = d »» 1;

dwBBits++;

}

i

Обратите внимание на то, что цветовые маски нужны лишь в том случае, когда пиксели поверхности кодируются более чем 8 битами. Кроме того, предполагается, что поверхность имеет формат RGB, а не YUV или какой-нибудь другой. В случае 8-битной кодировки пикселей необходимо создать палитру:

// Если буфер имеет 8-битную кодировку пикселей, // получить элементы палитры и присвоить им // нужные цветовые значения PALETTEENTRY ре [256];




Начало  Назад  Вперед



Книжный магазин