Чтение онлайн

на главную - закладки

Жанры

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

Трухильо Стэн

Шрифт:

BOOL AviPlayWin::CreateAviSurface {

 if (avisurf) avisurf->Release, avisurf=0;

 avisurf=CreateSurface(srcfmt->biWidth, srcfmt->biHeight);

 CRect displayrect=GetDisplayRect;

 x=(displayrect.Width-srcfmt->biWidth)/2;

 y=0;

 return TRUE;

}

После освобождения поверхности, созданной ранее, функция CreateAviSurface с помощью

функции CreateSurface интерфейса DirectDraw создает поверхность, размеры которой совпадают с размерами кадра. Кроме того, функция CreateAviSurface инициализирует переменные x и y, определяющие положение поверхности AVI на вторичном буфере. В нашем случае кадры будут выравниваться по центру экрана, поэтому в вычислениях применяется функция DirectDrawWin::GetDisplayRect для определения размеров экрана.

Функция InstallPalette 

С помощью файлового формата AVI и VFW API можно получить палитру, оптимально подходящую для просмотра видеоролика. Функция InstallPalette извлекает необходимые данные и использует их для конструирования палитры DirectDraw. Функция InstallPalette выглядит так:

BOOL AviPlayWin::InstallPalette {

 ICDecompressGetPalette(decomp, srcfmt, dstfmt);

 PALETTEENTRY pe[256];

 LPBITMAPINFO info=(LPBITMAPINFO)dstfmt;

 for (int i=0; i<256; i++) {

pe[i].peRed = info->bmiColors[i].rgbRed;

pe[i].peGreen = info->bmiColors[i].rgbGreen;

pe[i].peBlue = info->bmiColors[i].rgbBlue;

pe[i].peFlags = 0;

 }

 if (avipal) avipal->Release;

 ddraw2->CreatePalette(DDPCAPS_8BIT, pe, &avipal, 0);

 primsurf->SetPalette(avipal);

 return TRUE;

}

Функция ICDecompressGetPalette получает данные палитры и в цикле преобразует их в формат, который мы можем использовать. Полученный массив передается при вызове функции CreatePalette интерфейса DirectDraw. Остается лишь присоединить созданную палитру к первичной поверхности.

Функция DrawScene 

Наконец, все готово к отображению кадров видеоролика. Для этого мы подготавливаем и выводим очередной кадр при каждом вызове функции DrawScene классом DirectDrawWin. Функция DrawScene выглядит так:

void AviPlayWin::DrawScene {

 long r;

 r=AVIStreamRead(avistream, curframe, 1, rawdata, buflen, 0, 0);

 if (r) {

TRACE("AVIStreamRead failed: ");

switch (r) {

case AVIERR_BUFFERTOOSMALL:

TRACE("BUFFERTOOSMALL\n");

break;

case AVIERR_MEMORY:

TRACE("MEMORY\n");

break;

case AVIERR_FILEREAD:

TRACE("FILEREAD\n");

break;

}

 }

 r=ICDecompress(decomp, 0, srcfmt, rawdata, dstfmt, finaldata);

 UpdateAviSurface;

 backsurf->BltFast(x, y, avisurf, 0, DDBLTFAST_WAIT);

 curframe=(curframe<endframe) ? curframe+1 : startframe;

 primsurf->Flip(0, DDFLIP_WAIT);

}

Функция DrawScene

с помощью функции AVIStreamRead извлекает очередной кадр из AVI-потока, после чего сохраняет полученные данные в буфере rawdata. Я оставил в ней несколько макросов TRACE, которые пригодились мне при отладке, но надеюсь, что вам они не понадобятся.

Затем мы вызываем функцию ICDecompress и передаем ей логический номер декомпрессора, ранее полученный от функции LoadAvi. Аргументами функции ICDecompress являются два буфера — первый содержит необработанные (сжатые) данные, а второй — восстановленное изображение.

Функция UpdateAviSurface копирует восстановленный кадр на поверхность AVI. Эта функция рассматривается ниже.

Подготовленная поверхность AVI копируется во вторичный буфер функцией BltFast интерфейса DirectDrawSurface. После этого переменная curframe увеличивается или сбрасывается в зависимости от ее значения и количества кадров в ролике. Наконец, функция Flip интерфейса DirectDrawSurface выводит кадр на экран.

Функция 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);

Поделиться:
Популярные книги

Имя нам Легион. Том 8

Дорничев Дмитрий
8. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 8

Возвращение Безумного Бога

Тесленок Кирилл Геннадьевич
1. Возвращение Безумного Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Возвращение Безумного Бога

Возвышение Меркурия. Книга 3

Кронос Александр
3. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 3

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Охотник за головами

Вайс Александр
1. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Охотник за головами

Санек 4

Седой Василий
4. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 4

Подаренная чёрному дракону

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.07
рейтинг книги
Подаренная чёрному дракону

По дороге на Оюту

Лунёва Мария
Фантастика:
космическая фантастика
8.67
рейтинг книги
По дороге на Оюту

Вечная Война. Книга II

Винокуров Юрий
2. Вечная война.
Фантастика:
юмористическая фантастика
космическая фантастика
8.37
рейтинг книги
Вечная Война. Книга II

Последняя Арена 6

Греков Сергей
6. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 6

Отмороженный

Гарцевич Евгений Александрович
1. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный

Пистоль и шпага

Дроздов Анатолий Федорович
2. Штуцер и тесак
Фантастика:
альтернативная история
8.28
рейтинг книги
Пистоль и шпага

Конструктор

Семин Никита
1. Переломный век
Фантастика:
попаданцы
альтернативная история
4.50
рейтинг книги
Конструктор

Прометей: Неандерталец

Рави Ивар
4. Прометей
Фантастика:
героическая фантастика
альтернативная история
7.88
рейтинг книги
Прометей: Неандерталец