2 Copyright (C) 2003, 2010 - Wolfire Games
4 This file is part of Lugaru.
6 Lugaru is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 See the GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
22 /**> HEADER FILES <**/
24 #include "TGALoader.h"
26 extern float texdetail;
27 extern TGAImageRec texture;
30 extern bool visibleloading;
32 extern int loadscreencolor;
34 extern bool LoadImage(const char * fname, TGAImageRec & tex);
35 /********************> LoadTGA() <*****/
36 bool upload_image(const unsigned char* filePath, bool hasalpha)
40 pgame->LoadingScreen();
45 // for Windows, just use TGA loader for now
47 CopyPascalStringToC( filePath, fileName);
49 // change extension to .TGA
50 int len = strlen( fileName);
53 fileName[ len - 3] = 't';
54 fileName[ len - 2] = 'g';
55 fileName[ len - 1] = 'a';
58 // return (LoadTGA( fileName) != NULL);
59 return (LoadImage(fileName, texture));
68 err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
72 err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
78 //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
79 err = FSMakeFSSpec (0, 0, filePath, &fsspec);
80 //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
83 GraphicsImportComponent gi;
84 err = GetGraphicsImporterForFile(&fsspec, &gi);
88 cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
90 size_t buffersize = 4 * natbounds.bottom * natbounds.right;
91 //void* buf = malloc(buffersize);
92 texture.sizeX=natbounds.right;
93 texture.sizeY=natbounds.bottom;
94 /*if(hasalpha)*/texture.bpp = 32;
95 //if(!hasalpha)texture.bpp = 24;
98 err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
99 0, texture.data, 4 * natbounds.right);
102 cr = GraphicsImportSetGWorld(gi, gw, NULL);
104 natbounds.top = natbounds.bottom;
105 natbounds.bottom = 0;
107 cr = GraphicsImportSetBoundsRect(gi, &natbounds);
109 cr = GraphicsImportDraw(gi);
111 err = CloseComponent(gi);
114 /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
115 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
121 // Loop Through The Image Data
122 GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
123 GLuint temp; // Temporary Variable
124 GLuint bytesPerPixel; // Temporary Variable
125 bytesPerPixel=texture.bpp/8;
126 imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
129 for( GLuint i = 0; i < int( imageSize ); i += 4 )
131 // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
132 temp = texture.data[i]; // Temporarily Store The Value At Image Data 'i'
133 texture.data[i] = texture.data[i + 1]; // Set The 1st Byte To The Value Of The 3rd Byte
134 texture.data[i + 1] = texture.data[i + 2]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
135 texture.data[i + 2] = texture.data[i + 3];
136 texture.data[i + 3] = temp;
142 for( GLuint i = 0; i < int( imageSize ); i += 4 )
144 texture.data[i + 3] = 255;
145 /*texture.data[tempplace] = texture.data[i]; // Set The 1st Byte To The Value Of The 3rd Byte
146 texture.data[tempplace + 1] = texture.data[i + 1]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
147 texture.data[tempplace + 2] = texture.data[i + 2];
156 for( GLuint k = 0; k < int( imageSize); k += bytesPerPixel*texture.sizeX*texdetail )
158 for( GLuint i = 0; i < int( imageSize/texture.sizeY ); i += bytesPerPixel*texdetail )
160 for( GLuint b = 0; b < bytesPerPixel ; b ++ ){
163 for( GLuint l = 0; l < texdetail*texture.sizeX ; l +=texture.sizeX ){
164 for( GLuint j = 0; j < texdetail ; j ++ )
166 temp += (int)texture.data[k+i+j*bytesPerPixel+l*bytesPerPixel+b]; // Set The 1st Byte To The Value Of The 3rd Byte
170 texture.data[which+b]=GLubyte(temp/howmany);
172 which+=bytesPerPixel;
175 texture.sizeX/=texdetail;
176 texture.sizeY/=texdetail;
185 TGAImageRec* LoadTGA( char *filename )
187 GLubyte TGAheader[12]={0,0,2,0,0,0,0,0,0,0,0,0}; // Uncompressed TGA Header
188 GLubyte TGAcompare[12]; // Used To Compare TGA Header
189 GLubyte header[6]; // First 6 Useful Bytes From The Header
190 GLuint bytesPerPixel; // Holds Number Of Bytes Per Pixel Used In The TGA File
191 GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
192 GLuint temp; // Temporary Variable
193 GLuint type = GL_RGBA; // Set The Default GL Mode To RBGA (32 BPP)
194 //TGAImageRec *texture;
198 file = fopen( filename, "rb" );
200 if( ( file == NULL ) || // Does File Even Exist?
201 ( fread( TGAcompare, 1, sizeof( TGAcompare ), file ) != sizeof( TGAcompare ) ) || // Are There 12 Bytes To Read?
202 ( memcmp( TGAheader, TGAcompare, sizeof( TGAheader ) ) != 0 ) || // Does The Header Match What We Want?
203 ( fread( header, 1, sizeof( header ), file ) != sizeof( header ) ) )// If So Read Next 6 Header Bytes
205 // If anything failed then close the file and return false
206 if (file) fclose( file );
210 // Create a new RGBAImageRec
211 //texture = ( TGAImageRec* )malloc( sizeof( TGAImageRec ) );
213 // Determine the TGA width (highbyte*256+lowbyte) and height (highbyte*256+lowbyte)
214 texture.sizeX = (header[1] * 256 + header[0]);
215 texture.sizeY = (header[3] * 256 + header[2]);
217 // Make sure the height, width, and bit depth are valid
218 if( ( texture.sizeX <= 0 ) || ( texture.sizeY <= 0 ) || ( ( header[4] != 24 ) && ( header[4] != 32 ) ) )
220 // If anything failed then close the file, free up memory for the image, and return NULL
226 // Grab The TGA's Bits Per Pixel (24 or 32)
227 texture.bpp = header[4];
228 bytesPerPixel = texture.bpp/8; // Divide By 8 To Get The Bytes Per Pixel
230 // Calculate The Memory Required For The TGA Data
231 imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
233 // Reserve Memory To Hold The TGA Data
234 //texture.data = ( GLubyte* )malloc( imageSize );
236 // Make sure the right amount of memory was allocated
237 if( ( texture.data == NULL ) || ( fread( texture.data, 1, imageSize, file ) != imageSize ) )
239 // Free up the image data if there was any
240 // if( texture.data != NULL )
241 // free( texture.data );
243 // If anything failed then close the file, free up memory for the image, and return NULL
249 // Loop Through The Image Data
250 for( GLuint i = 0; i < int( imageSize ); i += bytesPerPixel )
252 // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
253 temp = texture.data[i]; // Temporarily Store The Value At Image Data 'i'
254 texture.data[i] = texture.data[i + 2]; // Set The 1st Byte To The Value Of The 3rd Byte
255 texture.data[i + 2] = temp; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
262 for( GLuint k = 0; k < int( imageSize); k += bytesPerPixel*texture.sizeX*texdetail )
264 for( GLuint i = 0; i < int( imageSize/texture.sizeY ); i += bytesPerPixel*texdetail )
266 for( GLuint b = 0; b < bytesPerPixel ; b ++ ){
269 for( GLuint l = 0; l < texdetail*texture.sizeX ; l +=texture.sizeX ){
270 for( GLuint j = 0; j < texdetail ; j ++ )
272 temp += (int)texture.data[k+i+j*bytesPerPixel+l*bytesPerPixel+b]; // Set The 1st Byte To The Value Of The 3rd Byte
276 texture.data[which+b]=GLubyte(temp/howmany);
278 which+=bytesPerPixel;
281 texture.sizeX/=texdetail;
282 texture.sizeY/=texdetail;