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 modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 Lugaru 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. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with Lugaru. If not, see <http://www.gnu.org/licenses/>.
20 /**> HEADER FILES <**/
22 #include "TGALoader.h"
24 extern float texdetail;
25 extern TGAImageRec texture;
28 extern bool visibleloading;
30 extern bool LoadImage(const char * fname, TGAImageRec & tex);
31 /********************> LoadTGA() <*****/
32 bool upload_image(const unsigned char* filePath, bool hasalpha)
35 Game::LoadingScreen();
39 // for Windows, just use TGA loader for now
41 CopyPascalStringToC( filePath, fileName);
43 // change extension to .TGA
44 int len = strlen( fileName);
47 fileName[ len - 3] = 't';
48 fileName[ len - 2] = 'g';
49 fileName[ len - 1] = 'a';
52 //return (LoadTGA( fileName) != NULL);
53 return (LoadImage(fileName, texture));
62 err = FSPathMakeRef((const UInt8*)filePath, &fsref, &isdir);
66 err = FSGetCatalogInfo(&fsref, kFSCatInfoNone, NULL, NULL, &fsspec, NULL);
72 //err = FSMakeFSSpec (0, 0, (const unsigned char*)filePath, &fsspec);
73 err = FSMakeFSSpec (0, 0, filePath, &fsspec);
74 //err=FSPathMakeFSSpec((const UInt8*)filePath,&fsspec,&isdir);*/
78 GraphicsImportComponent gi;
79 err = GetGraphicsImporterForFile(&fsspec, &gi);
84 cr = GraphicsImportGetNaturalBounds(gi, &natbounds);
86 //~ size_t buffersize = 4 * natbounds.bottom * natbounds.right;
87 //void* buf = malloc(buffersize);
88 texture.sizeX = natbounds.right;
89 texture.sizeY = natbounds.bottom;
92 //if(!hasalpha)texture.bpp = 24;
95 err = QTNewGWorldFromPtr(&gw, k32ARGBPixelFormat, &natbounds, NULL, NULL,
96 0, texture.data, 4 * natbounds.right);
100 cr = GraphicsImportSetGWorld(gi, gw, NULL);
102 natbounds.top = natbounds.bottom;
103 natbounds.bottom = 0;
105 cr = GraphicsImportSetBoundsRect(gi, &natbounds);
107 cr = GraphicsImportDraw(gi);
109 err = CloseComponent(gi);
113 /*glTexImage2D(textureTarget, 0, GL_RGBA, natbounds.right, natbounds.top, 0,
114 GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, buf);
120 // Loop Through The Image Data
121 GLuint imageSize; // Used To Store The Image Size When Setting Aside Ram
122 GLuint temp; // Temporary Variable
123 GLuint bytesPerPixel; // Temporary Variable
124 bytesPerPixel = texture.bpp / 8;
125 imageSize = texture.sizeX * texture.sizeY * bytesPerPixel;
128 for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
129 // Swaps The 1st And 3rd Bytes ('R'ed and 'B'lue)
130 temp = texture.data[i]; // Temporarily Store The Value At Image Data 'i'
131 texture.data[i] = texture.data[i + 1]; // Set The 1st Byte To The Value Of The 3rd Byte
132 texture.data[i + 1] = texture.data[i + 2]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
133 texture.data[i + 2] = texture.data[i + 3];
134 texture.data[i + 3] = temp;
140 for ( GLuint i = 0; i < int( imageSize ); i += 4 ) {
141 texture.data[i + 3] = 255;
142 /*texture.data[tempplace] = texture.data[i]; // Set The 1st Byte To The Value Of The 3rd Byte
143 texture.data[tempplace + 1] = texture.data[i + 1]; // Set The 3rd Byte To The Value In 'temp' (1st Byte Value)
144 texture.data[tempplace + 2] = texture.data[i + 2];
153 for ( GLuint k = 0; k < int( imageSize); k += bytesPerPixel * texture.sizeX * texdetail ) {
154 for ( GLuint i = 0; i < int( imageSize / texture.sizeY ); i += bytesPerPixel * texdetail ) {
155 for ( GLuint b = 0; b < bytesPerPixel ; b ++ ) {
158 for ( GLuint l = 0; l < texdetail * texture.sizeX ; l += texture.sizeX ) {
159 for ( GLuint j = 0; j < texdetail ; j ++ ) {
160 temp += (int)texture.data[k + i + j * bytesPerPixel + l * bytesPerPixel + b]; // Set The 1st Byte To The Value Of The 3rd Byte
164 texture.data[which + b] = GLubyte(temp / howmany);
166 which += bytesPerPixel;
169 texture.sizeX /= texdetail;
170 texture.sizeY /= texdetail;