bitmap loading .....again yeah I know
Hi,
sorry about bringing this subject up again but I really cannot figure out whats wrong with my code.
I''am trying to load a bitmap onto a ddraw surface, I already tried this different ways (ddutil,functions from this board..) but nothing succeded.... :-( I am really about to give up.
Ok now heres the code:
The Bitmap loading function (copied from this forum):
LPDIRECTDRAWSURFACE4 Graphics::GPLoadBitmap(char* szBitmap)
{
LPDIRECTDRAWSURFACE4 bitSurface;
BITMAPINFOHEADER infoheader;
DDSURFACEDESC2 surfaceDesc;
WORD *bitmapData;
WORD *bitmapDone;
FILE *bitmapFile;
BYTE red, green, blue;
int padding;
bitmapFile = fopen(szBitmap, "rb");
fseek(bitmapFile, sizeof(BITMAPFILEHEADER), SEEK_SET);
fread(&infoheader, sizeof(BITMAPINFOHEADER), 1, bitmapFile);
// get the padding at the end of the bitmap
padding = 4 - ((infoheader.biWidth * 3) % 4);
if(padding == 4)
padding = 0;
ZeroMemory(&surfaceDesc, sizeof(surfaceDesc));
surfaceDesc.dwSize = sizeof(surfaceDesc);
surfaceDesc.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH;
surfaceDesc.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
surfaceDesc.dwWidth = infoheader.biWidth;
surfaceDesc.dwHeight = infoheader.biHeight;
lpdd->CreateSurface(&surfaceDesc, &(bitSurface), NULL);
ZeroMemory(&surfaceDesc, sizeof(surfaceDesc));
surfaceDesc.dwSize = sizeof(surfaceDesc);
bitSurface->Lock(NULL, &surfaceDesc, DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT, NULL);
bitmapData = new WORD[infoheader.biWidth * infoheader.biHeight];
bitmapDone = (WORD *)surfaceDesc.lpSurface;
for( int y=0; y=0; --y)
{
for( int x=0; xUnlock(NULL);
fclose(bitmapFile);
return(bitSurface);
} // end load Bitmap
Now the drawing function:
bool Graphics::GPDrawBitmap(LPDIRECTDRAWSURFACE4 surface,int x,int y,int width,int height,COLORREF srckey )
{
//LPDIRECTDRAWSURFACE4 tempsurface = NULL;
// clear ddsd
RECT dest_rect,source_rect;
ZeroMemory(&ddbltfx, sizeof( ddbltfx )); // zero out struct
ddbltfx.dwSize = sizeof( ddbltfx ); // set structs size
ddbltfx.dwFillColor = 0; // Set the fill color // (0 equals black)
lpddsback->Blt(NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &ddbltfx);
source_rect.left = 0;
source_rect.top = 0;
source_rect.right = ddsd.dwWidth-1;
source_rect.bottom = ddsd.dwHeight-1;
dest_rect.left = x;
dest_rect.top = y;
dest_rect.right = x+width-1;
dest_rect.bottom = y+height-1;
if(srckey != NULL){
DDSetColorKey(surface,srckey); // function form ddutil
if(FAILED(lpddsback->Blt(&dest_rect,surface,&source_rect,(DDBLT_WAIT | DDBLT_KEYSRC),NULL)))
return(false);
}
if(FAILED(lpddsback->Blt(&dest_rect,surface,&source_rect,DDBLT_WAIT,NULL)))
return(false);
return(true);
}
Here in the game initialization Im loading the bitmap:
map = Graphics::GPLoadBitmap("Grafik/level1.bmp");
and in the game main loop it should be drawn:
Graphics::GPDrawBitmap(map,0,0,SCREEN_WIDTH,SCREEN_HEIGHT,NULL);
---------------------------
the code compiles just fine but the screen stays blank....
It would be very nice if someone could take the time to look trough my code ...... thanks in advance....
_amigo
Well, I''m tired of looking at other people''s code so heres my own for loading a bitmap (built about 3 years ago when I didn''t care about making it neat looking and I''m too lazy to change it right now or take into account bmps which aren''t multiples of 4 as far as their width goes.):
class Bitmap_File
{
public:
unsigned int height,width;
unsigned short bpp;
unsigned char *buffer;
Bitmap_File(const char *file)
{
unsigned char temp;
unsigned short temp2;
unsigned int temp3;
ifstream filen;
filen.open(file,ios::in|ios::binary);
if(!filen)
MessageBox( NULL, "Problem with opening file","Nova", MB_OK );
filen.seekg(10);
filen.read((unsigned char *)&temp3,sizeof(temp3));
unsigned int tempa=temp3;
filen.seekg(18);
filen.read((unsigned char *)&temp3,sizeof(temp3));
width=temp3;
filen.read((unsigned char *)&temp3,sizeof(temp3));
height=temp3;
filen.seekg(28);
filen.read((unsigned char *)&temp2,sizeof(temp2));
bpp=temp2;
filen.seekg(tempa);
buffer=new unsigned char[height*width*3];
filen.read(buffer,height*width*3);
filen.close();
unsigned char *temi=new unsigned char[height*width*3];
int x=(width*height*3)-1;
for(int y=0;y{
temi[x]=buffer[y];
x--;
}
for(y=0;yfor(x=0;x{
buffer[((width*3)-3-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)+2];
buffer[((width*3)-2-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)+1];
buffer[((width*3)-1-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)];
}
delete temi;
}
~Bitmap_File()
{
if(buffer)
delete buffer;
}
};
You should be able to copy it to the surface from there.
class Bitmap_File
{
public:
unsigned int height,width;
unsigned short bpp;
unsigned char *buffer;
Bitmap_File(const char *file)
{
unsigned char temp;
unsigned short temp2;
unsigned int temp3;
ifstream filen;
filen.open(file,ios::in|ios::binary);
if(!filen)
MessageBox( NULL, "Problem with opening file","Nova", MB_OK );
filen.seekg(10);
filen.read((unsigned char *)&temp3,sizeof(temp3));
unsigned int tempa=temp3;
filen.seekg(18);
filen.read((unsigned char *)&temp3,sizeof(temp3));
width=temp3;
filen.read((unsigned char *)&temp3,sizeof(temp3));
height=temp3;
filen.seekg(28);
filen.read((unsigned char *)&temp2,sizeof(temp2));
bpp=temp2;
filen.seekg(tempa);
buffer=new unsigned char[height*width*3];
filen.read(buffer,height*width*3);
filen.close();
unsigned char *temi=new unsigned char[height*width*3];
int x=(width*height*3)-1;
for(int y=0;y{
temi[x]=buffer[y];
x--;
}
for(y=0;yfor(x=0;x{
buffer[((width*3)-3-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)+2];
buffer[((width*3)-2-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)+1];
buffer[((width*3)-1-(3*x))+(y*3*width)]=temi[(x*3)+(y*3*width)];
}
delete temi;
}
~Bitmap_File()
{
if(buffer)
delete buffer;
}
};
You should be able to copy it to the surface from there.
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement