JD2022-TU1/main/extern/Camcam/LIBS/Input/JPEG.cpp

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);
}
}