167 lines
No EOL
3.4 KiB
C++
167 lines
No EOL
3.4 KiB
C++
#include "TRACK.h"
|
|
#include "MEDIA.h"
|
|
|
|
#pragma pack(push, 1)
|
|
typedef struct
|
|
{
|
|
unsigned char uc_Size;
|
|
unsigned char uc_ColorMapType;
|
|
unsigned char uc_ImageTypeCode;
|
|
unsigned short uw_Origin;
|
|
unsigned short uw_PaletteLength;
|
|
unsigned char uc_BPCInPalette;
|
|
unsigned short uw_Left;
|
|
unsigned short uw_Top;
|
|
unsigned short uw_Width;
|
|
unsigned short uw_Height;
|
|
unsigned char uc_BPP;
|
|
unsigned char ucDescriptorByte;
|
|
} TgaHeader;
|
|
#pragma pack(pop)
|
|
|
|
class TGA_Grabber:public INPUT_IO
|
|
{
|
|
public:
|
|
int INIT (class WORLD*){return 0;};
|
|
int FRAME (void);
|
|
int END (void){return 0;};
|
|
IOTYPE GetType() {return IOtype_TGA;};
|
|
|
|
};
|
|
void TEX_l_File_TgaUncompress(char uc_BPP, char *pc_Dest, char *_pc_Buffer, ULONG ul_L)
|
|
{
|
|
/*~~~~~~~~~~~*/
|
|
unsigned char uc_Num;
|
|
ULONG ul_Val;
|
|
/*~~~~~~~~~~~*/
|
|
|
|
while((int) ul_L > 0)
|
|
{
|
|
uc_Num = (*_pc_Buffer & 0x7F) + 1;
|
|
|
|
if(*_pc_Buffer & 0x80)
|
|
{
|
|
_pc_Buffer++;
|
|
ul_Val = *(int *) _pc_Buffer;
|
|
if(uc_BPP == 24)
|
|
_pc_Buffer += 3;
|
|
else
|
|
_pc_Buffer += 4;
|
|
while(uc_Num--)
|
|
{
|
|
if(uc_BPP == 24)
|
|
{
|
|
*(pc_Dest++) = (char) (ul_Val);
|
|
*(pc_Dest++) = (char) (ul_Val >> 8);
|
|
*(pc_Dest++) = (char) (ul_Val >> 16);
|
|
ul_L -= 3;
|
|
}
|
|
else
|
|
{
|
|
*(int *) pc_Dest = ul_Val;
|
|
pc_Dest += 4;
|
|
ul_L -= 4;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_pc_Buffer++;
|
|
while(uc_Num--)
|
|
{
|
|
if(uc_BPP == 24)
|
|
{
|
|
*(pc_Dest++) = *(_pc_Buffer++);
|
|
*(pc_Dest++) = *(_pc_Buffer++);
|
|
*(pc_Dest++) = *(_pc_Buffer++);
|
|
ul_L -= 3;
|
|
}
|
|
else
|
|
{
|
|
*(int *) pc_Dest = *(int *) _pc_Buffer;
|
|
_pc_Buffer += 4;
|
|
pc_Dest += 4;
|
|
ul_L -= 4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
u32 LOADTGA(MAP *RefMap,char *Filename)
|
|
{
|
|
FILE *F;
|
|
TgaHeader st_TgaHeader;
|
|
F = GetSceneFileHanler(Filename);//,"rb");
|
|
if (!F) return 0;
|
|
fread( &st_TgaHeader, sizeof( char ), sizeof(st_TgaHeader), F );
|
|
if (st_TgaHeader.uc_BPP != 24 && st_TgaHeader.uc_BPP != 32)
|
|
return 0;
|
|
RefMap->SetSize(st_TgaHeader.uw_Width, st_TgaHeader.uw_Height);
|
|
if(st_TgaHeader.uc_ImageTypeCode >= 9)
|
|
{
|
|
char *TempBuffer = (char*)CC_malloc(RefMap->SX * RefMap->SY * 4);
|
|
if (TempBuffer)
|
|
{
|
|
fread( TempBuffer , sizeof( char ), RefMap->SX * RefMap->SY * 4, F );
|
|
TEX_l_File_TgaUncompress(st_TgaHeader.uc_BPP, (char *) RefMap->GetBase(), TempBuffer, RefMap->SX * RefMap->SY * (st_TgaHeader.uc_BPP>>3));
|
|
CC_free(TempBuffer);
|
|
}
|
|
} else
|
|
fread( RefMap->GetBase(), sizeof( char ), RefMap->SX * RefMap->SY * 4, F );
|
|
|
|
if (st_TgaHeader.uc_BPP == 24)
|
|
{
|
|
/* 24 -> 32 */
|
|
u8 *SRC,*DST;
|
|
u32 Counter;
|
|
Counter = RefMap->SX * RefMap->SY;
|
|
SRC = ((u8*)RefMap->GetBase()) + RefMap->SX * RefMap->SY * 3 - 3;
|
|
DST = ((u8*)RefMap->GetBase()) + RefMap->SX * RefMap->SY * 4 - 4;
|
|
while (Counter--)
|
|
{
|
|
*(DST + 3) = 0xff;
|
|
*(DST + 2) = *(SRC + 2);
|
|
*(DST + 1) = *(SRC + 1);
|
|
*(DST + 0) = *(SRC + 0);
|
|
SRC-=3;
|
|
DST-=4;
|
|
}
|
|
}
|
|
CC_fclose(F);
|
|
return 1;
|
|
}
|
|
|
|
int TGA_Grabber::FRAME(void)
|
|
{
|
|
if (ulFileAsbeenTouched)
|
|
{
|
|
if (LOADTGA(&Image,(char*)MediaName))
|
|
{
|
|
ulFileAsbeenTouched = 0;
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
INPUT_IO *TARG_CREATE(char *Filename)
|
|
{
|
|
INPUT_IO *Ret;
|
|
u32 Fl;
|
|
u8 *Fi;
|
|
Fl = GetFileLenght(Filename);
|
|
if (Fl)
|
|
{
|
|
Ret = (INPUT_IO *)new(TGA_Grabber);
|
|
Ret->dTotalTime = 0;
|
|
Ret->dAvgFramePerSecond = 30.0;
|
|
strcpy((char*)Ret->MediaName,Filename);
|
|
if (LOADTGA(&Ret->Image,Filename))
|
|
return (INPUT_IO *)Ret;
|
|
}
|
|
char errorName[1024];
|
|
sprintf(errorName, "TGA file\n%s\nnot Found!", Filename);
|
|
return ERROR_CREATE(errorName);
|
|
} |