Вход/Регистрация
Графика для 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 выводит кадр на экран.

  • Читать дальше
  • 1
  • ...
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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