После освобождения поверхности, созданной ранее, функция CreateAviSurface с помощью
функции CreateSurface интерфейса DirectDraw создает поверхность, размеры которой совпадают с размерами кадра. Кроме того, функция CreateAviSurface инициализирует переменные x и y, определяющие положение поверхности AVI на вторичном буфере. В нашем случае кадры будут выравниваться по центру экрана, поэтому в вычислениях применяется функция DirectDrawWin::GetDisplayRect для определения размеров экрана.
Функция InstallPalette
С помощью файлового формата AVI и VFW API можно получить палитру, оптимально подходящую для просмотра видеоролика. Функция InstallPalette извлекает необходимые данные и использует их для конструирования палитры DirectDraw. Функция InstallPalette выглядит так:
Функция ICDecompressGetPalette получает данные палитры и в цикле преобразует их в формат, который мы можем использовать. Полученный массив передается при вызове функции CreatePalette интерфейса DirectDraw. Остается лишь присоединить созданную палитру к первичной поверхности.
Функция DrawScene
Наконец, все готово к отображению кадров видеоролика. Для этого мы подготавливаем и выводим очередной кадр при каждом вызове функции DrawScene классом DirectDrawWin. Функция DrawScene выглядит так:
с помощью функции AVIStreamRead извлекает очередной кадр из AVI-потока, после чего сохраняет полученные данные в буфере rawdata. Я оставил в ней несколько макросов TRACE, которые пригодились мне при отладке, но надеюсь, что вам они не понадобятся.
Затем мы вызываем функцию ICDecompress и передаем ей логический номер декомпрессора, ранее полученный от функции LoadAvi. Аргументами функции ICDecompress являются два буфера — первый содержит необработанные (сжатые) данные, а второй — восстановленное изображение.
Функция UpdateAviSurface копирует восстановленный кадр на поверхность AVI. Эта функция рассматривается ниже.
Подготовленная поверхность AVI копируется во вторичный буфер функцией BltFast интерфейса DirectDrawSurface. После этого переменная curframe увеличивается или сбрасывается в зависимости от ее значения и количества кадров в ролике. Наконец, функция Flip интерфейса DirectDrawSurface выводит кадр на экран.
Функция UpdateAviSurface
Перед тем как рассматривать функцию UpdateAviSurface, я хочу обратить ваше внимание на ее сходство с кодом класса DirectDrawWin, предназначенным для загрузки BMP-файлов на поверхность (см. главу 5). Функция UpdateAviSurface, как и функции загрузки BMP-файлов DirectDrawWin, блокирует поверхность и затем копирует данные в ее память: