⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binfilefactory_img.cpp

📁 Resource editor base speadrum Chinese mobile
💻 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 + -