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


Функция CreateSurface()



Функция CreateSurface() требует, чтобы изображение в передаваемом BMP-файле было палитровым или беспалитровым в зависимости от текущего видеорежима. Она не станет загружать палитровые изображения на беспалитровую поверхность, и наоборот. В принципе это возможно, но непрактично. Загрузить палитровое изображение на беспалитровую поверхность довольно просто, но глупо, потому что при этом будет использоваться лишь малая часть возможностей поверхности (всего 256 цветов из 16 миллионов). С другой стороны, загрузка беспалитровых изображений на палитровую поверхность потребует программного сокращения миллионов цветов до 256-цветной палитры.

Давайте посмотрим, как реализована функция 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; }

<


Начало  Назад  Вперед