Skip to main content
gamedev.net
🔒 Locked

Loading A Bitmap

Started by VC6-OGL Dec 10, 2002 at 1:45 PM 0 replies 600+ views
Original Post
VC6-OGL
VC6-OGL
Is there a tutorial or a simple way to load a bitmap from file and stretch it to fit the window size. - VC6-OGL
Raduprv
Raduprv
Ok, here we go again
Use this code. (if you use it in some demo, it would be nice to give em some credit, BTW)


//load a bmp texture, with the specified global alpha
GLuint load_bmp8_fixed_alpha(char * FileName, Uint8 a)
{
int i,x,y,x_padding,x_size,y_size,colors_no,r,g,b,current_pallete_entry;
Uint8 * file_mem;
Uint8 * file_mem_start;
Uint8 * texture_mem;
Uint8 * read_buffer;
Uint8 * color_pallete;
FILE *f = NULL;
int file_lenght;
GLuint texture;

f = fopen (FileName, "rb");
if (!f) return;
file_mem = (Uint8 *) calloc ( 20000, sizeof(Uint8));
file_mem_start=file_mem;
fread (file_mem, 1, 50, f);//header only
//now, check to see if our bmp file is indeed a bmp file, and if it is 8 bits, uncompressed
if(*((short *) file_mem)!=19778)//BM (the identifier)
{
free(file_mem_start);
fclose (f);
return -1;
}
file_mem+=18;
x_size=*((int *) file_mem);
file_mem+=4;
y_size=*((int *) file_mem);
file_mem+=6;
if(*((short *)file_mem)!=8)//8 bit/pixel?
{
free(file_mem_start);
fclose (f);
return -1;
}

file_mem+=2;
if(*((int *)file_mem)!=0)//any compression?
{
free(file_mem_start);
fclose (f);
return -1;
}
file_mem+=16;

colors_no=*((int *)file_mem);
if(!colors_no)colors_no=256;
file_mem+=8;//here comes the pallete

color_pallete=file_mem+4;
fread (file_mem, 1, colors_no*4+4, f);//header only
file_mem+=colors_no*4;

x_padding=x_size%4;
if(x_padding)x_padding=4-x_padding;

//now, allocate the memory for the file
texture_mem = (Uint8 *) calloc ( x_size*y_size*4, sizeof(Uint8));
read_buffer = (Uint8 *) calloc ( 2000, sizeof(Uint8));


for(y=0;y {
//fread (texture_mem+y*x_size, 1, x_size-x_padding, f);
fread (read_buffer, 1, x_size-x_padding, f);

for(x=0;x {
current_pallete_entry=*(read_buffer+x);
b=*(color_pallete+current_pallete_entry*4);
g=*(color_pallete+current_pallete_entry*4+1);
r=*(color_pallete+current_pallete_entry*4+2);
*(texture_mem+(y*x_size+x)*4)=r;
*(texture_mem+(y*x_size+x)*4+1)=g;
*(texture_mem+(y*x_size+x)*4+2)=b;
*(texture_mem+(y*x_size+x)*4+3)=a;
}

}

free(file_mem_start);
free(read_buffer);
fclose (f);
//ok, now, hopefully, the file is loaded and converted...
//so, assign the texture, and such

glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D,
0,
GL_RGBA,
x_size, y_size,
0,
GL_RGBA,
GL_UNSIGNED_BYTE,
texture_mem);

free(texture_mem);
return texture;
}



As for screttching it to the window size, go into the 2D mode, and do something like this:


void Enter2DMode()
{
glPushAttrib(GL_LIGHTING_BIT|GL_DEPTH_BUFFER_BIT);
glDisable(GL_LIGHTING);
glDisable(GL_DEPTH_TEST);

//glEnable(GL_BLEND);
//glBlendFunc(GL_DST_ALPHA,GL_SRC_ALPHA);

glViewport(0, 0, window_width, window_height);
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glOrtho(0.0, (GLdouble)window_width, (GLdouble)window_height, 0.0, 0.0, 1.0);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
}

void Leave2DMode()
{
//glDisable(GL_BLEND);
glMatrixMode(GL_MODELVIEW);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopAttrib();
}

void draw_console_pic(int which_texture)
{
glBindTexture(GL_TEXTURE_2D, texture_id);
//texture_id is obtained by a call to GLuint load_bmp8_fixed_alpha(char * FileName, Uint8 a)
glColor3f(1.0f,1.0f,1.0f);
glBegin(GL_QUADS);
//draw the texture

glTexCoord2f(0.0f,1.0f);
glVertex3i(0,0,0);

glTexCoord2f(0.0f,0.0f);
glVertex3i(0,window_height,0);

glTexCoord2f(1.0f,0.0f);
glVertex3i(window_width,window_height,0);

glTexCoord2f(1.0f,1.0f);
glVertex3i(window_width,0,0);

glEnd();

}



Height Map Editor

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.