PDA

View Full Version : TGA sizing?



Jmoses
03-26-2002, 11:30 AM
I forgot where, but I downloaded the source to a .TGA file reader, but the size must be the same x as y (like 256x256 or 32x32). I'd like to be able to load tga files where the xsize isn't the same as the ysize (like 128x256).

heres the code to the tga loader, thanks.


typedef struct // Create A Structure
{
GLubyte *imageData; // Image Data (Up To 32 Bits)
GLuint bpp; // Image Color Depth In Bits Per Pixel.
GLuint width; // Image Width
GLuint height; // Image Height
GLuint ID; // Texture ID Used To Select A Texture
} TGAfile; // Structure Name



bool LoadTGA(TGAfile *tga, char *filename) // Loads A TGA File Into Memory
{
GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
GLubyte TGAcompare[12]; // Used To Compare TGA Header
GLubyte header[6]; // First 6 Useful Bytes From The Header
GLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA File
GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
GLuint temp; // Temporary Variable
GLuint type=GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP)

FILE *file = fopen(filename, "rb"); // Open The TGA File

if( file==NULL | | // Does File Even Exist?
fread(TGAcompare,1,sizeof(TGAcompare),file)!=sizeo f(TGAcompare) | | // Are There 12 Bytes To Read?
memcmp(TGAheader,TGAcompare,sizeof(TGAheader))!=0 | | // Does The Header Match What We Want?
fread(header,1,sizeof(header),file)!=sizeof(header )) // If So Read Next 6 Header Bytes
{
if (file == NULL) // Did The File Even Exist? *Added Jim*
return false; // Return False (Don't Use fclose; Crashes) *Added Jim*
else
{
fclose(file); // If Anything Failed, Close The File
return false; // Return False
}
}

tga->width = header[1] * 256 + header[0]; // Determine The TGA Width (highbyte*256+lowbyte)
tga->height = header[3] * 256 + header[2]; // Determine The TGA Height (highbyte*256+lowbyte)

if( tga->width <=0 &#0124; &#0124; // Is The Width Less Than Or Equal To Zero
tga->height <=0 &#0124; &#0124; // Is The Height Less Than Or Equal To Zero
(header[4]!=24 && header[4]!=32)) // Is The TGA 24 or 32 Bit?
{
fclose(file); // If Anything Failed, Close The File
return false; // Return False
}

tga->bpp = header[4]; // Grab The TGA's Bits Per Pixel (24 or 32)
bytesPerPixel = tga->bpp/8; // Divide By 8 To Get The Bytes Per Pixel
imageSize = tga->width*tga->height*bytesPerPixel; // Calculate The Memory Required For The TGA Data

tga->imageData=(GLubyte *)malloc(imageSize); // Reserve Memory To Hold The TGA Data

if( tga->imageData==NULL &#0124; &#0124; // Does The Storage Memory Exist?
fread(tga->imageData, 1, imageSize, file)!=imageSize) // Does The Image Size Match The Memory Reserved?
{
if(tga->imageData!=NULL) // Was Image Data Loaded
free(tga->imageData); // If So, Release The Image Data

fclose(file); // Close The File
return false; // Return False
}

for(GLuint i=0; i<int(imageSize); i+=bytesPerPixel) // Loop Through The Image Data
{ // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
temp=tga->imageData[i]; // Temporarily Store The Value At Image Data 'i'
tga->imageData[i] = tga->imageData[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte
tga->imageData[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
}

fclose (file); // Close The File

// Build A Texture From The Data
glGenTextures(1, &tga[0].ID); // Generate OpenGL texture IDs

glBindTexture(GL_TEXTURE_2D, tga[0].ID); // Bind Our Texture
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Filtered
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Filtered

if (tga[0].bpp==24) // Was The TGA 24 Bits
{
type=GL_RGB; // If So Set The 'type' To GL_RGB
}

glTexImage2D(GL_TEXTURE_2D, 0, type, tga[0].width, tga[0].height, 0, type, GL_UNSIGNED_BYTE, tga[0].imageData);

return true; // Texture Building Went Ok, Return True
}

gumby
03-26-2002, 11:37 AM
I don't see any such resriction, at first glance.
The height and width are independently read
from the header, and the size is in terms of
height*width.

marcus256
03-26-2002, 10:30 PM
Check the source distribution of GLFW (http://hem.passagen.se/opengl/glfw/) . It contains a TGA file loader (tga.c in the examples dir). It does not support resizing to NxN, but it does support resizing to 2^m x 2^n in order to be OpenGL compatible. You can probably tweak it to do what you want.

Jmoses
03-27-2002, 03:00 AM
Great, thanks a lot. I can't thank you enough.