151 lines
No EOL
3 KiB
C++
151 lines
No EOL
3 KiB
C++
#include "TRACK.h"
|
|
#include "MEDIA.h"
|
|
|
|
|
|
//#pragma optimize( "", off )
|
|
|
|
|
|
class BMP_Grabber:public INPUT_IO
|
|
{
|
|
public:
|
|
int INIT (class WORLD*){return 0;};
|
|
int FRAME (void);
|
|
int END (void){return 0;};
|
|
IOTYPE GetType() {return IOtype_TGA;};
|
|
|
|
};
|
|
|
|
typedef struct tagBitmapFileHeader {
|
|
unsigned short bfType;
|
|
unsigned int bfSize;
|
|
unsigned short bfReserved1;
|
|
unsigned short bfReserved2;
|
|
unsigned int bfOffBits;
|
|
} BitmapFileHeader;
|
|
|
|
typedef struct tagBitmapInfoHeader {
|
|
unsigned int biSize;
|
|
int biWidth;
|
|
int biHeight;
|
|
unsigned short biPlanes;
|
|
unsigned short biBitCount;
|
|
unsigned int biCompression;
|
|
unsigned int biSizeImage;
|
|
int biXPelsPerMeter;
|
|
int biYPelsPerMeter;
|
|
unsigned int biClrUsed;
|
|
unsigned int biClrImportant;
|
|
} BitmapInfoHeader;
|
|
|
|
|
|
u32 LOADBMP(MAP *RefMap,char *Filename)
|
|
{
|
|
FILE *F;
|
|
BITMAPFILEHEADER st_BMPHeader;
|
|
F = GetSceneFileHanler(Filename);//,"rb");
|
|
if (!F) return 0;
|
|
|
|
fread(&st_BMPHeader,1,sizeof(BITMAPFILEHEADER),F);
|
|
|
|
u32 size;
|
|
u32 bpp;
|
|
fread(&size,1,4,F);
|
|
|
|
if (size == sizeof(BITMAPINFOHEADER))
|
|
{
|
|
BITMAPINFOHEADER st_BMPInfoHeader;
|
|
fread(((u8 *)&st_BMPInfoHeader) + 4,1,sizeof(BITMAPINFOHEADER)-4,F);
|
|
RefMap->SX = st_BMPInfoHeader.biWidth;
|
|
RefMap->SY = st_BMPInfoHeader.biHeight;
|
|
bpp=st_BMPInfoHeader.biBitCount;
|
|
} else
|
|
if (size == sizeof(BITMAPV4HEADER))
|
|
{
|
|
BITMAPV4HEADER st_BMPInfoHeader;
|
|
fread(((u8 *)&st_BMPInfoHeader) + 4,1,sizeof(BITMAPV4HEADER)-4,F);
|
|
RefMap->SX = st_BMPInfoHeader.bV4Width;
|
|
RefMap->SY = st_BMPInfoHeader.bV4Height;
|
|
bpp=st_BMPInfoHeader.bV4BitCount;
|
|
} else
|
|
if (size == sizeof(BITMAPV5HEADER))
|
|
{
|
|
BITMAPV5HEADER st_BMPInfoHeader;
|
|
fread(((u8 *)&st_BMPInfoHeader) + 4,1,sizeof(BITMAPV5HEADER)-4,F);
|
|
RefMap->SX = st_BMPInfoHeader.bV5Width;
|
|
RefMap->SY = st_BMPInfoHeader.bV5Height;
|
|
bpp=st_BMPInfoHeader.bV5BitCount;
|
|
} else return 0;
|
|
|
|
RefMap->SetSize(RefMap->SX, RefMap->SY);
|
|
s32 *pBASE = RefMap->GetBase();
|
|
u32 Pixels = RefMap->SX * RefMap->SY;
|
|
|
|
switch (bpp)
|
|
{
|
|
case 8:
|
|
u32 Palette[256];
|
|
fread(Palette,sizeof(Palette),1,F);
|
|
for (u32 Counter = 0 ; Counter < Pixels ; Counter ++)
|
|
{
|
|
u8 C;
|
|
fread(&C,1,1,F);
|
|
pBASE[Counter] = Palette[C];
|
|
}
|
|
break;
|
|
case 16:
|
|
for (u32 Counter = 0 ; Counter < Pixels ; Counter ++)
|
|
{
|
|
u16 C;
|
|
fread(&C,1,2,F);
|
|
pBASE[Counter] = C;
|
|
}
|
|
break;
|
|
case 24:
|
|
for (u32 Counter = 0 ; Counter < Pixels ; Counter ++)
|
|
{
|
|
u32 C;
|
|
fread(&C,1,3,F);
|
|
pBASE[Counter] = C;
|
|
}
|
|
break;
|
|
case 32:
|
|
fread(pBASE,1,Pixels * 4,F);
|
|
break;
|
|
}
|
|
CC_fclose(F);
|
|
return 1;
|
|
}
|
|
|
|
int BMP_Grabber::FRAME(void)
|
|
{
|
|
if (ulFileAsbeenTouched)
|
|
{
|
|
if (LOADBMP(&Image,(char*)MediaName))
|
|
{
|
|
ulFileAsbeenTouched = 0;
|
|
return 1;
|
|
} else
|
|
return 0;
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
INPUT_IO *BMP_CREATE(char *Filename)
|
|
{
|
|
INPUT_IO *Ret;
|
|
u32 Fl;
|
|
u8 *Fi;
|
|
Fl = GetFileLenght(Filename);
|
|
if (Fl)
|
|
{
|
|
Ret = (INPUT_IO *)new(BMP_Grabber);
|
|
Ret->dTotalTime = 0;
|
|
Ret->dAvgFramePerSecond = 30.0;
|
|
strcpy((char*)Ret->MediaName,Filename);
|
|
if (LOADBMP(&Ret->Image,Filename))
|
|
return (INPUT_IO *)Ret;
|
|
else
|
|
delete Ret;
|
|
}
|
|
return ERROR_CREATE("BMP file\nnot Found!");
|
|
} |