Вход/Регистрация
Графика для Windows средствами DirectDraw
вернуться

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

Шрифт:

Если изображение является палитровым, мы загружаем палитру. Количество элементов палитры в файле определяется полем 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<ncolors; 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 выглядит так:

BOOL DirectDrawWin::Copy_Bmp_Surface(LPDIRECTDRAWSURFACE surf, BITMAPINFOHEADER* bmphdr, BYTE* buf) {

 if (surf==0 || bmphdr==0 || buf==0) return FALSE;

 int imagew=bmphdr->biWidth;

 int imageh=bmphdr->biHeight;

 int imagebitdepth=bmphdr->biBitCount;

 BOOL ret=FALSE;

 if (imagebitdepth==8) {

if (displaydepth==8) ret=Copy_Bmp08_Surface08(surf, buf, imagew, imageh);

 } else if (imagebitdepth==24) {

if (displaydepth==16) ret=Copy_Bmp24_Surface16(surf, buf, imagew, imageh);

else if (displaydepth==24) ret=Copy_Bmp24_Surface24(surf, buf, imagew, imageh);

else if (displaydepth==32) ret=Copy_Bmp24_Surface32(surf, buf, imagew, imageh);

 }

 return ret;

}

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

8-битные поверхности

Начнем с самой простой из четырех функций, Copy_Bmp08_Surface08. Она выглядит так:

BOOL DirectDrawWin::Copy_Bmp08_Surface08(LPDIRECTDRAWSURFACE surf, BYTE* bmpbuf, int w, int h) {

 if (surf==0 || bmpbuf==0) return FALSE;

 DDSURFACEDESC desc;

 ZeroMemory(&desc, sizeof(desc));

 desc.dwSize = sizeof(desc);

 HRESULT r=surf->Lock(0, &desc, DDLOCK_WAIT | DDLOCK_WRITEONLY, 0);

  • Читать дальше
  • 1
  • ...
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • ...

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

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

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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