-
Notifications
You must be signed in to change notification settings - Fork 0
/
LoadTGA.h
96 lines (74 loc) · 2.61 KB
/
LoadTGA.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
/*
* LoadTGA.h
* PIGE
*
* Created by admin on Tue Oct 30 2001.
* Copyright (c) 2001 Edenwaith. All rights reserved.
*
*/
typedef struct TGAImageRec
{
GLubyte *data; // Image data (Up to 32 bits)
GLuint bpp; // Image color depth in bits per pixel
GLuint sizeX; // Image width
GLuint sizeY; // Image height
} TGAImageRec;
TGAImageRec* LoadTGA( char *filename )
{
int i = 0;
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 header
GLuint bytesPerPixel; // Holds number of bytes per pixel used in TGA file
GLuint imageSize; // Used to store image size when setting aside room
GLuint temp; // Temporary variable
// int type = GL_RGBA; // Set default GL mode to RGBA (32 BPP)
TGAImageRec *texture; // Texture structure to return
FILE *file; // Image file to be opened
// Differences in the Mac OS X version. bytesPerPixel, imageSize, and temp
// are 'int' instead of GLUint. Also type is commented out, but it is
// never used.
file = fopen( filename, "rb" );
if( ( file == NULL ) ||
( fread( TGAcompare, 1, sizeof( TGAcompare ), file ) != sizeof( TGAcompare ) ) ||
( memcmp( TGAheader, TGAcompare, sizeof( TGAheader ) ) != 0 ) ||
( fread( header, 1, sizeof( header ), file ) != sizeof( header ) ) )
{
printf("Error: could not find or open file %s\n", filename);
fclose( file );
return NULL;
}
texture = ( TGAImageRec* )malloc( sizeof( TGAImageRec ) );
texture->sizeX = header[1] * 256 + header[0];
texture->sizeY = header[3] * 256 + header[2];
if( ( texture->sizeX <= 0 ) || ( texture->sizeY <= 0 ) || ( ( header[4] != 24 ) && ( header[4] != 32 ) ) )
{
fclose( file );
free( texture );
return NULL;
}
texture->bpp = header[4];
bytesPerPixel = texture->bpp/8;
imageSize = texture->sizeX * texture->sizeY * bytesPerPixel;
texture->data = ( GLubyte* )malloc( imageSize );
if( ( texture->data == NULL ) || ( fread( texture->data, 1, imageSize, file ) != imageSize ) )
{
if( texture->data != NULL )
{
free( texture->data );
}
fclose( file );
free( texture );
return NULL;
}
// For Linux and Windows, imageSize may need to be
// casted as an int.
for ( i = 0; i < imageSize ; i += bytesPerPixel )
{
temp = texture->data[i];
texture->data[i] = texture->data[i + 2];
texture->data[i + 2] = temp;
}
fclose( file );
return texture;
}