aboutsummaryrefslogtreecommitdiff
path: root/Source/TGALoader.cpp
diff options
context:
space:
mode:
authoricculus <icculus@5198baeb-e213-0410-be47-fc2ff85ca46f>2003-01-02 21:06:00 +0000
committericculus <icculus@5198baeb-e213-0410-be47-fc2ff85ca46f>2003-01-02 21:06:00 +0000
commite17acec1c9bec3a26d97ca2873bb77bdcb48665e (patch)
tree26b14b6cedcb70df651c23dddbf0981970d0bd4d /Source/TGALoader.cpp
parent59ca62d601e30b5467f8ecd2cb7d517bc682fc12 (diff)
downloadblackshades-e17acec1c9bec3a26d97ca2873bb77bdcb48665e.tar.gz
Initial revision
git-svn-id: svn://svn.icculus.org/blackshades/trunk@2 5198baeb-e213-0410-be47-fc2ff85ca46f
Diffstat (limited to 'Source/TGALoader.cpp')
-rw-r--r--Source/TGALoader.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/Source/TGALoader.cpp b/Source/TGALoader.cpp
new file mode 100644
index 0000000..b3ec161
--- /dev/null
+++ b/Source/TGALoader.cpp
@@ -0,0 +1,83 @@
+/**> HEADER FILES <**/
+#include "TGALoader.h"
+
+
+/********************> LoadTGA() <*****/
+TGAImageRec* LoadTGA( char *filename )
+{
+ 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)
+ TGAImageRec *texture;
+ FILE *file;
+
+ // Open The TGA File
+ file = fopen( filename, "rb" );
+
+ if( ( file == NULL ) || // Does File Even Exist?
+ ( fread( TGAcompare, 1, sizeof( TGAcompare ), file ) != sizeof( 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 anything failed then close the file and return false
+ fclose( file );
+ return NULL;
+ }
+
+ // Create a new RGBAImageRec
+ texture = ( TGAImageRec* )malloc( sizeof( TGAImageRec ) );
+
+ // Determine the TGA width (highbyte*256+lowbyte) and height (highbyte*256+lowbyte)
+ texture->sizeX = header[1] * 256 + header[0];
+ texture->sizeY = header[3] * 256 + header[2];
+
+ // Make sure the height, width, and bit depth are valid
+ if( ( texture->sizeX <= 0 ) || ( texture->sizeY <= 0 ) || ( ( header[4] != 24 ) && ( header[4] != 32 ) ) )
+ {
+ // If anything failed then close the file, free up memory for the image, and return NULL
+ fclose( file );
+ free( texture );
+ return NULL;
+ }
+
+ // Grab The TGA's Bits Per Pixel (24 or 32)
+ texture->bpp = header[4];
+ bytesPerPixel = texture->bpp/8; // Divide By 8 To Get The Bytes Per Pixel
+
+ // Calculate The Memory Required For The TGA Data
+ imageSize = texture->sizeX * texture->sizeY * bytesPerPixel;
+
+ // Reserve Memory To Hold The TGA Data
+ texture->data = ( GLubyte* )malloc( imageSize );
+
+ // Make sure the right amount of memory was allocated
+ if( ( texture->data == NULL ) || ( fread( texture->data, 1, imageSize, file ) != imageSize ) )
+ {
+ // Free up the image data if there was any
+ if( texture->data != NULL )
+ free( texture->data );
+
+ // If anything failed then close the file, free up memory for the image, and return NULL
+ fclose( file );
+ free( texture );
+ return NULL;
+ }
+
+ // Loop Through The Image Data
+ for( GLuint i = 0; i < int( imageSize ); i += bytesPerPixel )
+ {
+ // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
+ temp = texture->data[i]; // Temporarily Store The Value At Image Data 'i'
+ texture->data[i] = texture->data[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte
+ texture->data[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
+ }
+
+ // Close The File
+ fclose( file );
+
+ return texture;
+}