246 lines
No EOL
5.5 KiB
C++
246 lines
No EOL
5.5 KiB
C++
#include "TRACK.h"
|
|
#include "MEDIA.h"
|
|
//#pragma optimize("",off)
|
|
extern "C" {
|
|
#include "JPEG\INTERFCE.H"
|
|
};
|
|
//#pragma optimize("",off)
|
|
#define ALPHA_EXTEND "_ALPHA.JPG"
|
|
u32 AllowOnlyAlpha = true;
|
|
|
|
class JPG_Grabber:public INPUT_IO
|
|
{
|
|
public:
|
|
int INIT (class WORLD*){return 0;};
|
|
int FRAME ();
|
|
int END (){return 0;};
|
|
int JPG_Load();
|
|
IOTYPE GetType() {return IOtype_JPEG;};
|
|
|
|
};
|
|
|
|
int JPG_Grabber::JPG_Load()
|
|
{
|
|
u32 Fl;
|
|
u8 *Fi;
|
|
Fl = GetFileLenght((char*)MediaName);
|
|
|
|
if (Fl)
|
|
{
|
|
FILE *F;
|
|
s32 *pBASE;
|
|
JPEGDATA stJPD;
|
|
u32 AlphaComponents,RGBComponents;
|
|
ulFileAsbeenTouched = 0;
|
|
AlphaComponents = 0;
|
|
Fi = (u8*)CC_malloc(Fl);
|
|
F = GetSceneFileHanler((char*)MediaName);//,"rb");
|
|
if (F)
|
|
{
|
|
fread( Fi, sizeof( char ), Fl, F );
|
|
CC_fclose(F);
|
|
}
|
|
lJADE_JPEG_INPOUT_FILE_LENGHT = Fl;
|
|
ucJADE_JPEG_INPOUT_FILE = Fi;
|
|
JpegInfo(&stJPD);
|
|
if (stJPD.status)
|
|
{
|
|
CC_free(Fi);
|
|
return 0;
|
|
}
|
|
RGBComponents = stJPD.components;
|
|
Image.SetSize(stJPD.width, stJPD.height);
|
|
pBASE = Image.GetBase();
|
|
stJPD.ptr = (u8*)Image.GetBase();
|
|
lJADE_JPEG_INPOUT_FILE_LENGHT = Fl;
|
|
ucJADE_JPEG_INPOUT_FILE = Fi;
|
|
JpegRead(&stJPD);
|
|
|
|
CC_free(Fi);
|
|
|
|
/* Try to read an alpha texture */
|
|
char Alpha[2048];
|
|
u8 *AlphaField = NULL;
|
|
sprintf(Alpha,"%s",MediaName);
|
|
Fl = 0;
|
|
if ((Upper(MediaName[0]) == 'H') &&
|
|
(Upper(MediaName[1]) == 'T') &&
|
|
(Upper(MediaName[2]) == 'T') &&
|
|
(Upper(MediaName[3]) == 'P'))
|
|
{} else {
|
|
if (Alpha[strlen(Alpha)-3] == '.')
|
|
{
|
|
sprintf(Alpha + strlen(Alpha)-3,ALPHA_EXTEND);
|
|
Fl = GetFileLenght((char*)Alpha);
|
|
} else
|
|
if (Alpha[strlen(Alpha)-4] == '.')
|
|
{
|
|
sprintf(Alpha + strlen(Alpha)-4,ALPHA_EXTEND);
|
|
Fl = GetFileLenght((char*)Alpha);
|
|
}
|
|
}
|
|
if (Fl) // There is an alpha texture
|
|
{
|
|
Fi = (u8*)CC_malloc(Fl);
|
|
F = GetSceneFileHanler((char*)Alpha);//,"rb");
|
|
if (F)
|
|
{
|
|
fread( Fi, sizeof( char ), Fl, F );
|
|
CC_fclose(F);
|
|
lJADE_JPEG_INPOUT_FILE_LENGHT = Fl;
|
|
ucJADE_JPEG_INPOUT_FILE = Fi;
|
|
JpegInfo(&stJPD);
|
|
if ((Image.SX == stJPD.width) && (Image.SY == stJPD.height))
|
|
{
|
|
AlphaComponents = stJPD.components;
|
|
AlphaField = stJPD.ptr = (u8*)CC_malloc((Image.SX+1) * (Image.SY+1) * 4);
|
|
lJADE_JPEG_INPOUT_FILE_LENGHT = Fl;
|
|
ucJADE_JPEG_INPOUT_FILE = Fi;
|
|
JpegRead(&stJPD);
|
|
}
|
|
}
|
|
CC_free(Fi);
|
|
}
|
|
|
|
|
|
/* 24 -> 32 */
|
|
u8 *SRC,*DST;
|
|
u32 Counter;
|
|
Counter = Image.SX * Image.SY;
|
|
SRC = ((u8*)Image.GetBase()) + Image.SX * Image.SY * RGBComponents;
|
|
DST = ((u8*)Image.GetBase()) + Image.SX * Image.SY * 4;
|
|
if (AlphaField) AlphaField += Image.SX * Image.SY * AlphaComponents;
|
|
|
|
while (Counter--)
|
|
{
|
|
SRC-=RGBComponents;
|
|
DST-=4;
|
|
*(DST + 3) = 0xff;
|
|
*(DST + 2) = *(SRC + 0);
|
|
*(DST + 1) = *(SRC + (1%RGBComponents));
|
|
*(DST + 0) = *(SRC + (2%RGBComponents));
|
|
if (AlphaField)
|
|
{
|
|
AlphaField -= AlphaComponents;
|
|
*(DST + 3) = *AlphaField;
|
|
}
|
|
}
|
|
|
|
if (AlphaField) CC_free(AlphaField);
|
|
|
|
|
|
/* Is Only AlphaTexture ? */
|
|
char *Dtc;
|
|
Dtc = (char*)MediaName + strlen((char*)MediaName) - strlen(ALPHA_EXTEND);
|
|
if (AllowOnlyAlpha && Dtc > (char*)MediaName)
|
|
{
|
|
char *DSTCmp;
|
|
DSTCmp = ALPHA_EXTEND;
|
|
while ((Upper(*Dtc) == Upper(*DSTCmp)) && *DSTCmp && *Dtc)
|
|
{
|
|
DSTCmp++;
|
|
Dtc++;
|
|
}
|
|
|
|
if ((*DSTCmp == 0) && (*Dtc == 0))
|
|
{
|
|
/* YES => set ALPHA to RGB & RGB to white */
|
|
for (u32 X = 0 ; X < Image.SX ; X++ )
|
|
for (u32 Y = 0 ; Y < Image.SY ; Y++ )
|
|
{
|
|
u32 Swap;
|
|
Swap = ((u32)*(pBASE + X + Y * Image.SX))<<24;
|
|
Swap |= 0xffffff;
|
|
*(pBASE + X + Y * Image.SX) = Swap;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* Flip V */
|
|
for (u32 X = 0 ; X < Image.SX ; X++ )
|
|
for (u32 Y = 0 ; Y < Image.SY >> 1 ; Y++ )
|
|
{
|
|
u32 Swap;
|
|
Swap = *(pBASE + X + Y * Image.SX);
|
|
*(pBASE + X + Y * Image.SX) = *(pBASE + X + (Image.SY - Y - 1) * Image.SX);
|
|
*(pBASE + X + (Image.SY - Y - 1) * Image.SX) = Swap;
|
|
}
|
|
/*
|
|
u32 *PtrH,*Ptr;
|
|
Counter = (Image.SX * Image.SY)>>1;
|
|
PtrH = Ptr = (u32 *)pBASE;
|
|
while (Counter--)
|
|
{
|
|
*(Ptr++) = ((*((u32*)PtrH) & 0xfefefefe)>>1) + ((*((u32*)(PtrH+1)) & 0xfefefefe)>>1);
|
|
PtrH += 2;
|
|
}
|
|
|
|
Image.SY >>= 1;
|
|
Image.SX >>= 1;
|
|
Image.PITCH >>= 1;
|
|
for (u32 Y = 0 ; Y < Image.SY ; Y++)
|
|
{
|
|
for (u32 X = 0 ; X < Image.SX ; X++ )
|
|
{
|
|
*(u32*)(pBASE + X + Y * Image.SX) = ((*(u32*)(pBASE + X + (Y * 2) * Image.SX) & 0xfefefefe)>>1) + ((*(u32*)(pBASE + X + (Y*2+1) * Image.SX) & 0xfefefefe)>>1);
|
|
}
|
|
}
|
|
|
|
pBASE = (s32 *)CC_realloc(pBASE,Image.SY * Image.PITCH * 4);
|
|
/*
|
|
Counter = (Image.SX * Image.SY)>>1;
|
|
PtrH = Ptr = (u32 *)pBASE;
|
|
while (Counter--)
|
|
{
|
|
*(Ptr++) = ((*((u32*)PtrH) & 0xfefefefe)>>1) + ((*((u32*)(PtrH+1)) & 0xfefefefe)>>1);
|
|
PtrH += 2;
|
|
}
|
|
|
|
Image.SY >>= 1;
|
|
Image.SX >>= 1;
|
|
Image.PITCH >>= 1;
|
|
for (u32 Y = 0 ; Y < Image.SY ; Y++)
|
|
{
|
|
for (u32 X = 0 ; X < Image.SX ; X++ )
|
|
{
|
|
*(u32*)(pBASE + X + Y * Image.SX) = ((*(u32*)(pBASE + X + (Y * 2) * Image.SX) & 0xfefefefe)>>1) + ((*(u32*)(pBASE + X + (Y*2+1) * Image.SX) & 0xfefefefe)>>1);
|
|
}
|
|
}
|
|
|
|
pBASE = (s32 *)CC_realloc(pBASE,(512 + (Image.SY + 16) * (Image.PITCH) * 4));
|
|
|
|
//*/
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int JPG_Grabber::FRAME()
|
|
{
|
|
if (ulFileAsbeenTouched)
|
|
{
|
|
JPG_Load();
|
|
ulFileAsbeenTouched = 0;
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
INPUT_IO *JPEG_CREATE(char *Filename)
|
|
{
|
|
INPUT_IO *Ret;
|
|
|
|
Ret = (INPUT_IO *)new(JPG_Grabber);
|
|
strcpy((char*)Ret->MediaName,Filename);
|
|
Ret->dTotalTime = 0;
|
|
Ret->dAvgFramePerSecond = 30.0;
|
|
if (((JPG_Grabber *)Ret)->JPG_Load()) return Ret;
|
|
else
|
|
{
|
|
char errorName[1024];
|
|
sprintf(errorName, "JPG file\n%s\nnot Found!", Filename);
|
|
return ERROR_CREATE(errorName);
|
|
}
|
|
} |