00001 #include "flGlobal.h"
00002 #if FL_TEXTURE_TGA != 0
00003 #include <stdlib.h>
00004 #include <string.h>
00005 #include <pspgu.h>
00006
00007 #if FL_INCLUDE_ALL_C == 0
00008 #include "flTextureTGA.h"
00009 #include "flMemory.h"
00010 #include "flFile.h"
00011
00012 #if FL_DEBUG != 0
00013 #include "flDebug.h"
00014 #endif
00015
00016 #endif
00017
00018 typedef struct {
00019 u8 tgaIdentSize;
00020 u8 tgaPaletteType;
00021 u8 tgaImageType;
00022 u16 tgaPaletteStart;
00023 u16 tgaPaletteLen;
00024 u8 tgaPaletteBPP;
00025 s16 tgaXStart;
00026 s16 tgaYStart;
00027 u16 tgaWidth;
00028 u16 tgaHeight;
00029 u8 tgaBPP;
00030 u8 tgaDescriptor;
00031 } tgaFileHeader;
00032
00033 Texture* texLoadTGA(char* inPath) {
00034 #if FL_FILE != 0
00035 File* tempFile = fileOpen(inPath, FILE_MODE_READ | FILE_MODE_BINARY);
00036 #else
00037 FILE* tempFile = fopen(inPath, "rb");
00038 #endif
00039 if(!tempFile) {
00040 #if FL_DEBUG_ERROR != 0
00041 debugError("TGA load error.\nFile(%s) cannot be opened", inPath);
00042 #endif
00043 return NULL;
00044 }
00045 tgaFileHeader tempHeader;
00046
00047 fileRead(&tempHeader.tgaIdentSize, 1, tempFile);
00048 fileRead(&tempHeader.tgaPaletteType, 1, tempFile);
00049 fileRead(&tempHeader.tgaImageType, 1, tempFile);
00050 fileRead(&tempHeader.tgaPaletteStart, 2, tempFile);
00051 fileRead(&tempHeader.tgaPaletteLen, 2, tempFile);
00052 fileRead(&tempHeader.tgaPaletteBPP, 1, tempFile);
00053 fileRead(&tempHeader.tgaXStart, 2, tempFile);
00054 fileRead(&tempHeader.tgaYStart, 2, tempFile);
00055 fileRead(&tempHeader.tgaWidth, 2, tempFile);
00056 fileRead(&tempHeader.tgaHeight, 2, tempFile);
00057 fileRead(&tempHeader.tgaBPP, 1, tempFile);
00058 fileRead(&tempHeader.tgaDescriptor, 1, tempFile);
00059
00060 if(tempHeader.tgaIdentSize)
00061 fileSeek(tempFile, tempHeader.tgaIdentSize, FILE_SEEK_CUR);
00062
00063 if(tempHeader.tgaImageType == 0) {
00064 #if FL_DEBUG_ERROR != 0
00065 debugError("No image data included within tga(%s).", inPath);
00066 #endif
00067 fileClose(tempFile);
00068 return NULL;
00069 }
00070
00071 if(tempHeader.tgaPaletteType & 0xFE) {
00072 #if FL_DEBUG_ERROR != 0
00073 debugError("Palette format (%i) unsupported in tga file (%s).", tempHeader.tgaPaletteType, inPath);
00074 #endif
00075 fileClose(tempFile);
00076 return NULL;
00077 }
00078
00079 u8 tempBPP = (tempHeader.tgaPaletteType ? tempHeader.tgaPaletteBPP : tempHeader.tgaBPP);
00080 if((tempBPP != 15) && (tempBPP != 16) && (tempBPP != 32) && (tempBPP != 24) && (tempBPP != 8)) {
00081 #if FL_DEBUG_ERROR != 0
00082 debugError("BPP(%i) value unsupported in tga file (%s).", tempBPP, inPath);
00083 #endif
00084 fileClose(tempFile);
00085 return NULL;
00086 }
00087 if(tempHeader.tgaPaletteType && (tempHeader.tgaBPP != 1) && (tempHeader.tgaBPP != 2) && (tempHeader.tgaBPP != 4) && (tempHeader.tgaBPP != 8)) {
00088 #if FL_DEBUG_ERROR != 0
00089 debugError("BPP(%i) value unsupported for palettes in tga file (%s).", tempBPP, inPath);
00090 #endif
00091 fileClose(tempFile);
00092 return NULL;
00093 }
00094 if((tempBPP == 8) && (tempHeader.tgaPaletteType || ((tempHeader.tgaImageType & 3) != 3))) {
00095 #if FL_DEBUG_ERROR != 0
00096 debugError("Error in tga file (%s), %i bits per pixel in color/shade data is only supported for grayscale images.", inPath, tempBPP);
00097 #endif
00098 fileClose(tempFile);
00099 return NULL;
00100 }
00101 if(((tempHeader.tgaImageType & 3) == 3) && (tempBPP != 8)) {
00102 #if FL_DEBUG_ERROR != 0
00103 debugError("Error in tga file (%s), only 8 bits per pixel is only supported for grayscale images, not %i.", inPath, tempBPP);
00104 #endif
00105 fileClose(tempFile);
00106 return NULL;
00107 }
00108
00109 u8 tempByPP = ((tempHeader.tgaBPP + 1) >> 3);
00110
00111 u8 tempPixelFormat = 0;
00112 u8 tempPaletteFormat = 0;
00113 if(tempHeader.tgaPaletteType) {
00114 if((tempHeader.tgaBPP <= 4) && (tempHeader.tgaBPP != 3)) {
00115 tempPixelFormat = GU_PSM_T4;
00116 } else if(tempHeader.tgaBPP == 8) {
00117 tempPixelFormat = GU_PSM_T8;
00118 }
00119 if(tempHeader.tgaPaletteBPP > 16) {
00120 tempPaletteFormat = GU_PSM_8888;
00121 } else if(tempHeader.tgaPaletteBPP == 16) {
00122 if((tempHeader.tgaDescriptor & 0x0F) == 0)
00123 tempPaletteFormat = GU_PSM_5650;
00124 else if((tempHeader.tgaDescriptor & 0x0F) == 1)
00125 tempPaletteFormat = GU_PSM_5551;
00126 else if((tempHeader.tgaDescriptor & 0x0F) == 4)
00127 tempPaletteFormat = GU_PSM_4444;
00128 } else {
00129 tempPaletteFormat = GU_PSM_5551;
00130 }
00131 } else {
00132 if(tempHeader.tgaBPP > 16) {
00133 tempPixelFormat = GU_PSM_8888;
00134 } else if(tempHeader.tgaBPP == 16) {
00135 if((tempHeader.tgaDescriptor & 0x0F) == 0)
00136 tempPixelFormat = GU_PSM_5650;
00137 else if((tempHeader.tgaDescriptor & 0x0F) == 1)
00138 tempPixelFormat = GU_PSM_5551;
00139 else if((tempHeader.tgaDescriptor & 0x0F) == 4)
00140 tempPixelFormat = GU_PSM_4444;
00141 } else {
00142 tempPixelFormat = GU_PSM_5551;
00143 }
00144 }
00145
00146 u32 i, j;
00147 Palette* tempPalette = NULL;
00148 #if FL_TEXTURE_PRESERVENONALPHA != 0
00149 bool tempAlpha = (tempHeader.tgaDescriptor & 0x0F);
00150 #endif
00151 if(tempHeader.tgaPaletteType) {
00152 tempPalette = palCreate(tempHeader.tgaPaletteLen, tempPaletteFormat, false);
00153 switch(tempHeader.tgaPaletteBPP) {
00154 case 32:
00155 for(i = 0; i < tempHeader.tgaPaletteLen; i++) {
00156 fileRead(&tempPalette->palData[(i << 2) + 2], 1, tempFile);
00157 fileRead(&tempPalette->palData[(i << 2) + 1], 1, tempFile);
00158 fileRead(&tempPalette->palData[(i << 2) + 0], 1, tempFile);
00159 fileRead(&tempPalette->palData[(i << 2) + 3], 1, tempFile);
00160 }
00161 break;
00162 case 24:
00163 #if FL_TEXTURE_PRESERVENONALPHA != 0
00164 tempAlpha = false;
00165 #endif
00166 for(i = 0; i < tempHeader.tgaPaletteLen; i++) {
00167 fileRead(&tempPalette->palData[(i << 2) + 2], 1, tempFile);
00168 fileRead(&tempPalette->palData[(i << 2) + 1], 1, tempFile);
00169 fileRead(&tempPalette->palData[(i << 2) + 0], 1, tempFile);
00170 tempPalette->palData[(i << 2) + 3] = 0xFF;
00171 }
00172 break;
00173 }
00174 } else if((tempHeader.tgaImageType & 3) == 3) {
00175 tempPalette = palGrayscaleT8();
00176 tempPixelFormat = GU_PSM_T8;
00177 tempPaletteFormat = tempPalette->palPixelFormat;
00178 #if FL_TEXTURE_PRESERVENONALPHA != 0
00179 tempAlpha = false;
00180 #endif
00181 }
00182
00183 u32 tempDataSize = ((tempHeader.tgaWidth * tempHeader.tgaHeight * ((tempHeader.tgaBPP + 1) & ~7)) >> 3);
00184 u8* tempData = (u8*)memQalloc(tempDataSize);
00185 if(!tempData) {
00186 #if FL_DEBUG_ERROR != 0
00187 debugError("Couldn't create temporary data, while loading \"%s\".\nOut of memory.", inPath);
00188 #endif
00189 palFree(tempPalette);
00190 fileClose(tempFile);
00191 return NULL;
00192 }
00193
00194 u8 tempChar;
00195 u32 tempPtr = 0;
00196 u32 tempPixel;
00197 if(tempHeader.tgaImageType & 8) {
00198 while(tempPtr < (tempHeader.tgaWidth * tempHeader.tgaHeight)) {
00199 fileRead(&tempChar, 1, tempFile);
00200 if(tempChar & 0x80) {
00201 fileRead(&tempPixel, tempByPP, tempFile);
00202 for(i = 0; i <= (tempChar & 0x7F); i++)
00203 memCopy(&tempData[(tempPtr + i) * tempByPP], &tempPixel, tempByPP);
00204 } else {
00205 for(i = 0; i <= (tempChar & 0x7F); i++)
00206 fileRead(&tempData[(tempPtr + i) * tempByPP], tempByPP, tempFile);
00207 }
00208 tempPtr += ((tempChar & 0x7F) + 1);
00209 }
00210 } else {
00211 fileRead(tempData, tempDataSize, tempFile);
00212 }
00213 fileClose(tempFile);
00214
00215 u32 tempDataLineSize = ((tempHeader.tgaWidth * ((tempHeader.tgaBPP + 1) & ~7)) >> 3);
00216 if(!(tempHeader.tgaDescriptor & 0x20)) {
00217 u8* tempDataLine = (u8*)memQalloc(tempDataLineSize);
00218 if(!tempDataLine) {
00219 #if FL_DEBUG_ERROR != 0
00220 debugError("Couldn't create temporary data cache, while loading \"%s\".\nOut of memory.", inPath);
00221 #endif
00222 palFree(tempPalette);
00223 memFree(tempData);
00224 return NULL;
00225 }
00226 for(i = 0; i < (tempHeader.tgaHeight >> 1); i++) {
00227 memCopy(tempDataLine, &tempData[i * tempDataLineSize], tempDataLineSize);
00228 memCopy(&tempData[i * tempDataLineSize], &tempData[((tempHeader.tgaHeight - 1) - i) * tempDataLineSize], tempDataLineSize);
00229 memCopy(&tempData[((tempHeader.tgaHeight - 1) - i) * tempDataLineSize], tempDataLine, tempDataLineSize);
00230 }
00231 memFree(tempDataLine);
00232 }
00233 if(tempHeader.tgaDescriptor & 0x10) {
00234 for(j = 0; j < tempHeader.tgaHeight; j++) {
00235 for(i = 0; i < (tempHeader.tgaWidth >> 1); i++) {
00236 memCopy(&tempPixel, &tempData[(j * tempDataLineSize) + (i * tempByPP)], tempByPP);
00237 memCopy(&tempData[(j * tempDataLineSize) + (i * tempByPP)], &tempData[(j * tempDataLineSize) + (((tempHeader.tgaWidth - 1) - i) * tempByPP)], tempByPP);
00238 memCopy(&tempData[(j * tempDataLineSize) + (((tempHeader.tgaWidth - 1) - i) * tempByPP)], &tempPixel, tempByPP);
00239 }
00240 }
00241 }
00242
00243 Texture* tempOut = texCreate(tempHeader.tgaWidth, tempHeader.tgaHeight, tempPixelFormat);
00244 if(!tempOut) {
00245 #if FL_DEBUG_ERROR != 0
00246 debugError("Couldn't create texture struct, while loading \"%s\".\nProbably out of memory.", inPath);
00247 #endif
00248 palFree(tempPalette);
00249 memFree(tempData);
00250 return NULL;
00251 }
00252 #if FL_TEXTURE_PRESERVENONALPHA != 0
00253 tempOut->texAlpha = tempAlpha;
00254 #endif
00255
00256 if(tempHeader.tgaPaletteType) {
00257 tempOut->texPalette = tempPalette;
00258 if(tempHeader.tgaBPP == 8) {
00259 for(j = 0; j < tempHeader.tgaHeight; j++) {
00260 for(i = 0; i < tempHeader.tgaWidth; i++) {
00261 tempOut->texData[((j * tempOut->texDataWidth) + i)] = tempData[(j * tempDataLineSize) + i];
00262 }
00263 }
00264 } else if(tempHeader.tgaBPP == 4) {
00265 for(j = 0; j < tempHeader.tgaHeight; j++) {
00266 for(i = 0; i < ((tempHeader.tgaWidth + 1) >> 1); i++) {
00267 tempOut->texData[((j * tempOut->texDataWidth) + i)] = tempData[(j * tempDataLineSize) + i];
00268 }
00269 }
00270 }
00271 } else {
00272 if((tempHeader.tgaImageType & 3) == 3) {
00273 if(tempHeader.tgaBPP == 8) {
00274 for(j = 0; j < tempHeader.tgaHeight; j++) {
00275 for(i = 0; i < tempHeader.tgaWidth; i++) {
00276 tempOut->texData[((j * tempOut->texDataWidth) + i)] = tempData[(j * tempDataLineSize) + i];
00277 }
00278 }
00279 }
00280 } else {
00281 if((tempHeader.tgaBPP == 24) && ((tempHeader.tgaDescriptor & 0x0F) == 0)) {
00282 #if FL_TEXTURE_PRESERVENONALPHA != 0
00283 tempOut->texAlpha = false;
00284 #endif
00285 for(j = 0; j < tempHeader.tgaHeight; j++) {
00286 for(i = 0; i < tempHeader.tgaWidth; i++) {
00287 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 0] = tempData[(j * tempDataLineSize) + (i * 3) + 2];
00288 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 1] = tempData[(j * tempDataLineSize) + (i * 3) + 1];
00289 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 2] = tempData[(j * tempDataLineSize) + (i * 3) + 0];
00290 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 3] = 0xFF;
00291 }
00292 }
00293 } else if((tempHeader.tgaBPP == 32) && ((tempHeader.tgaDescriptor & 0x0F) == 8)) {
00294 for(j = 0; j < tempHeader.tgaHeight; j++) {
00295 for(i = 0; i < tempHeader.tgaWidth; i++) {
00296 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 0] = tempData[(j * tempDataLineSize) + (i << 2) + 2];
00297 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 1] = tempData[(j * tempDataLineSize) + (i << 2) + 1];
00298 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 2] = tempData[(j * tempDataLineSize) + (i << 2) + 0];
00299 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 2) + 3] = tempData[(j * tempDataLineSize) + (i << 2) + 3];
00300 }
00301 }
00302 } else if((tempHeader.tgaBPP == 15) || ((tempHeader.tgaBPP == 16) && ((tempHeader.tgaDescriptor & 0x0F) == 1))) {
00303 for(j = 0; j < tempHeader.tgaHeight; j++) {
00304 for(i = 0; i < tempHeader.tgaWidth; i++) {
00305 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 0] = tempData[(j * tempDataLineSize) + (i << 1) + 1];
00306 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 1] = tempData[(j * tempDataLineSize) + (i << 1)];
00307 }
00308 }
00309 } else if((tempHeader.tgaBPP == 16) && ((tempHeader.tgaDescriptor & 0x0F) == 0)) {
00310 #if FL_TEXTURE_PRESERVENONALPHA != 0
00311 tempOut->texAlpha = false;
00312 #endif
00313 for(j = 0; j < tempHeader.tgaHeight; j++) {
00314 for(i = 0; i < tempHeader.tgaWidth; i++) {
00315 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 0] = tempData[(j * tempDataLineSize) + (i << 1) + 1];
00316 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 1] = tempData[(j * tempDataLineSize) + (i << 1)];
00317 }
00318 }
00319 } else if((tempHeader.tgaBPP == 16) && ((tempHeader.tgaDescriptor & 0x0F) == 4)) {
00320 for(j = 0; j < tempHeader.tgaHeight; j++) {
00321 for(i = 0; i < tempHeader.tgaWidth; i++) {
00322 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 0] = tempData[(j * tempDataLineSize) + (i << 1) + 1];
00323 tempOut->texData[(((j * tempOut->texDataWidth) + i) << 1) + 1] = tempData[(j * tempDataLineSize) + (i << 1)];
00324 }
00325 }
00326 }
00327 }
00328 }
00329
00330 memFree(tempData);
00331 return tempOut;
00332 }
00333
00334 bool texSaveTGA(Texture* inTex, char* inPath) {
00335 if(!inTex) {
00336 #if FL_DEBUG_ERROR != 0
00337 debugError("Trying to save NULL texture.");
00338 #endif
00339 return false;
00340 }
00341 if(texPalettized(inTex)) {
00342 if(!inTex->texPalette) {
00343 #if FL_DEBUG_WARNING != 0
00344 debugError("Trying to save palettized texture without palette.");
00345 #endif
00346 return false;
00347 }
00348 if(inTex->texPalette->palPixelFormat != GU_PSM_8888) {
00349 #if FL_DEBUG_WARNING != 0
00350 debugWarning("Only 24/32 bit textures are supported for saving at the minute.");
00351 #endif
00352 return false;
00353 }
00354 } else if(inTex->texPixelFormat != GU_PSM_8888) {
00355 #if FL_DEBUG_WARNING != 0
00356 debugWarning("Only 32 bit textures are supported for saving at the minute.");
00357 #endif
00358 return false;
00359 }
00360
00361 #if FL_GRAPHICS != 0
00362 bool tempReswizzle = false;
00363 if(inTex->texSwizzled) {
00364 if(texUnswizzle(inTex)) {
00365 tempReswizzle = true;
00366 } else {
00367 #if FL_DEBUG_WARNING != 0
00368 debugWarning("Can't un-swizzle texture for saving.");
00369 #endif
00370 return false;
00371 }
00372 }
00373 #else
00374 if(inTex->texSwizzled) {
00375 #if FL_DEBUG_WARNING != 0
00376 debugWarning("Can't un-swizzle texture for saving, because flGraphics isn't compiled in.");
00377 #endif
00378 return false;
00379 }
00380 #endif
00381
00382 tgaFileHeader tempHeader;
00383 tempHeader.tgaIdentSize = 0;
00384 if(texPalettized(inTex)) {
00385 tempHeader.tgaImageType = 1;
00386 tempHeader.tgaPaletteType = 1;
00387 tempHeader.tgaPaletteLen = inTex->texPalette->palEntries;
00388 tempHeader.tgaPaletteStart = 0;
00389 switch(inTex->texPalette->palPixelFormat) {
00390 case GU_PSM_8888:
00391 #if FL_TEXTURE_PRESERVENONALPHA != 0
00392 if(inTex->texAlpha) {
00393 tempHeader.tgaDescriptor = 8;
00394 tempHeader.tgaPaletteBPP = 32;
00395 } else {
00396 tempHeader.tgaDescriptor = 0;
00397 tempHeader.tgaPaletteBPP = 24;
00398 }
00399 #else
00400 tempHeader.tgaDescriptor = 8;
00401 tempHeader.tgaPaletteBPP = 32;
00402 #endif
00403 break;
00404 case GU_PSM_4444:
00405 tempHeader.tgaDescriptor = 4;
00406 tempHeader.tgaPaletteBPP = 16;
00407 break;
00408 case GU_PSM_5551:
00409 tempHeader.tgaDescriptor = 1;
00410 tempHeader.tgaPaletteBPP = 16;
00411 break;
00412 case GU_PSM_5650:
00413 tempHeader.tgaDescriptor = 0;
00414 tempHeader.tgaPaletteBPP = 16;
00415 break;
00416 default:
00417 tempHeader.tgaDescriptor = 0;
00418 tempHeader.tgaPaletteBPP = 16;
00419 break;
00420 }
00421 tempHeader.tgaBPP = texBPP(inTex);
00422 } else {
00423 tempHeader.tgaImageType = 2;
00424 tempHeader.tgaPaletteType = 0;
00425 tempHeader.tgaPaletteBPP = 0;
00426 tempHeader.tgaPaletteLen = 0;
00427 tempHeader.tgaPaletteStart = 0;
00428 switch(inTex->texPixelFormat) {
00429 case GU_PSM_8888:
00430 #if FL_TEXTURE_PRESERVENONALPHA != 0
00431 if(inTex->texAlpha) {
00432 tempHeader.tgaDescriptor = 8;
00433 tempHeader.tgaBPP = 32;
00434 } else {
00435 tempHeader.tgaDescriptor = 0;
00436 tempHeader.tgaBPP = 24;
00437 }
00438 #else
00439 tempHeader.tgaDescriptor = 8;
00440 tempHeader.tgaBPP = 32;
00441 #endif
00442 break;
00443 case GU_PSM_4444:
00444 tempHeader.tgaDescriptor = 4;
00445 tempHeader.tgaBPP = 16;
00446 break;
00447 case GU_PSM_5551:
00448 tempHeader.tgaDescriptor = 1;
00449 tempHeader.tgaBPP = 16;
00450 break;
00451 case GU_PSM_5650:
00452 tempHeader.tgaDescriptor = 0;
00453 tempHeader.tgaBPP = 16;
00454 break;
00455 default:
00456 tempHeader.tgaDescriptor = 0;
00457 tempHeader.tgaBPP = texBPP(inTex);
00458 break;
00459 }
00460 }
00461 tempHeader.tgaXStart = 0;
00462 tempHeader.tgaYStart = 0;
00463 tempHeader.tgaWidth = inTex->texWidth;
00464 tempHeader.tgaHeight = inTex->texHeight;
00465
00466 #if FL_FILE != 0
00467 File* tempFile = fileOpen(inPath, FILE_MODE_WRITE | FILE_MODE_BINARY);
00468 #else
00469 FILE* tempFile = fopen(inPath, "wb");
00470 #endif
00471 if(!tempFile) {
00472 #if FL_DEBUG_ERROR != 0
00473 debugError("Cannot open TGA file(%s) for writing.", inPath);
00474 #endif
00475 return false;
00476 }
00477 fileWrite(&tempHeader.tgaIdentSize, 1, tempFile);
00478 fileWrite(&tempHeader.tgaPaletteType, 1, tempFile);
00479 fileWrite(&tempHeader.tgaImageType, 1, tempFile);
00480 fileWrite(&tempHeader.tgaPaletteStart, 2, tempFile);
00481 fileWrite(&tempHeader.tgaPaletteLen, 2, tempFile);
00482 fileWrite(&tempHeader.tgaPaletteBPP, 1, tempFile);
00483 fileWrite(&tempHeader.tgaXStart, 2, tempFile);
00484 fileWrite(&tempHeader.tgaYStart, 2, tempFile);
00485 fileWrite(&tempHeader.tgaWidth, 2, tempFile);
00486 fileWrite(&tempHeader.tgaHeight, 2, tempFile);
00487 fileWrite(&tempHeader.tgaBPP, 1, tempFile);
00488 fileWrite(&tempHeader.tgaDescriptor, 1, tempFile);
00489 int i, j;
00490 if(texPalettized(inTex)) {
00491 switch(inTex->texPalette->palPixelFormat) {
00492 case GU_PSM_8888:
00493 #if FL_TEXTURE_PRESERVENONALPHA != 0
00494 if(inTex->texAlpha) {
00495 #endif
00496 for(i = 0; i < tempHeader.tgaPaletteLen; i++) {
00497 fileWrite(&inTex->texPalette->palData[(i << 2) + 2], 1, tempFile);
00498 fileWrite(&inTex->texPalette->palData[(i << 2) + 1], 1, tempFile);
00499 fileWrite(&inTex->texPalette->palData[(i << 2) + 0], 1, tempFile);
00500 fileWrite(&inTex->texPalette->palData[(i << 2) + 3], 1, tempFile);
00501 }
00502 #if FL_TEXTURE_PRESERVENONALPHA != 0
00503 } else {
00504 for(i = 0; i < tempHeader.tgaPaletteLen; i++) {
00505 fileWrite(&inTex->texPalette->palData[(i << 2) + 2], 1, tempFile);
00506 fileWrite(&inTex->texPalette->palData[(i << 2) + 1], 1, tempFile);
00507 fileWrite(&inTex->texPalette->palData[(i << 2) + 0], 1, tempFile);
00508 }
00509 }
00510 #endif
00511 break;
00512 case GU_PSM_4444:
00513 break;
00514 case GU_PSM_5650:
00515 break;
00516 case GU_PSM_5551:
00517 break;
00518 }
00519 for(j = (inTex->texHeight - 1); j >= 0; j--)
00520 fileWrite(&inTex->texData[(j * inTex->texDataWidth * texBPP(inTex)) >> 3], ((inTex->texWidth * texBPP(inTex)) >> 3), tempFile);
00521 } else {
00522 switch(inTex->texPixelFormat) {
00523 case GU_PSM_8888:
00524 #if FL_TEXTURE_PRESERVENONALPHA != 0
00525 if(inTex->texAlpha) {
00526 #endif
00527 for(j = (inTex->texHeight - 1); j >= 0; j--) {
00528 for(i = 0; i < inTex->texWidth; i++) {
00529 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 2], 1, tempFile);
00530 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 1], 1, tempFile);
00531 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 0], 1, tempFile);
00532 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 3], 1, tempFile);
00533 }
00534 }
00535 #if FL_TEXTURE_PRESERVENONALPHA != 0
00536 } else {
00537 for(j = (inTex->texHeight - 1); j >= 0; j--) {
00538 for(i = 0; i < inTex->texWidth; i++) {
00539 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 2], 1, tempFile);
00540 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 1], 1, tempFile);
00541 fileWrite(&inTex->texData[(((j * inTex->texDataWidth) + i) << 2) + 0], 1, tempFile);
00542 }
00543 }
00544 }
00545 #endif
00546 break;
00547 case GU_PSM_4444:
00548 break;
00549 case GU_PSM_5650:
00550 break;
00551 case GU_PSM_5551:
00552 break;
00553 }
00554 }
00555
00556 fileClose(tempFile);
00557
00558 #if FL_GRAPHICS != 0
00559 if(tempReswizzle)
00560 texSwizzle(inTex);
00561 #endif
00562
00563 return true;
00564 }
00565
00566 #endif