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