📄 binfilefactory_img.cpp
字号:
// BinFileFactory_Img.cpp: implementation of the CBinFileFactory class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "ResourceEditor.h"
#include "BinFileFactory.h"
#include "MMIRes.h"
#include "BmpProcessor.h"
#include "DirFileInfo.h"
#include "Converter.h"
#include "mmi_image_def.h"
#include "mmi_anim_def.h"
#include <memory>
void CBinFileFactory::CalcImgInfo()
{
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &ImgData = res.mmi_data_table[MMI_RT_IMAGE];
IMG_MAP &imgMap = mmires.m_mapImg;
DWORD dwBase = res.ToolUsedInfo.nStartAddress;
DWORD dwOffset = sizeof(res);
BOOL bIsOffset = res.ToolUsedInfo.bAddrIsOffset;
ImgData.pData = (void *)CalcAddr(dwBase, dwOffset, bIsOffset);
// 保持4字节对齐
_ASSERTE((uint32)ImgData.pData % sizeof(uint32) == 0);
ImgData.uCount = imgMap.GetCount();
ImgData.uSize = 0;
CString strID;
PIMGINFO pImgInfo = NULL;
POSITION pos = imgMap.GetStartPosition();
while( pos != NULL )
{
imgMap.GetNextAssoc( pos, strID, pImgInfo );
ImgData.uSize += ( pImgInfo->nProcSize + sizeof(IMG_FLAG_T) + sizeof(uint32 *) );
ImgData.uSize = Addr4ByteAlign(ImgData.uSize);
}
if( ImgData.uCount > 0 )
{
ImgData.uSize += sizeof(MMI_IMG_DATA_T);
}
m_dwAnimOffset = dwOffset + ImgData.uSize;
m_dwAnimOffset = Addr4ByteAlign(m_dwAnimOffset);
}
BOOL CBinFileFactory::WriteImgInfo( FILE * pFile )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &ImgData = res.mmi_data_table[MMI_RT_IMAGE];
IMG_MAP &imgMap = mmires.m_mapImg;
CDirFileInfo * pInfo = g_theApp.m_pImgInfo;
//@hongliang.xin 2006-9-26
IMG_COMPRESS_MAP &ImgCompress = mmires.m_mapImgCompress;
int nCount = ImgData.uCount;
if( nCount == 0 )
return TRUE;
_ASSERTE(( (uint32)ftell(pFile) == ((uint32)ImgData.pData +g_theApp.prj_arm_addr))||
( (uint32)ftell(pFile) == ((uint32)ImgData.pData +g_theApp.prj_win_addr)));
///////////////////////////////////////////////////////////////////////////////
#define WRITE_FILE(des, st, num, file) \
if( fwrite(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Write file error!")); \
return FALSE; \
}
///////////////////////////////////////////////////////////////////////////////
MMI_IMG_DATA_T mid;
mid.pFlag = (PIMG_FLAG_T)((DWORD)ImgData.pData + sizeof(MMI_IMG_DATA_T));
mid.pImgData = (uint32 *)( (DWORD)ImgData.pData + sizeof(MMI_IMG_DATA_T) +
sizeof(IMG_FLAG_T) * ImgData.uCount );
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
mid.pFlag = (PIMG_FLAG_T)conv.ConvEdn_INT((DWORD)mid.pFlag);
mid.pImgData = (uint32 *)conv.ConvEdn_INT((DWORD)mid.pImgData);
}
WRITE_FILE(&mid, sizeof(mid), 1, pFile);
if( bBigEdn )
{
mid.pFlag = (PIMG_FLAG_T)conv.ConvEdn_INT((DWORD)mid.pFlag);
mid.pImgData = (uint32 *)conv.ConvEdn_INT((DWORD)mid.pImgData);
}
CBmpProcessor bmpProc;
IMG_FLAG_T imgFlag;
CSize sizeImg;
CStringArray arrID;
pInfo->CalcAllLeafID(arrID);
_ASSERTE( nCount == arrID.GetSize() );
_ASSERTE( nCount == imgMap.GetCount() );
int i = 0;
PIMGINFO pImgInfo = NULL;
int nCompress =1;
for( i = 0; i < nCount; ++i )
{
VERIFY( imgMap.Lookup(arrID[i], pImgInfo) );
VERIFY( ImgCompress.Lookup(arrID[i], nCompress) );
memset(&imgFlag,0,sizeof(IMG_FLAG_T));
sizeImg = bmpProc.GetBmpSize(pImgInfo->pOriginal);
if(bBigEdn)
{
imgFlag.nWidth = conv.LitEdnToBigEdn((uint16)sizeImg.cx);
imgFlag.nHeight = conv.LitEdnToBigEdn((uint16)sizeImg.cy);
//imgFlag.nType = IT_BMP_16_565_RLE;
imgFlag.nType = conv.LitEdnToBigEdn((uint16)nCompress);
imgFlag.nSize = conv.ConvEdn_INT(pImgInfo->nProcSize);
}
else
{
imgFlag.nWidth = (uint16)sizeImg.cx;
imgFlag.nHeight = (uint16)sizeImg.cy;
//imgFlag.nType = IT_BMP_16_565_RLE;
imgFlag.nType = nCompress;
imgFlag.nSize = pImgInfo->nProcSize;
}
WRITE_FILE(&imgFlag, sizeof(imgFlag), 1, pFile);
}
uint32 nAddr = (uint32)mid.pImgData + sizeof(uint32 *) * nCount;
nAddr = Addr4ByteAlign(nAddr);
for( i = 0; i < nCount; ++i )
{
if( bBigEdn )
nAddr = conv.ConvEdn_INT(nAddr);
WRITE_FILE(&nAddr, sizeof(nAddr), 1, pFile);
if( bBigEdn )
nAddr = conv.ConvEdn_INT(nAddr);
VERIFY( imgMap.Lookup(arrID[i], pImgInfo) );
nAddr += pImgInfo->nProcSize;
nAddr = Addr4ByteAlign(nAddr);
}
BYTE arrAlign[] = { 0xad, 0xad, 0xad, 0xad };
for( i = 0; i < nCount; ++i )
{
VERIFY( imgMap.Lookup(arrID[i], pImgInfo) );
VERIFY( ImgCompress.Lookup(arrID[i], nCompress) );
if(bBigEdn)
bmpProc.BmpConvertToBigEndian(pImgInfo->pProcessed,pImgInfo->nProcSize,nCompress);
WRITE_FILE(pImgInfo->pProcessed, pImgInfo->nProcSize, 1, pFile);
if(bBigEdn)
bmpProc.BmpConvertToLitEndian(pImgInfo->pProcessed,pImgInfo->nProcSize,nCompress);
nAddr = Addr4ByteAlign(pImgInfo->nProcSize);
_ASSERTE(nAddr - pImgInfo->nProcSize < 4);
fwrite(arrAlign, nAddr - pImgInfo->nProcSize, 1, pFile);
}
return TRUE;
}
BOOL CBinFileFactory::ReadImgInfo( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &ImgData = res.mmi_data_table[MMI_RT_IMAGE];
IMG_MAP &imgMap = mmires.m_mapImg;
CDirFileInfo * pInfo = g_theApp.m_pImgInfo;
//@hongliang.xin 2006-9-26
IMG_COMPRESS_MAP &ImgCompress = mmires.m_mapImgCompress;
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
ImgData.uCount = conv.ConvEdn_INT(ImgData.uCount);
ImgData.uSize = conv.ConvEdn_INT(ImgData.uSize);
}
int nCount = ImgData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(image info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
SEEK_FILE( pFile, sizeof(MMI_IMG_DATA_T) );
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == imgMap.GetCount() );
std::auto_ptr<IMG_FLAG_T>ImgFlagBuf(new IMG_FLAG_T[nCount]);
PIMG_FLAG_T pImgFlag = ImgFlagBuf.get();
if( pImgFlag == NULL )
{
_ASSERTE(0);
return FALSE;
}
READ_FILE(pImgFlag, sizeof(IMG_FLAG_T) * nCount, 1, pFile);
SEEK_FILE( pFile, sizeof(uint32) * nCount );
CBmpProcessor bmpProc;
PIMGINFO pImgInfo = NULL;
LPBYTE pData = NULL;
int nSize = 0;
int nAlign = 0;
for( i = 0; i < nCount; ++i )
{
pImgInfo = new IMG_INFO_T;
if( NULL == pImgInfo )
return FALSE;
memset(pImgInfo, 0, sizeof(IMG_INFO_T));
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
return FALSE;
_stprintf(pNode->szID, _T("BMP_%03d"), i);
_stprintf(pNode->szName, _T("%03d.bmp"), i);
pNode->nWidth = pImgFlag[i].nWidth;
pNode->nHeight = pImgFlag[i].nHeight;
imgMap.SetAt(pNode->szID, pImgInfo );
//@hongliang.xin 2006-9-26 保存压缩信息
ImgCompress.SetAt(pNode->szID,pImgFlag[i].nType);
pInfo->AddChild(pRoot, pNode);
}
else
{
imgMap.SetAt( arrID[i], pImgInfo );
//@hongliang.xin 2006-9-26 保存压缩信息
ImgCompress.SetAt(arrID[i],pImgFlag[i].nType);
}
nSize = pImgFlag[i].nSize;
pImgInfo->nProcSize = nSize;
pData = (LPBYTE)malloc( nSize );
if( NULL == pData )
return FALSE;
READ_FILE(pData, nSize, 1, pFile);
nAlign = Addr4ByteAlign(nSize);
fseek(pFile, nAlign - nSize, SEEK_CUR);
// if( bBigEdn && g_theApp.m_MMIRes.m_iVersion>=4 )
// bmpProc.BmpConvertToLitEndian(pData,nSize,pImgFlag[i].nType);
pImgInfo->pProcessed = pData;
//@hongliang.xin 2006-9-25 处理压缩,若压缩则解压缩
if(pImgFlag[i].nType == IT_BMP_16_565_RAW)
{
pImgInfo->pOriginal = pData;
}
else
{
if(!bmpProc.UnCompressBmp(pData, pImgInfo->pOriginal, nSize))
{
delete []pData;
return FALSE;
}
}
}
return TRUE;
}
BOOL CBinFileFactory::ReadImgInfo_v5( FILE * pFile, BOOL bBuildInfo /* = FALSE */ )
{
_ASSERTE( pFile != NULL );
CMMIRes &mmires = g_theApp.m_MMIRes;
MMI_RESOURCE_T &res = mmires.m_Resource;
MMI_RES_DATA_T &ImgData = res.mmi_data_table[MMI_RT_IMAGE];
IMG_MAP &imgMap = mmires.m_mapImg;
CDirFileInfo * pInfo = g_theApp.m_pImgInfo;
//@hongliang.xin 2006-9-26
IMG_COMPRESS_MAP &ImgCompress = mmires.m_mapImgCompress;
const BOOL bBigEdn = res.ToolUsedInfo.bBigEndian;
CConverter conv;
if( bBigEdn )
{
ImgData.uCount = conv.ConvEdn_INT(ImgData.uCount);
ImgData.uSize = conv.ConvEdn_INT(ImgData.uSize);
}
int nCount = ImgData.uCount;
if( nCount == 0 )
return TRUE;
///////////////////////////////////////////////////////////////////////////////
#define READ_FILE(des, st, num, file) \
if( fread(des, st, num, file) != num ) \
{ \
_ASSERTE(0); \
_tcscpy(m_szErrMsg, _T("Read file(image info) error!")); \
return FALSE; \
}
#define SEEK_FILE(pfile, st) \
if( fseek(pfile,st, SEEK_CUR) != 0 ) \
{ _ASSERTE(0); return FALSE; }
///////////////////////////////////////////////////////////////////////////////
SEEK_FILE( pFile, sizeof(MMI_IMG_DATA_T) );
CStringArray arrID;
pInfo->CalcAllLeafID( arrID );
int i = 0;
_ASSERTE( 0 == imgMap.GetCount() );
std::auto_ptr<IMG_FLAG_T>ImgFlagBuf(new IMG_FLAG_T[nCount]);
PIMG_FLAG_T pImgFlag = ImgFlagBuf.get();
if( pImgFlag == NULL )
{
_ASSERTE(0);
return FALSE;
}
READ_FILE(pImgFlag, sizeof(IMG_FLAG_T) * nCount, 1, pFile);
SEEK_FILE( pFile, sizeof(uint32) * nCount );
CBmpProcessor bmpProc;
PIMGINFO pImgInfo = NULL;
LPBYTE pData = NULL;
int nSize = 0;
int nAlign = 0;
for( i = 0; i < nCount; ++i )
{
pImgInfo = new IMG_INFO_T;
if( NULL == pImgInfo )
return FALSE;
//转换ImagFlag
if(bBigEdn)
{
pImgFlag[i].nWidth = conv.BigEdnToLitEdn(pImgFlag[i].nWidth);
pImgFlag[i].nHeight = conv.BigEdnToLitEdn(pImgFlag[i].nHeight);
pImgFlag[i].nType = conv.BigEdnToLitEdn(pImgFlag[i].nType);
pImgFlag[i].nOtherInfo = conv.BigEdnToLitEdn(pImgFlag[i].nOtherInfo);
pImgFlag[i].nSize = conv.ConvEdn_INT(pImgFlag[i].nSize);
}
memset(pImgInfo, 0, sizeof(IMG_INFO_T));
if( bBuildInfo )
{
CDirFileNode * pRoot = (CDirFileNode *)pInfo->GetRoot();
CDirFileNode * pNode = (CDirFileNode *)pInfo->MallocNode();
if( NULL == pNode )
return FALSE;
_stprintf(pNode->szID, _T("BMP_%03d"), i);
_stprintf(pNode->szName, _T("%03d.bmp"), i);
pNode->nWidth = pImgFlag[i].nWidth;
pNode->nHeight = pImgFlag[i].nHeight;
imgMap.SetAt(pNode->szID, pImgInfo );
//@hongliang.xin 2006-9-26 保存压缩信息
ImgCompress.SetAt(pNode->szID,pImgFlag[i].nType);
pInfo->AddChild(pRoot, pNode);
}
else
{
imgMap.SetAt( arrID[i], pImgInfo );
//@hongliang.xin 2006-9-26 保存压缩信息
ImgCompress.SetAt(arrID[i],pImgFlag[i].nType);
}
nSize = pImgFlag[i].nSize;
pImgInfo->nProcSize = nSize;
pData = (LPBYTE)malloc( nSize );
if( NULL == pData )
return FALSE;
READ_FILE(pData, nSize, 1, pFile);
nAlign = Addr4ByteAlign(nSize);
fseek(pFile, nAlign - nSize, SEEK_CUR);
if( bBigEdn && g_theApp.m_MMIRes.m_iVersion>=6 )
bmpProc.BmpConvertToLitEndian(pData,nSize,pImgFlag[i].nType);
pImgInfo->pProcessed = pData;
//@hongliang.xin 2006-9-25 处理压缩,若压缩则解压缩
if(pImgFlag[i].nType == IT_BMP_16_565_RAW)
{
pImgInfo->pOriginal = pData;
}
else
{
if(!bmpProc.UnCompressBmp(pData, pImgInfo->pOriginal, nSize))
{
delete []pData;
return FALSE;
}
}
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -