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

       

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


Последняя функция, 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; }


Для работы с пикселями каждой строки используются два указателя, surf и image. Первый является указателем на 32-битный тип DWORD и используется для перебора 32-битных пикселей в памяти поверхности. Второй является указателем на 24-битный тип RGBTRIPLE и используется для доступа к пикселям графических данных. Функция вряд ли нуждается в пояснениях, поскольку она ничем не отличается от своего аналога для 24-битных поверхностей, кроме типа указателя surf и отсутствия оптимизированного варианта цикла.



Содержание раздела