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

       

Функция UpdateAviSurface()


Перед тем как рассматривать функцию UpdateAviSurface(), я хочу обратить ваше внимание на ее сходство с кодом класса DirectDrawWin, предназначенным для загрузки BMP-файлов на поверхность (см. главу5). Функция UpdateAviSurface(), как и функции загрузки BMP-файлов DirectDrawWin, блокирует поверхность и затем копирует данные в ее память:


BOOL AviPlayWin::UpdateAviSurface() { HRESULT r; if (finaldata==0) return FALSE; DWORD dwWidth = (srcfmt->biWidth+3) & ~3; DWORD dwHeight = srcfmt->biHeight; DDSURFACEDESC desc; ZeroMemory( &desc, sizeof(desc) ); desc.dwSize = sizeof(desc);

r = avisurf->Lock( 0, &desc, DDLOCK_WAIT, 0 ); if (r==DD_OK) { BYTE* src = finaldata + dwWidth * (dwHeight-1); BYTE* dst = (BYTE *)desc.lpSurface;

for (DWORD y=0; y<dwHeight; y++) { memcpy( dst, src, dwWidth ); dst += desc.lPitch; src -= dwWidth; } avisurf->Unlock( 0 ); }

return TRUE; }


После блокировки поверхности функция UpdateAviSurface()

в цикле копирует каждую строку пикселей AVI-данных в память поверхности. В формате AVI, как и в формате BMP, изображения хранятся в перевернутом виде, поэтому мы начинаем с последней строки буфера данных и двигаемся к его началу.



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