Archived

This topic is now archived and is closed to further replies.

bitmap loading .....again yeah I know

This topic is 5672 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites