Трухильо Стэн
Шрифт:
Перед тем как рассматривать функцию UpdateAviSurface, я хочу обратить ваше внимание на ее сходство с кодом класса DirectDrawWin, предназначенным для загрузки BMP-файлов на поверхность (см. главу 5). Функция UpdateAviSurface, как и функции загрузки BMP-файлов DirectDrawWin, блокирует поверхность и затем копирует данные в ее память:
После блокировки поверхности функция UpdateAviSurface в цикле копирует каждую строку пикселей AVI-данных в память поверхности. В формате AVI, как и в формате BMP, изображения хранятся в перевернутом виде, поэтому мы начинаем с последней строки буфера данных и двигаемся к его началу.
Все трудное осталось позади, дальше будет легко. Особенно просто реализуется функция RestoreSurfaces:
Вспомните — функция RestoreSurfaces вызывается только при восстановлении потерянных поверхностей, а класс DirectDrawWin автоматически восстанавливает первичную поверхность со вторичным буфером. В программе AviPlay остается лишь восстановить поверхность AVI, а для этого достаточно вызвать функцию Restore интерфейса DirectDrawSurface.
В некоторых программах функция RestoreSurfaces восстанавливала не только область памяти, но и содержимое поверхности. В нашем случае можно ограничиться восстановлением памяти, потому что ее содержимое будет перезаписано следующим кадром. Если вы вдруг засомневаетесь, напомню — вызов функции Restore для поверхности, которая не была потеряна (например, находящейся в системной памяти), не причинит никакого вреда.
В программе AviPlay ввод не играет особой роли. Программа реагирует всего на три клавиши, причем одинаково. Ввод с клавиатуры обрабатывается функцией OnKeyDown:
Все три клавиши вызывают функцию ShowDialog. Аналогично обрабатывается и ввод от мыши, это происходит в функции OnRButtonDown:
Когда пользователь закрывает диалоговое окно для выбора AVI-файла, функция ShowDialog посылает сообщение WM_CLOSE, сигнализируя о завершении приложения.
Остается лишь завершить приложение. Функция OnDestroy занимается «уборкой мусора» — она закрывает открытые AVI-потоки, освобождает декомпрессор и буферы данных AVI: