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

📄 mmires_anim.cpp

📁 Resource editor base speadrum Chinese mobile
💻 CPP
字号:
// MMIRes_Anim.cpp: implementation of the CMMIRes class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resourceeditor.h"
#include "MMIRes.h"

#include "mmi_anim_def.h"

CString CMMIRes::MakeAnimID(LPCTSTR pszDirName)
{
    _ASSERTE( pszDirName != NULL );

    LPCTSTR pFind = _tcsrchr(pszDirName, _T('\\'));
    if( NULL == pFind )
        pFind = pszDirName;
    else
        pFind++;

    CString strDirName = pFind;
    int nLeft = strDirName.ReverseFind(_T('.'));
    if( nLeft > 0 )
        strDirName = strDirName.Left(nLeft);

    strDirName.MakeUpper();

    return strDirName;    
}

BOOL CMMIRes::AddAnim( LPCTSTR pszID, LPCTSTR pszDirName )
{
    _ASSERTE( pszID != NULL && !AnimIsExist(pszID) );
    _ASSERTE( pszDirName != NULL );
    
	PANIMINFO pAnimInfo = NULL;
	UINT nRGB = 0;
    if(m_mapAnim.GetCount() != 0)
	{
	    POSITION pos = m_mapAnim.GetStartPosition();
	    CString strKey;
	    if(pos != NULL)
		{
		    m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
		    _ASSERTE( pAnimInfo != NULL );			  
		    CBmpProcessor bmpProc;
		    nRGB = bmpProc.GetAnimTransColor(pAnimInfo->pCompressed);
		}
	}

    LPBYTE pAnim = NULL;
    int    nSize = 0;
    int    nNum  = 0;
    if( m_bmpProcessor.CompressMovie(pszDirName, pAnim, nSize, nNum, nRGB) )
    {
        PANIMINFO pAnimInfo = new ANIM_INFO_T;
        if( pAnimInfo == NULL )
        {
            _tcscpy(m_szErrMsg, _T("memory no enough!"));
            m_bmpProcessor.ReleaseCompressedStream(pAnim);
            return FALSE;
        }
        pAnimInfo->pCompressed = pAnim;
        pAnimInfo->nSize       = nSize;
        pAnimInfo->nFrameNum   = nNum;

        m_mapAnim.SetAt(pszID, pAnimInfo);
    
        m_Resource.ToolUsedInfo.nUsedSize += ( sizeof(ANIM_FLAG_T) + sizeof(uint8 *) + 
                                               pAnimInfo->nSize );

        return TRUE;
    }
    else
    {
        _tcscpy(m_szErrMsg, _T("CompressMovie fail!"));
    }

    return FALSE;
}
BOOL CMMIRes::ExportAnim( LPCTSTR pszID, LPCTSTR pszDirName )
{
	PANIMINFO pAnimInfo =NULL;
	VERIFY( m_mapAnim.Lookup(pszID, pAnimInfo) );

	if(m_bmpProcessor.UnCompressMovie(pAnimInfo->pCompressed,pszDirName))
	{
        _tcscpy(m_szErrMsg, _T("UnCompressMovie failed!"));
        return FALSE;
	}
	return TRUE;
	
}
BOOL CMMIRes::DeleteAnim(LPCTSTR pszID)
{
    _ASSERTE( pszID != NULL );

    PANIMINFO pAnimInfo = NULL;
    if( !m_mapAnim.Lookup(pszID, pAnimInfo) )
        return TRUE;

    m_Resource.ToolUsedInfo.nUsedSize -= (sizeof(ANIM_FLAG_T) + sizeof(uint8 *) + pAnimInfo->nSize);

    m_bmpProcessor.ReleaseCompressedStream( pAnimInfo->pCompressed );
    delete pAnimInfo;

    return m_mapAnim.RemoveKey(pszID);
}

BOOL CMMIRes::ReplaceAnim( LPCTSTR pszID, LPCTSTR pszDirName, int bCheckLimit /* = FALSE */,
                           PUINT pOldSize /* = NULL */, PUINT pNewSize /* = NULL */ )
{
    _ASSERTE( pszID != NULL && AnimIsExist(pszID) );
    _ASSERTE( pszDirName != NULL );

	PANIMINFO pAnimInfo = NULL;
	UINT nRGB = 0;
    if(m_mapAnim.GetCount() != 0)
	{
		POSITION pos = m_mapAnim.GetStartPosition();
		CString strKey;
		if(pos != NULL)
		{
			m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
			_ASSERTE( pAnimInfo != NULL );			  
			CBmpProcessor bmpProc;
			nRGB = bmpProc.GetAnimTransColor(pAnimInfo->pCompressed);
		}
	}
    LPBYTE pAnim = NULL;
    int    nSize = 0;
    int    nNum  = 0;
    if( m_bmpProcessor.CompressMovie(pszDirName, pAnim, nSize, nNum, nRGB) )
    {
        PANIMINFO pAnimInfo = NULL;
        VERIFY( m_mapAnim.Lookup(pszID, pAnimInfo) );

        if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
        {
            UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize;
            nMaxSize += ( nSize - pAnimInfo->nSize );
            if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
            {
                _stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
                
                m_bmpProcessor.ReleaseCompressedStream(pAnim);
     
                return FALSE;
            }
        }
        m_Resource.ToolUsedInfo.nUsedSize += ( nSize- pAnimInfo->nSize );

        if( pOldSize != NULL ) *pOldSize = pAnimInfo->nSize;
        if( pNewSize != NULL ) *pNewSize = nSize;

        m_bmpProcessor.ReleaseCompressedStream(pAnimInfo->pCompressed);
        pAnimInfo->pCompressed = pAnim;
        pAnimInfo->nSize       = nSize;
        pAnimInfo->nFrameNum   = nNum;

        return TRUE;
    }
    
    _tcscpy(m_szErrMsg, _T("Compress movie fail!") );

    return FALSE;
}

BOOL CMMIRes::AnimIsExist( LPCTSTR pszID)
{
    _ASSERTE( pszID != NULL );

    PANIMINFO pAnimInfo = NULL;
    return m_mapAnim.Lookup(pszID, pAnimInfo);
}

int CMMIRes::CalcAnimResSize(void)
{
    int nCount = m_mapAnim.GetCount();
   
    int nSize = sizeof(MMI_ANIM_DATA_T);
    nSize    += sizeof(ANIM_FLAG_T) * nCount;
    nSize    += sizeof(uint8 *)     * nCount;

    CString  strKey;
    PANIMINFO pAnimInfo = NULL;
    POSITION pos = m_mapAnim.GetStartPosition();
    while( pos != NULL )
    {
        m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
        _ASSERTE( pAnimInfo != NULL );

        nSize += pAnimInfo->nSize;
    }

    return nSize;
}
BOOL CMMIRes::AnimRecompress(UINT nTransColor /*= 0*/ )
{
    CString  strKey;
    PANIMINFO pAnimInfo = NULL;
    POSITION pos = m_mapAnim.GetStartPosition();
	CBmpProcessor bmpPrc;
	BOOL bRet = TRUE;
    //存放动画的临时文件夹
	_TCHAR szPathTemp[_MAX_PATH];
    ::GetModuleFileName(NULL, szPathTemp, _MAX_PATH);
	LPTSTR pFind = _tcsrchr(szPathTemp, _T('\\'));
	_tcscpy( pFind + 1, _T("AnimTemp") );

    while( pos != NULL )
    {
        m_mapAnim.GetNextAssoc( pos, strKey, pAnimInfo );
        _ASSERTE( pAnimInfo != NULL );
		
        bmpPrc.UnCompressMovie(pAnimInfo->pCompressed,szPathTemp);
		delete []pAnimInfo->pCompressed;
        bmpPrc.CompressMovie(szPathTemp,pAnimInfo->pCompressed,pAnimInfo->nSize,
		pAnimInfo->nFrameNum,nTransColor);

		if(!DeleteDirectory(szPathTemp))
		{
			bRet = FALSE;
			break;
		}
    }
	return bRet;
}

BOOL CMMIRes::DeleteDirectory(LPCTSTR lpszDirName)// DeleteDirectory(_T("c:\\aaa"))
{
    CFileFind tempFind;
    _TCHAR tempFileFind[MAX_PATH] = {0};
     _stprintf(tempFileFind,_T("%s\\*.*"),lpszDirName);
    BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
    while(IsFinded)
    {
        IsFinded=(BOOL)tempFind.FindNextFile();
        if(!tempFind.IsDots())
        {
            _TCHAR foundFileName[MAX_PATH] = {0};
            _tcscpy(foundFileName,tempFind.GetFileName().GetBuffer(MAX_PATH));
            if(tempFind.IsDirectory())
            {
                _TCHAR tempDir[MAX_PATH] = {0};
                _stprintf(tempDir,_T("%s\\%s"),lpszDirName,foundFileName);
                DeleteDirectory(tempDir);
            }
            else
            {
                _TCHAR tempFileName[MAX_PATH] = {0};
                _stprintf(tempFileName,_T("%s\\%s"),lpszDirName,foundFileName);
                DeleteFile(tempFileName);
            }
        }
    }
    tempFind.Close();
    if(!RemoveDirectory(lpszDirName))
    {
        AfxMessageBox(IDS_ERR_DELETE_DIR_FAIL);
        return FALSE;
    }
    return TRUE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -