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

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