Page MenuHomeHEPForge

Texture.cpp
No OneTemporary

Texture.cpp

This document is not UTF8. It was detected as Shift JIS and converted to UTF8 for display.
#include "Texture.h"
#ifndef linux
BOOL SaveBMP(char *filename, int width, int height, unsigned char *imageData)
{
FILE *filePtr; // Pointeur de fichier
BITMAPFILEHEADER bitmapFileHeader; // En-t黎e de fichier
BITMAPINFOHEADER bitmapInfoHeader; // En-t黎e d'informations
unsigned char tempRGB; // Variable temporaire pour changer BGR -> RGB
// Ouverture du fichier en mode 馗riture binaire
fopen_s(&filePtr,filename, "wb");
if (!filePtr)
return FALSE;
// D馭inition de tous les champs des en-t黎e
// En-t黎e de fichier BITMAPFILEHEADER
bitmapFileHeader.bfSize = sizeof(BITMAPFILEHEADER);
bitmapFileHeader.bfType = 0x4D42;
bitmapFileHeader.bfReserved1 = 0;
bitmapFileHeader.bfReserved2 = 0;
bitmapFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// En-t黎e d'informations
bitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfoHeader.biPlanes = 1;
bitmapInfoHeader.biBitCount = 24;
bitmapInfoHeader.biCompression = BI_RGB;
bitmapInfoHeader.biSizeImage = width * abs(height) * 3;
bitmapInfoHeader.biXPelsPerMeter = 0;
bitmapInfoHeader.biYPelsPerMeter = 0;
bitmapInfoHeader.biClrUsed = 0;
bitmapInfoHeader.biClrImportant = 0;
bitmapInfoHeader.biWidth = width;
bitmapInfoHeader.biHeight = height;
// Inversion des composants RGB -> BGR
for (unsigned int i = 0; i < bitmapInfoHeader.biSizeImage; i += 3)
{
tempRGB = imageData[i];
imageData[i] = imageData [i + 2];
imageData[i + 2] = tempRGB;
}
// Ecriture de l'en-t黎e de fichier
fwrite(&bitmapFileHeader, 1, sizeof(BITMAPFILEHEADER), filePtr);
// Ecriture de l'en-t黎e d'informations
fwrite(&bitmapInfoHeader, 1, sizeof(BITMAPINFOHEADER), filePtr);
// Ecriture des donn馥s de l'image
fwrite(imageData, 1, bitmapInfoHeader.biSizeImage, filePtr);
fclose(filePtr); // fermeture du fichier
return TRUE;
}
void SaveBMPScreenshot(char *filename, int Width, int Height)
{
unsigned char* imageData;
imageData = (unsigned char*) malloc(Width * Height * 3); // Allocation m駑oire RGB
memset(imageData, 0, Width * Height * 3); // Efface le contenu de la m駑oire de imageData
// Lit tous les pixels de l'馗ran et place les valeurs dans imageData
glReadPixels(0, 0, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, imageData);
// Ecrit dans le fichier notre capture d'馗ran
SaveBMP(filename, Width, Height, (unsigned char *)imageData);
// Lib鑽e la m駑oire
free(imageData);
}
#endif
void LoadTexture(unsigned int* id, char* strFileName)
{
if(!strFileName) return;
char FileFormat[5];
stTexture* Texture = new stTexture;
strncpy(FileFormat, strFileName + strlen(strFileName)-4, 4);FileFormat[4]='\0';
if(!strcmp(FileFormat, ".BMP") || !strcmp(FileFormat, ".bmp"))
{
LoadBMP(Texture,strFileName);
}else{
}
if(Texture->texels == NULL){
delete Texture;
return;
}
glGenTextures (1, id);
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
glBindTexture (GL_TEXTURE_2D, *id);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, Texture->internalFormat, Texture->width, Texture->height, Texture->format, GL_UNSIGNED_BYTE, Texture->texels);
delete [] Texture->texels;
delete Texture;
}
void LoadBMP(stTexture* Texture, char* strFileName, unsigned char AlphaKey_R, unsigned char AlphaKey_G, unsigned char AlphaKey_B)
{
stTexture* Temp = new stTexture;
LoadBMP(Temp, strFileName);
Texture->width = Temp->width;
Texture->height = Temp->height;
Texture->internalFormat = 4;
Texture->format = GL_RGBA;
Texture->texels = new GLubyte[Texture->width*Texture->height*Texture->internalFormat];
for(unsigned int w=0;w<Temp->width;w++){
for(unsigned int h=0;h<Temp->height;h++){
int I1 = ((h*Temp->width) + w)*3;
int I2 = ((h*Temp->width) + w)*4;
Texture->texels[I2+0] = Temp->texels[I1+0];
Texture->texels[I2+1] = Temp->texels[I1+1];
Texture->texels[I2+2] = Temp->texels[I1+2];
Texture->texels[I2+3] = 255;
if(Temp->texels[I1+0] == AlphaKey_R &&
Temp->texels[I1+1] == AlphaKey_G &&
Temp->texels[I1+2] == AlphaKey_B){
Texture->texels[I2+3] = 0;
}
}
}
}
void LoadBMP(stTexture* Texture, char* strFileName)
{
char sign[3];
unsigned int size;
unsigned int offset;
unsigned int img_header_size;
unsigned int img_width;
unsigned int img_height;
unsigned short img_Nplans;
unsigned short img_bpp;
unsigned int img_compression;
unsigned int img_size;
unsigned int img_Xreso;
unsigned int img_Yreso;
unsigned int img_Palette_NColor;
unsigned int img_Palette_NImpor;
unsigned char* Palette;
char txt[255];
unsigned int i,j;
if(!strFileName) return;
if(!Texture) return;
if(Texture->texels!=NULL) return;
FILE* f = fopen(strFileName,"r");
if(f==NULL) return;
// FILE HEADER
fread(sign,1,2,f); sign[2] = '\0';
// MessageBox(NULL,sign,MB_OK,MB_OK);
fread(&size,1,4,f);
sprintf(txt,"%i",size);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fseek(f,4,SEEK_CUR);
fread(&offset,1,4,f);
sprintf(txt,"%i",offset);
// MessageBox(NULL,txt,MB_OK,MB_OK);
// IMAGE HEADER
fread(&img_header_size,1,4,f);
sprintf(txt,"%i",img_header_size);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_width,1,4,f);
fread(&img_height,1,4,f);
sprintf(txt,"%i-%i",img_width,img_height);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_Nplans,1,2,f);
sprintf(txt,"%i",img_Nplans);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_bpp,1,2,f);
sprintf(txt,"%i",img_bpp);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_compression,1,4,f);
sprintf(txt,"%i",img_compression);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_size,1,4,f);
sprintf(txt,"%i",img_size);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_Xreso,1,4,f);
fread(&img_Yreso,1,4,f);
sprintf(txt,"%i-%i",img_Xreso,img_Yreso);
// MessageBox(NULL,txt,MB_OK,MB_OK);
fread(&img_Palette_NColor,1,4,f);
fread(&img_Palette_NImpor,1,4,f);
sprintf(txt,"%u-%u",img_Palette_NColor,img_Palette_NImpor);
// MessageBox(NULL,txt,MB_OK,MB_OK);
if(img_Palette_NColor!=0) return;
// PALETTE
if(img_Palette_NColor!=0)
{
Palette = new unsigned char [img_Palette_NColor*3];
for(i=0;i<img_Palette_NColor;i++)
{
fread(&Palette[3*i+2],1,1,f);
fread(&Palette[3*i+1],1,1,f);
fread(&Palette[3*i+0],1,1,f);
fseek(f,1,SEEK_CUR);
}
}
// DATA
Texture->width = img_width;
Texture->height = img_height;
unsigned int NOctetsPerLine = img_width * img_bpp / 8;
unsigned int NZerosPerLine = NOctetsPerLine%4;
sprintf(txt,"%i + %i",NOctetsPerLine-NZerosPerLine,NZerosPerLine);
// MessageBox(NULL,txt,MB_OK,MB_OK);
unsigned int index;
switch(img_bpp)
{
case 24:
Texture->format = GL_RGB;
Texture->internalFormat = 3;
Texture->texels = new unsigned char [img_width*img_height*3];
for(j=0;j<img_height;j++)
{
for(i=0;i<img_width;i++)
{
index = j*img_width*3+i*3;
fread(&Texture->texels[index+2],1,1,f);
fread(&Texture->texels[index+1],1,1,f);
fread(&Texture->texels[index+0],1,1,f);
// fprintf(out,"%i-%i-%i\n",Texture->texels[index+0],Texture->texels[index+1],Texture->texels[index+2]);
}
fseek(f,NZerosPerLine*3,SEEK_CUR);
}
break;
default :
break;
}
fclose(f);
}

File Metadata

Mime Type
text/x-c
Expires
Wed, May 14, 11:38 AM (11 h, 22 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5088452
Default Alt Text
Texture.cpp (7 KB)

Event Timeline