reman3/Rayman_X/cpa/tempgrp/FIL/FIL_Bmp.c

282 lines
10 KiB
C

#if defined(WIN32)
#include <direct.h>
#include <io.h>
#endif /* WIN32 */
#include "FIL_CPA.h"
#define D_FIL_StructureDefine
#include "ErmFil.h"
#include "FIL_Pub.h"
#include "FIL_Priv.h"
#include "FIL_Bmp.h"
#include "MMG.h"
/**************************************************************************/
void FIL_fn_vSaveBMPInFile(char *p_szFileName,unsigned char *p_ucSource,unsigned long ulWidth,unsigned long ulHeight,unsigned char ucNumberOfBytesInFile,unsigned char ucNumberOfBytesInSource)
{
struct FIL_tdstBmp_ stBmp;
FILE *p_stFile;
long x,y;
/**** Bmp File Header ****/
stBmp.stFileHeader.uwType = 0x4D42; /**** BM ****/
stBmp.stFileHeader.ulSize = sizeof(struct FIL_tdstBmpFileHeader_)+sizeof(struct FIL_tdstBmpInfoHeader_)+ucNumberOfBytesInFile*ulHeight*ulWidth;
stBmp.stFileHeader.ulReserved = 0x00000000;
stBmp.stFileHeader.ulOffsetBits = sizeof(struct FIL_tdstBmpFileHeader_)+sizeof(struct FIL_tdstBmpInfoHeader_);
/**** Bmp Info Header ****/
stBmp.stInfoHeader.ulSize = sizeof(struct FIL_tdstBmpInfoHeader_);
stBmp.stInfoHeader.ulWidth = ulWidth;
stBmp.stInfoHeader.ulHeight = ulHeight;
stBmp.stInfoHeader.uwPlanes = 1;
stBmp.stInfoHeader.uwBitCount = (unsigned short)(8*ucNumberOfBytesInFile);
stBmp.stInfoHeader.ulCompression = 0;
stBmp.stInfoHeader.ulSizeImage = ucNumberOfBytesInFile*ulHeight*ulWidth;
stBmp.stInfoHeader.ulXPelsPerMeter = 0;
stBmp.stInfoHeader.ulYPelsPerMeter = 0;
stBmp.stInfoHeader.ulColorsUsed = 0;
stBmp.stInfoHeader.ulColorsImportant = 0;
stBmp.p_ucBitMap = p_ucSource;
FIL_fn_bValidatePath("",p_szFileName);
if ((p_stFile = fopen(p_szFileName,"wb"))!=NULL)
{
fwrite(&stBmp.stFileHeader,sizeof(struct FIL_tdstBmpFileHeader_),1,p_stFile);
fwrite(&stBmp.stInfoHeader,sizeof(struct FIL_tdstBmpInfoHeader_),1,p_stFile);
for (y=ulHeight-1;y>=0;y--)
{
for (x=0;x<(long)ulWidth;x++)
{
fwrite(stBmp.p_ucBitMap+(y*ulWidth+x)*ucNumberOfBytesInSource,sizeof(unsigned char),ucNumberOfBytesInFile,p_stFile);
}
}
fclose(p_stFile);
}
}
/**************************************************************************/
void FIL_fn_vLoadBMPInformationFromFile(char *p_szPath,char *p_szFileName,unsigned char *p_ucNumberOfBytesInDest,unsigned long *p_ulWidth,unsigned long *p_ulHeight)
{
FILE *p_stFile;
struct FIL_tdstBmp_ stBmp;
char szCompleteName[_MAX_PATH];
sprintf(szCompleteName,"%s\\%s",p_szPath,p_szFileName);
*p_ucNumberOfBytesInDest = 0;
*p_ulWidth = 0;
*p_ulHeight = 0;
if ((p_stFile = fopen(szCompleteName,"rb"))!=NULL)
{
fread(&stBmp.stFileHeader,sizeof(struct FIL_tdstBmpFileHeader_),1,p_stFile);
fread(&stBmp.stInfoHeader,sizeof(struct FIL_tdstBmpInfoHeader_),1,p_stFile);
if ( stBmp.stFileHeader.uwType!=0x4D42 /**** BM ****/
||stBmp.stInfoHeader.uwPlanes!=1
/* CGHT Palette*/
||((stBmp.stInfoHeader.uwBitCount!=24)&&(stBmp.stInfoHeader.uwBitCount!=8))
||stBmp.stInfoHeader.ulCompression!=0
)
{
M_FILInformationErrorWithMessage(E_uwFILBadBmpFormat,szCompleteName);
}
else
{
*p_ucNumberOfBytesInDest = (unsigned char)(stBmp.stInfoHeader.uwBitCount/8);
*p_ulWidth = stBmp.stInfoHeader.ulWidth;
*p_ulHeight = stBmp.stInfoHeader.ulHeight;
}
fclose(p_stFile);
}
}
/**************************************************************************/
#if !defined(RETAIL) /* Use only in ConvImg*/
void FIL_fn_vLoadBMPFromFileWithInvertPicture(char *p_szPath, char *p_szFileName, FIL_tdstGF *_p_stHeader)
{
FIL_fn_vLoadBMPFromFileWithoutInvertPicture(p_szPath,p_szFileName,
&_p_stHeader->p_ucBitMap,
&_p_stHeader->stFileHeader.ucBpp,
&_p_stHeader->stFileHeader.ulWidth,
&_p_stHeader->stFileHeader.ulHeight);
if (_p_stHeader ->p_ucBitMap != NULL)
FIL_fn_vInvertBMP( _p_stHeader ->p_ucBitMap,
_p_stHeader->stFileHeader.ucBpp,
_p_stHeader->stFileHeader.ulWidth,
_p_stHeader->stFileHeader.ulHeight);
}
#endif /*RETAIL*/
/**************************************************************************/
void FIL_fn_vLoadBMPFromFileWithoutInvertPicture(char *p_szPath,char *p_szFileName,unsigned char **pp_ucDest,unsigned char *p_ucNumberOfBytesInDest,unsigned long *p_ulWidth,unsigned long *p_ulHeight)
{
FILE *p_stFile;
struct FIL_tdstBmp_ stBmp;
char szCompleteName[_MAX_PATH];
if (p_szPath[0]!=0)
sprintf(szCompleteName,"%s\\%s",p_szPath,p_szFileName);
else
sprintf(szCompleteName,"%s",p_szFileName);
*pp_ucDest = NULL;
*p_ucNumberOfBytesInDest = 0;
*p_ulWidth = 0;
*p_ulHeight = 0;
if ((p_stFile = fopen(szCompleteName,"rb"))!=NULL)
{
fread(&stBmp.stFileHeader,sizeof(struct FIL_tdstBmpFileHeader_),1,p_stFile);
fread(&stBmp.stInfoHeader,sizeof(struct FIL_tdstBmpInfoHeader_),1,p_stFile);
if ( stBmp.stFileHeader.uwType!=0x4D42 /**** BM ****/
||stBmp.stInfoHeader.uwPlanes!=1
/* CGHT Palette*/
||((stBmp.stInfoHeader.uwBitCount!=24)&&(stBmp.stInfoHeader.uwBitCount!=8))
||stBmp.stInfoHeader.ulCompression!=0
)
{
M_FILInformationErrorWithMessage(E_uwFILBadBmpFormat,szCompleteName);
}
else
{
unsigned long ulSizeOfPalette;
*p_ucNumberOfBytesInDest = (unsigned char)(stBmp.stInfoHeader.uwBitCount/8);
*p_ulWidth = stBmp.stInfoHeader.ulWidth;
*p_ulHeight = stBmp.stInfoHeader.ulHeight;
/* CGHT Palette*/
if(stBmp.stInfoHeader.uwBitCount==8)
{
/* Palette is on the start of the block*/
ulSizeOfPalette=256*sizeof(RGBQUAD);
}
else
{
ulSizeOfPalette=0;
}
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFile , MMG_C_lSubTypeBmpFile , NULL);
stBmp.p_ucBitMap = (unsigned char *)TMP_M_p_Malloc(*p_ulWidth**p_ulHeight**p_ucNumberOfBytesInDest+ulSizeOfPalette);
*pp_ucDest = stBmp.p_ucBitMap;
/* CGHT Palette*/
fread(stBmp.p_ucBitMap,1,*p_ucNumberOfBytesInDest**p_ulWidth**p_ulHeight+ulSizeOfPalette,p_stFile);
}
fclose(p_stFile);
}
}
/**************************************************************************/
void FIL_fn_vLoadBMPInformationFromConcatFile(FIL_tdxHandleToConcatFile hConcatFile,char *p_szPath,char *p_szFileName,unsigned char *p_ucNumberOfBytesInDest,unsigned long *p_ulWidth,unsigned long *p_ulHeight)
{
FIL_tdxHandleToFileInConcatFile hHandleToFile;
struct FIL_tdstBmp_ stBmp;
*p_ucNumberOfBytesInDest = 0;
*p_ulWidth = 0;
*p_ulHeight = 0;
if ((hHandleToFile = FIL_fn_hOpenFileInConcatFile(hConcatFile,p_szPath,p_szFileName))!=NULL)
{
FIL_fn_lReadFileInConcatFile(&stBmp.stFileHeader,sizeof(struct FIL_tdstBmpFileHeader_),1,hHandleToFile);
FIL_fn_lReadFileInConcatFile(&stBmp.stInfoHeader,sizeof(struct FIL_tdstBmpInfoHeader_),1,hHandleToFile);
if ( stBmp.stFileHeader.uwType!=0x4D42 /**** BM ****/
||stBmp.stInfoHeader.uwPlanes!=1
||stBmp.stInfoHeader.uwBitCount!=24
||stBmp.stInfoHeader.ulCompression!=0
)
{
M_FILInformationErrorWithMessage(E_uwFILBadBmpFormat,p_szFileName);
}
else
{
*p_ucNumberOfBytesInDest = (unsigned char)(stBmp.stInfoHeader.uwBitCount/8);
*p_ulWidth = stBmp.stInfoHeader.ulWidth;
*p_ulHeight = stBmp.stInfoHeader.ulHeight;
}
FIL_fn_vCloseFileInConcatFile(&hHandleToFile);
}
}
/**************************************************************************/
void FIL_fn_vLoadBMPFromConcatFileWithInvertPicture(FIL_tdxHandleToConcatFile hConcatFile,char *p_szPath,char *p_szFileName,unsigned char **pp_ucDest,unsigned char *p_ucNumberOfBytesInDest,unsigned long *p_ulWidth,unsigned long *p_ulHeight)
{
FIL_fn_vLoadBMPFromConcatFileWithoutInvertPicture(hConcatFile,p_szPath,p_szFileName,pp_ucDest,p_ucNumberOfBytesInDest,p_ulWidth,p_ulHeight);
if (*pp_ucDest!=NULL)
FIL_fn_vInvertBMP(*pp_ucDest,*p_ucNumberOfBytesInDest,*p_ulWidth,*p_ulHeight);
}
/**************************************************************************/
void FIL_fn_vLoadBMPFromConcatFileWithoutInvertPicture(FIL_tdxHandleToConcatFile hConcatFile,char *p_szPath,char *p_szFileName,unsigned char **pp_ucDest,unsigned char *p_ucNumberOfBytesInDest,unsigned long *p_ulWidth,unsigned long *p_ulHeight)
{
FIL_tdxHandleToFileInConcatFile hHandleToFile;
struct FIL_tdstBmp_ stBmp;
*pp_ucDest = NULL;
*p_ucNumberOfBytesInDest = 0;
*p_ulWidth = 0;
*p_ulHeight = 0;
if ((hHandleToFile = FIL_fn_hOpenFileInConcatFile(hConcatFile,p_szPath,p_szFileName))!=NULL)
{
FIL_fn_lReadFileInConcatFile(&stBmp.stFileHeader,sizeof(struct FIL_tdstBmpFileHeader_),1,hHandleToFile);
FIL_fn_lReadFileInConcatFile(&stBmp.stInfoHeader,sizeof(struct FIL_tdstBmpInfoHeader_),1,hHandleToFile);
if ( stBmp.stFileHeader.uwType!=0x4D42 /**** BM ****/
||stBmp.stInfoHeader.uwPlanes!=1
/* CGHT Palette*/
||((stBmp.stInfoHeader.uwBitCount!=24)&&(stBmp.stInfoHeader.uwBitCount!=8))
||stBmp.stInfoHeader.ulCompression!=0
)
{
M_FILInformationErrorWithMessage(E_uwFILBadBmpFormat,p_szFileName);
}
else
{
*p_ucNumberOfBytesInDest = (unsigned char)(stBmp.stInfoHeader.uwBitCount/8);
*p_ulWidth = stBmp.stInfoHeader.ulWidth;
*p_ulHeight = stBmp.stInfoHeader.ulHeight;
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFile , MMG_C_lSubTypeBmpFile , NULL);
stBmp.p_ucBitMap = (unsigned char *)TMP_M_p_Malloc(*p_ulWidth**p_ulHeight**p_ucNumberOfBytesInDest);
*pp_ucDest = stBmp.p_ucBitMap;
FIL_fn_lReadFileInConcatFile(stBmp.p_ucBitMap,*p_ucNumberOfBytesInDest,*p_ulWidth**p_ulHeight,hHandleToFile);
}
FIL_fn_vCloseFileInConcatFile(&hHandleToFile);
}
}
/**************************************************************************/
void FIL_fn_vFreeBMP(unsigned char **pp_ucMemory)
{
if (*pp_ucMemory!=NULL)
TMP_M_Free(*pp_ucMemory);
*pp_ucMemory = NULL;
}
/**************************************************************************/
void FIL_fn_vInvertBMP(unsigned char *p_ucDest,unsigned char ucNumberOfBytesInDest,unsigned long ulWidth,unsigned long ulHeight)
{
unsigned char *p_ucOneLine,*p_ucBlockStart;
unsigned long y;
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFile , MMG_C_lSubTypeBmpFile , NULL);
p_ucOneLine = (unsigned char *)TMP_M_p_Malloc(ulWidth*ucNumberOfBytesInDest);
/* CGHT Palette*/
p_ucBlockStart=p_ucDest;
if(ucNumberOfBytesInDest==1)
{
p_ucBlockStart+=256*sizeof(RGBQUAD);
}
for (y=0;y<ulHeight/2;y++)
{
memcpy(p_ucOneLine,p_ucBlockStart+y*ulWidth*ucNumberOfBytesInDest,ulWidth*ucNumberOfBytesInDest);
memcpy(p_ucBlockStart+y*ulWidth*ucNumberOfBytesInDest,p_ucBlockStart+(ulHeight-1-y)*ulWidth*ucNumberOfBytesInDest,ulWidth*ucNumberOfBytesInDest);
memcpy(p_ucBlockStart+(ulHeight-1-y)*ulWidth*ucNumberOfBytesInDest,p_ucOneLine,ulWidth*ucNumberOfBytesInDest);
}
TMP_M_Free(p_ucOneLine);
}
/**************************************************************************/