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


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


BYTE r, g, b;

CDDPalette* pPal = pBB-»GetPalette () ;

if (pPal) {

pPal-»GetEntries (0, 256, ре) ;

// Задать нужные цветовые значения. // Мы воспользуемся моделью с 2-битной кодировкой // R, Си В-составляющих for (r = 0; r « 4; г++) { for (g = 0; g « 4; g++) ( for (b = 0; b « 4; b++) {

int index =10+r*16+g*4+b;

pe[index].peRed = r * 85;

ре[index].peGreen = g * 85;

pe[index].peBlue = b * 85;

}

/b> ЦУ Глава 12. Интерфейс DirectDraw

// Заполнить оставшиеся элементы палитры серым цветом, // чтобы их можно было увидеть при отладке for (int i = 10 + 4*4*4; i « 246; i++) {

ре[i].peRed = 192;

pe[i].peGreen = 192;

pe[i].peBlue = 192;

}

// Обновить палитру pPal-»SetEntries (0, 256, ре) ;

// Удалить объект палитры delete pPal;

}

Я заполнил свободные элементы палитры серым цветом, чтобы проследить за тем, как механизм визуализации распределяет используемые цвета. Рисование линий в буфере происходит следующим образом:

// Заблокировать буфер и получить указатель.

// ВНИМАНИЕ: Не пытайтесь включать пошаговое выполнение

// до вызова Unlock.

BYTE* pBuf = (BYTE*) pBB-»Lock () ;

if (pBuf) (

for (int у = 0; у « iHeight; y++) (

// Определить смещение начала строки int n = iwidth;

DWORD dwOffset = у * iPitch; // В байтах

// Получить цвет int ir = GetRValue(cIrLine);

int ig = GetGValue(clrLine);

int ib = GetBValue(cIrLine);

// Вывести пиксели непосредственно в буфер

switch (iBpp) (

case 8: {

// Найти индекс для цвета

// в соответствии с принятой нами моделью int index = 10 + (ir / 85) * 16 + (ig /85) * 4 + (ib / 85) ;

BYTE* p = pBuf + dwOffset;

while (n-) {

*p++ = (BYTE) index;

Работа с DirectDraw ^Щ 299

) breaks-case 16: (

// Построить цветовое значение

DWORD dw = (ir »» (8 - dwRBits)) ««

dwRShift

I (ig »» (8 - dwGBits)) «« dwGShift

I (ib »» (8 - dwBBits)) «« dwBShift;

WORD w = (WORD)dw;

WORD* p = (WORD*)(pBuf + dwOffset);

while (n—) *p++ = w;

) breaks-case 24:

// Упражнение для самостоятельной работы:

breaks-case 32: {

DWORD dw = (ir »» (8 - dwRBits)) «« dwRShift




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



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