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


16-Битные поверхности



Загрузка 8-битных изображений выполняется достаточно просто. Давайте перейдем к 16-битным поверхностям, с ними дело обстоит значительно сложнее. Помимо учета разных типов 16-битных форматов пикселей нам придется сокращать количество цветов. 24-битные данные передаются на 16-битную поверхность, поэтому во время передачи необходимо «урезать» каждую цветовую составляющую. Функция Copy_Bmp24_Surface16() приведена в листинге 5.2.

Листинг 5.2. Функция Copy_Bmp24_Surface16()


BOOL DirectDrawWin::Copy_Bmp24_Surface16( LPDIRECTDRAWSURFACE surf, BYTE* bmpbuf, int w, int h ) { if (surf==0 || bmpbuf==0) return FALSE;

DDSURFACEDESC desc; ZeroMemory( &desc, sizeof(desc) ); desc.dwSize = sizeof(desc); HRESULT r=surf->Lock( 0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0 ); if (r!=DD_OK) { TRACE("Copy_Bmp24_Surface16: Lock() failed\n"); return FALSE; } int bytesrequired=w*3; int bytesgiven=(bytesrequired+3) & ~3; BYTE* surfbits = (BYTE*)desc.lpSurface; BYTE* imagebits = (BYTE*)(&bmpbuf[(h-1)*bytesgiven]);

float REDdiv=(float)256/(float)pow( 2, numREDbits ); float GREENdiv=(float)256/(float)pow( 2, numGREENbits ); float BLUEdiv=(float)256/(float)pow(2, numBLUEbits );

for( int i=0; i<h; i++ ) { USHORT* pixptr=(unsigned short*)surfbits; RGBTRIPLE* triple=(RGBTRIPLE*)imagebits; for (int p=0;p<w;p++) { float rf=(float)triple->rgbtRed/REDdiv; float gf=(float)triple->rgbtGreen/GREENdiv; float bf=(float)triple->rgbtBlue/BLUEdiv;

WORD r=(WORD)((WORD)rf<<loREDbit); WORD g=(WORD)((WORD)gf<<loGREENbit); WORD b=(WORD)((WORD)bf<<loBLUEbit); *pixptr = (WORD)(r|g|b); triple++; pixptr++; } surfbits += desc.lPitch; imagebits –= bytesgiven; } surf->Unlock( 0 );

return TRUE; }


Хотя по своей структуре функция Copy_Bmp24_Surface16() напоминает Copy_Bmp 08_Surface08(), она устроена сложнее по причинам, уже упоминавшимся, а также потому, что значение каждого пикселя приходится задавать отдельно. Давайте посмотрим, что происходит в этой функции.



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



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