Стэн Трухильо - Графика для Windows средствами DirectDraw

Здесь есть возможность читать онлайн «Стэн Трухильо - Графика для Windows средствами DirectDraw» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Графика для Windows средствами DirectDraw: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Графика для Windows средствами DirectDraw»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Графика для Windows средствами DirectDraw — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Графика для Windows средствами DirectDraw», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Функция DoModal()отображает диалоговое окно, в котором пользователь может выбрать нужный файл. При нажатии кнопки Cancelмы посылаем сообщение WM_CLOSE. Если все идет нормально, мы получаем имя выбранного файла (в трех различных формах) вместе с индексом видеорежима (видеорежим необходимо выбрать до нажатия кнопки Play). Размеры выбранного видеорежима, взятые из массива displaymode, передаются функции SetDisplayMode().

Дальше следует вызов функции LoadAvi(). Как вы вскоре убедитесь, функция LoadAvi()на самом деле не загружает видеоролик — она лишь открывает файл и извлекает сведения о ролике (например, количество кадров и их размеры). Функция CreateAviSurface()по полученным размерам создает поверхность для хранения одного кадра видеопотока.

Функция InstallPalette()извлекает данные палитры из AVI-файла и строит по ним палитру DirectDraw, которая лучше всего подходит для просмотра. Наконец, переменной curframe, предназначенной для перебора кадров, присваивается значение переменной startframe.

Функция LoadAvi()

Перейдем к функции, которая непосредственно открывает AVI-файл. Функция LoadAvi()приведена в листинге 8.3.

Листинг 8.3. Функция LoadAvi()

BOOL AviPlayWin::LoadAvi() {

long r;

CWaitCursor cur;

if (avistream) AVIStreamRelease(avistream), avistream=0;

r=AVIStreamOpenFromFile(&avistream, filename, streamtypeVIDEO, 0, OF_READ | OF_SHARE_EXCLUSIVE, 0);

TRACE("AVIStreamOpenFromFile: %s\n", r==0 ? "OK" : "failed");

r=AVIStreamFormatSize(avistream, 0, &fmtlen);

TRACE("AVIStreamFormatSize: %s\n", r==0 ? "OK" : "failed");

int formatsize=fmtlen+sizeof(RGBQUAD)*256;

if (srcfmt) delete [] srcfmt;

srcfmt = (LPBITMAPINFOHEADER)new BYTE[formatsize];

ZeroMemory(srcfmt, formatsize);

if (dstfmt) delete [] dstfmt;

dstfmt = (LPBITMAPINFOHEADER)new BYTE[formatsize];

ZeroMemory(dstfmt, formatsize);

r=AVIStreamReadFormat(avistream, 0, srcfmt, &fmtlen);

TRACE("AVIStreamReadFormat: %s\n", r==0 ? "OK" : "failed");

TRACE(" --- %s ---\n", filename);

TRACE(" biSize: %d\n", srcfmt->biSize);

TRACE(" biWidth x biHeight: %dx%d\n", srcfmt->biWidth, srcfmt->biHeight);

if (srcfmt->biPlanes != 1) TRACE(" - biPlanes: %d\n", srcfmt->biPlanes);

TRACE(" biBitCount: %d\n", srcfmt->biBitCount);

CString comp;

switch (srcfmt->biCompression) {

case BI_RGB:

comp="BI_RGB";

break;

case BI_RLE8:

comp="BI_RLE8";

break;

case BI_RLE4:

comp="BI_RLE4";

break;

case BI_BITFIELDS:

comp="BI_BITFIELDS";

break;

}

TRACE(" biCompression: %s\n", comp);

TRACE(" biSizeImage: %d\n", srcfmt->biSizeImage);

TRACE(" ------------------\n");

memcpy(dstfmt, srcfmt, fmtlen);

dstfmt->biBitCount = 8;

dtfmt->biCompression = BI_RGB;

dstfmt->biSizeImage = dstfmt->biWidth * dstfmt->biHeight;

startframe = AVIStreamStart(avistream);

TRACE("stream start: %d\n", startframe);

endframe = AVIStreamEnd(avistream);

TRACE("stream end: %d\n", endframe);

r=AVIStreamInfo(avistream, &streaminfo, sizeof(streaminfo));

TRACE("AVIStreamInfo: %s\n", r==0 ? "OK" : "failed" );

buflen = dstfmt->biSizeImage;

int finalbuflen=((dstfmt->biWidth+3) & ~3) * dstfmt->biHeight;

if (streaminfo.dwSuggestedBufferSize) if ((LONG)streaminfo.dwSuggestedBufferSize < buflen) {

TRACE("adjusting buflen to suggested size\n");

buflen = (LONG)streaminfo.dwSuggestedBufferSize;

}

if (decomp) ICClose(decomp);

decomp = ICDecompressOpen(ICTYPE_VIDEO, streaminfo.fccHandler, srcfmt, dstfmt);

TRACE("ICDecompressOpen: %s\n", decomp ? "OK" : "failed");

if (rawdata) {

TRACE("delete [] rawdata...\n");

delete [] rawdata;

}

rawdata = new BYTE[buflen];

if (finaldata) {

TRACE("delete [] finaldata...\n");

delete [] finaldata;

}

finaldata = new BYTE[finalbuflen];

return TRUE;

}

В функции LoadAvi()используются функции VFW. Сначала LoadAvi()закрывает открытый ранее AVI-поток функцией AVIStreamRelease(), а затем открывает новый поток функцией AVIStreamOpenFromFile(), которой в числе прочих аргументов передается имя открываемого AVI-файла.

Обратите внимание — третьим аргументом функции AVIStreamOpenFromFile()является флаг, определяющий тип открываемого потока. В нашем случае использован флаг видеопотока streamtypeVIDEO, но с помощью трех оставшихся флагов ( streamtypeAUDIO, streamtypeMIDIи streamtypeTEXT) можно открывать и потоки других типов.

Затем мы получаем данные о формате потока функцией AVIStreamReadFormat()(пользуясь при этом функцией AVIStreamFormatSize()). Я специально оставил в этом фрагменте отладочные макросы TRACE(), чтобы продемонстрировать, какую информацию можно получить об AVI-файле.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Графика для Windows средствами DirectDraw»

Представляем Вашему вниманию похожие книги на «Графика для Windows средствами DirectDraw» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Графика для Windows средствами DirectDraw»

Обсуждение, отзывы о книге «Графика для Windows средствами DirectDraw» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x