Последняя функция, Copy_Bmp24_Surface32(), предназначена для 32-битных поверхностей и очень напоминает функцию Copy_Bmp24_Surface24(). Если бы в 32-битной поверхности все 32 бита использовались для хранения цветовых составляющих, нам пришлось бы выполнять расширение цветов, но так как используется только 24 бита, в этом нет необходимости. Функция Copy_Bmp24_Surface32() приведена в листинге 5.4.
Листинг 5.4. Функция Copy_Bmp24_Surface32()
| BOOL DirectDrawWin::Copy_Bmp24_Surface32( 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_Surface32: 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]); for(int i=0; i<h; i++ ) { DWORD* surf=(DWORD*)surfbits; RGBTRIPLE* image=(RGBTRIPLE*)imagebits; for (int p=0;p<w;p++) { DWORD r=image->rgbtRed << loREDbit; DWORD g=image->rgbtGreen << loGREENbit; DWORD b=image->rgbtBlue << loBLUEbit; DWORD* data=(DWORD*)surf; *data = r|g|b; surf++; image++; } surfbits += desc.lPitch; imagebits -= bytesgiven; } surf->Unlock( 0 ); return TRUE; } |