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

Тут можно читать онлайн Стэн Трухильо - Графика для Windows средствами DirectDraw - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Графика для Windows средствами DirectDraw
  • Автор:
  • Жанр:
  • Издательство:
    неизвестно
  • Год:
    неизвестен
  • ISBN:
    нет данных
  • Рейтинг:
    4.88/5. Голосов: 81
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 100
    • 1
    • 2
    • 3
    • 4
    • 5

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

Графика для Windows средствами DirectDraw - описание и краткое содержание, автор Стэн Трухильо, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

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

Графика для Windows средствами DirectDraw - читать книгу онлайн бесплатно, автор Стэн Трухильо
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Давайте посмотрим, как реализована функция CreateSurface()(см. листинг 5.1).

Листинг 5.1. Функция CreateSurface()

LPDIRECTDRAWSURFACE DirectDrawWin::CreateSurface(LPCTSTR filename, BOOL installpalette) {

int imagew, imageh;

GetBmpDimensions(filename, imagew, imageh);

LPDIRECTDRAWSURFACE surf=CreateSurface(imagew, imageh);

if (surf==0) {

TRACE("CreateSurface(filename) failed to create surface\n");

return 0;

}

ifstream bmp(filename, ios::binary | ios::nocreate);

if (!bmp.is_open()) {

TRACE("LoadSurface: cannot open Bmp file\n");

return 0;

}

BITMAPFILEHEADER bmpfilehdr;

bmp.read((char*)&bmpfilehdr, sizeof(bmpfilehdr));

char* ptr=(char*)&bmpfilehdr.bfType;

if (*ptr!='B' || *++ptr!='M') {

TRACE("invalid bitmap\n");

return 0;

}

BITMAPINFOHEADER bmpinfohdr;

bmp.read((char*)&bmpinfohdr, sizeof(bmpinfohdr));

bmp.seekg(sizeof(bmpfilehdr)+bmpinfohdr.biSize, ios::beg);

int imagebitdepth=bmpinfohdr.biBitCount;

int imagesize=bmpinfohdr.biSizeImage;

if (imagesize==0) imagesize=((imagew*(imagebitdepth/8)+3) & ~3)*imageh;

if (bmpinfohdr.biCompression!=BI_RGB) {

TRACE("compressed BMP format\n");

return 0;

}

TRACE("loading '%s': width=%d height=%d depth=%d\n", filename, imagew, imageh, imagebitdepth);

if (imagebitdepth==8) {

int ncolors;

if (bmpinfohdr.biClrUsed==0) ncolors=256;

else ncolors=bmpinfohdr.biClrUsed;

RGBQUAD* quad=new RGBQUAD[ncolors];

bmp.read((char*)quad, sizeof(RGBQUAD)*ncolors);

if (installpalette) CreatePalette(quad, ncolors);

delete[] quad;

}

BYTE* buf=new BYTE[imagesize];

bmp.read(buf, imagesize);

if (!Copy_Bmp_Surface(surf, &bmpinfohdr, buf)) {

TRACE("copy failed\n");

delete[] buf;

surf->Release();

return 0;

}

delete[] buf;

return surf;

}

Сначала эта функция определяет размеры изображения из BMP-файла с помощью функции GetBmpDimensions() — простой функции класса DirectDrawWin, которая открывает BMP-файл и извлекает из заголовка ширину и высоту изображения. На основании полученных данных создается новая поверхность с использованием версии CreateSurface(), которая создает поверхность по ее размерам. Новая поверхность заполнена случайными пикселями, но мы не стираем ее, потому что вскоре значение каждого пикселя будет задано в соответствии с содержимым BMP-файла.

Затем мы открываем BMP-файл с помощью класса ifstreamи извлекаем из него данные заголовка. Далее проверяется сигнатура файла; если проверка дает отрицательный результат, BMP-файл может содержать неверную информацию, поэтому функция завершает работу.

Дополнительные данные заголовка извлекаются с помощью структуры BITMAPINFOHEADER. Обратите внимание: после заполнения структуры текущая позиция в файле ifstreamизменяется в соответствии со значением поля biSize. Это сделано для того, чтобы в будущем, при увеличении размера структуры BITMAPINFOHEADER, наша программа нормально работала с новыми BMP-файлами.

Ширина и высота изображения уже известны, поэтому читать значения полей biWidthи biHeightструктуры BITMAPINFOHEADERне нужно. Функция CreateSurface()считывает глубину пикселей ( biBitCount) и размер изображения ( biSizeImage). Как упоминалось выше, поле biSizeImageчасто равно нулю, поэтому мы проверяем его значение. Снова приведу соответствующий фрагмент кода:

int imagesize=bmpinfohdr.biSizeImage;

if (imagesize==0) imagesize=((imagew*(imagebitdepth/8)+3) & ~3)*imageh;

Если поле biSizeImageотлично от нуля, мы оставляем текущее значение. В противном случае его приходится вычислять самостоятельно по известному размеру и глубине пикселей изображения. Обратите внимание на то, что выравнивание по границе параграфа выполняется за счет битовых операций.

И последняя проверка: по содержимому поля biCompressionмы убеждаемся, что BMP-файл не содержит сжатых данных, не поддерживаемых нами. Для сжатых файлов функция возвращает ноль, код неудачного завершения.

Если изображение является палитровым, мы загружаем палитру. Количество элементов палитры в файле определяется полем biClrUsed, но это поле также может быть равно нулю. В этом случае предполагается, что присутствуют все 256 элементов палитры. Палитра загружается лишь в том случае, если параметр installpaletteравен TRUE; тогда вызывается функция CreatePalette(). Вскоре мы рассмотрим код этой функции.

Следующий этап — чтение графических данных, которое в нашем случае выполняется одним вызовом функции ifstream::read(). Графические данные передаются функции Copy_Bmp_Surface(), отвечающей за пересылку данных новой поверхности. После возврата из функции Copy_Bmp_Surface()буфер с графическими данными освобождается. BMP-файл автоматически закрывается при возвращении из функции CreateSurface()(поскольку локальный объект ifstreamвыходит из области видимости).

Функция CreatePalette()

Если второй аргумент функции CreateSurface()равен TRUE, CreatePalette()создает и заполняет объект DirectDrawPaletteданными, полученными из BMP-файла. Функция CreatePalette()выглядит так:

BOOL DirectDrawWin::CreatePalette(RGBQUAD* quad, int ncolors){

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

PALETTEENTRY pe[256];

ZeroMemory(pe, sizeof(pe));

for(int i=0; i

pe[i].peRed = quad[i].rgbRed;

pe[i].peGreen = quad[i].rgbGreen;

pe[i].peBlue = quad[i].rgbBlue;

}

HRESULT r=ddraw2->CreatePalette(DDPCAPS_8BIT | DDPCAPS_ALLOW256, pe, &palette, 0);

if (r!=DD_OK) {

TRACE("failed to reate DirectDraw palette\n");

return FALSE;

}

primsurf->SetPalette(palette);

return TRUE;

}

Палитры DirectDraw создаются функцией CreatePalette()интерфейса DirectDraw, которой передается массив структур PALETTEENTRY. Чтобы выполнить это требование, приходится преобразовывать массив структур RGBQUAD, извлеченный из BMP-файла, во временный массив (структуры PALETTEENTRYи RGBQUADочень похожи, поэтому такое преобразование оказывается тривиальным). Затем созданный массив передается функции CreatePalette(). Флаг DDPCAPS_ALLOW256сообщает, что мы намерены задать значения всех 256 элементов палитры. Если вы пропустили главу 4 (конечно же, нет!), вернитесь к ней и ознакомьтесь с возможными аспектами использования этого флага.

Наконец, функция SetPalette()интерфейса DirectDrawSurface()присоединяет палитру к поверхности. Обратите внимание на то, что палитра присоединяется к первичной поверхности. Хотя палитры можно присоединять и к другим поверхностям, на системную палитру влияет только палитра, присоединенная к первичной поверхности.

Передача графических данных

Как видно из функции CreateSurface(), передача графических данных BMP-файла на поверхность осуществляется функцией Copy_Bmp_Surface(). Функция Copy_Bmp_Surface()пользуется услугами четырех вспомогательных функций, каждая из которых специализируется на пикселях определенной глубины. Код Copy_Bmp_Surface()выглядит так:

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

Интервал:

Закладка:

Сделать


Стэн Трухильо читать все книги автора по порядку

Стэн Трухильо - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Графика для Windows средствами DirectDraw, автор: Стэн Трухильо. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x