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

📄 mmires_font.cpp

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

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

BOOL CMMIRes::AddFont( LPCTSTR pszID, int nType, CStringArray & arrFileName )
{
    _ASSERTE( pszID != NULL );
    _ASSERTE( arrFileName.GetSize() == 2 );
    if( FontIsExist(pszID) )
    {
        _stprintf(m_szErrMsg, _T("The ID '%s' alread exist!"), pszID );
        return FALSE;
    }

    PGUI_FONT_INFO_T pFontInfo = new GUI_FONT_INFO_T;
    if( NULL == pFontInfo )
    {
        return FALSE;
    }

    memset(pFontInfo, 0, sizeof(GUI_FONT_INFO_T));

    pFontInfo->type = /*(GUI_FONT_T)*/nType;
    VERIFY( LoadFontLib(arrFileName[0], pFontInfo->pascii_ptr, pFontInfo->nascii_db_size) );
    if( !arrFileName[1].IsEmpty() )
    {
        VERIFY( LoadFontLib(arrFileName[1], pFontInfo->gb_database_ptr, pFontInfo->ngb_db_size) );
    }
    else
    {
        pFontInfo->gb_database_ptr = pFontInfo->pascii_ptr;
        pFontInfo->ngb_db_size     = pFontInfo->nascii_db_size;
    }

    m_mapFont.SetAt( pszID, pFontInfo );

    m_Resource.ToolUsedInfo.nUsedSize += ( sizeof(GUI_FONT_INFO_T) + pFontInfo->nascii_db_size +   
                                               pFontInfo->ngb_db_size );

    return  TRUE;
}

BOOL CMMIRes::DeleteFont( LPCTSTR pszID )
{
    PGUI_FONT_INFO_T pFontInfo = NULL;
    if( m_mapFont.Lookup(pszID, pFontInfo) )
    {
        m_Resource.ToolUsedInfo.nUsedSize -= ( sizeof(GUI_FONT_INFO_T) + pFontInfo->nascii_db_size +   
                                               pFontInfo->ngb_db_size );

        if( pFontInfo->gb_database_ptr != pFontInfo->pascii_ptr )
        {
            delete []pFontInfo->gb_database_ptr;
        }

        delete []pFontInfo->pascii_ptr;
        delete pFontInfo;

        m_mapFont.RemoveKey(pszID);
    }

    return  TRUE;
}

BOOL CMMIRes::ReplaceFont( LPCTSTR pszID, CStringArray & arrFileName, BOOL bCheckLimit /* = FALSE*/ )
{
    PGUI_FONT_INFO_T pFontInfo = NULL;
    if( m_mapFont.Lookup(pszID, pFontInfo) )
    {
        LPBYTE pAscii    = NULL;
        DWORD  dwAscii   = 0;
        LPBYTE pChinese  = NULL;
        DWORD  dwChinese = 0;

        VERIFY( LoadFontLib(arrFileName[0], pAscii, dwAscii) );
        if( !arrFileName[1].IsEmpty() )
        {
            VERIFY( LoadFontLib(arrFileName[1], pChinese, dwChinese) );
        }

        int nNewSize = dwAscii + dwChinese;
        int nOldSize = pFontInfo->nascii_db_size;
        if( pFontInfo->gb_database_ptr != pFontInfo->pascii_ptr )
            nOldSize += pFontInfo->ngb_db_size;

        if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
        {
            UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize;
            nMaxSize += ( nNewSize - nOldSize );
            if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
            {
                _stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
                
                delete []pAscii;
                delete []pChinese;

                return FALSE;
            }
        }

        m_Resource.ToolUsedInfo.nUsedSize += (nNewSize - nOldSize);

        if( pFontInfo->gb_database_ptr != pFontInfo->pascii_ptr )
        {
            delete []pFontInfo->gb_database_ptr;
        }

        delete []pFontInfo->pascii_ptr;        
        
        pFontInfo->pascii_ptr      = pAscii;
        pFontInfo->nascii_db_size  = dwAscii;

        if( !arrFileName[1].IsEmpty() )
        {
            pFontInfo->gb_database_ptr = pChinese;
            pFontInfo->ngb_db_size     = dwChinese;
        }
        else
        {
            pFontInfo->gb_database_ptr = pFontInfo->pascii_ptr;
            pFontInfo->ngb_db_size     = pFontInfo->nascii_db_size;
        }
    }

    return  TRUE;
}

BOOL CMMIRes::FontIsExist( LPCTSTR pszID )
{
    PGUI_FONT_INFO_T pFontInfo = NULL;
    return m_mapFont.Lookup(pszID, pFontInfo);
}

int CMMIRes::CalcFontResSize(void)
{
    return 0;
}

BOOL CMMIRes::LoadFontLib(LPCTSTR pszFileName, LPBYTE &pContent, DWORD &dwSize)
{
    _ASSERTE( pszFileName != NULL );

    pContent = NULL;
    dwSize   = 0;

    HANDLE hFile = ::CreateFile( pszFileName, GENERIC_READ, FILE_SHARE_READ,
                                 NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
                                 NULL );
    if( hFile == INVALID_HANDLE_VALUE )
        return FALSE;

    dwSize = ::GetFileSize( hFile, NULL );
    
    pContent = new BYTE[dwSize];
    if( NULL == pContent )
    {
        ::CloseHandle(hFile);
        return NULL;
    }

    DWORD dwRead = 0;
    if( ReadFile(hFile, pContent, dwSize, &dwRead, NULL) )
    {
        _ASSERTE( dwSize == dwRead );

        ::CloseHandle(hFile);
        return TRUE;
    }
   
    delete []pContent;
    ::CloseHandle(hFile);

    return FALSE;
}

BOOL CMMIRes::ExportFont( LPCTSTR pszID,LPCTSTR pszDirName)
{
    _ASSERTE( pszID != NULL && pszDirName!=NULL);

    PGUI_FONT_INFO_T pFontInfo;

	VERIFY( m_mapFont.Lookup(pszID,pFontInfo));


    CString strDirName = pszDirName;
	strDirName += "\\";
	CString strFileName = strDirName+pszID+".lib";
	CString strFileAsciiName = strDirName+pszID+"_ASCII" +".lib";


	DWORD dwWritten=0;
    HANDLE fh;
	fh = CreateFile(strFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

	if (fh == INVALID_HANDLE_VALUE) 
		return FALSE; 
	WriteFile(fh, pFontInfo->gb_database_ptr, pFontInfo->ngb_db_size, &dwWritten, NULL); 
	CloseHandle(fh); 

	dwWritten=0;
	fh = CreateFile(strFileAsciiName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
		FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

	if (fh == INVALID_HANDLE_VALUE) 
		return FALSE; 
	WriteFile(fh, pFontInfo->pascii_ptr, pFontInfo->nascii_db_size, &dwWritten, NULL); 
	CloseHandle(fh); 

	return TRUE;
	
}

BOOL CMMIRes::AddFontEx( LPCTSTR pszID, int nType, CStringArray & arrFileName )
{
    _ASSERTE( pszID != NULL );
    if( FontExIsExist(pszID) )
    {
        _stprintf(m_szErrMsg, _T("The ID '%s' alread exist!"), pszID );
        return FALSE;
    }

    PGUI_FONT_INFO_EX_T pFontInfo = new GUI_FONT_INFO_EX_T;
    if( NULL == pFontInfo )
    {
        return FALSE;
    }

    memset(pFontInfo, 0, sizeof(GUI_FONT_INFO_EX_T));

    pFontInfo->type = /*(GUI_FONT_T)*/nType;
    PGUI_FONT_DB_TABLE_T pDbtt   = (PGUI_FONT_DB_TABLE_T)new GUI_FONT_DB_TABLE_T;
	if(pDbtt == NULL)
		return FALSE;

	//pFontInfo->pDbtt = pDbtt;

	int nSize = 0;

	for(int i = 0;i<arrFileName.GetSize();i++)
	{
		if(!arrFileName[i].IsEmpty())
		{
			if(!LoadFontLib(arrFileName[i], pDbtt->db[i].pdb,
				pDbtt->db[i].db_size) )
				return FALSE;
			nSize += pDbtt->db[i].db_size;
		}
		else
		{
			pDbtt->db[i].pdb = pDbtt->db[0].pdb;
			pDbtt->db[i].db_size = pDbtt->db[0].db_size;
		}
		
	}
	pFontInfo->pDbtt = (uint8 *)pDbtt;
    m_mapFontEx.SetAt( pszID, pFontInfo );

	m_Resource.ToolUsedInfo.nUsedSize += (sizeof(GUI_FONT_INFO_EX_T) +
		sizeof(GUI_FONT_DB_T)*g_theApp.m_nUsedLangNum  + nSize);



    return  TRUE;
}

BOOL CMMIRes::DeleteFontEx( LPCTSTR pszID )
{
    PGUI_FONT_INFO_EX_T pFontInfo = NULL;
    if( m_mapFontEx.Lookup(pszID, pFontInfo) )
    {
        m_Resource.ToolUsedInfo.nUsedSize -=  (sizeof(GUI_FONT_INFO_EX_T)
			+sizeof(GUI_FONT_DB_T)*g_theApp.m_nUsedLangNum); 
		PGUI_FONT_DB_T pDBT = (PGUI_FONT_DB_T)(pFontInfo->pDbtt);
		PGUI_FONT_DB_T pDBT0 = pDBT;
		pDBT++;
		int i=1;
		while(pDBT->pdb!=NULL && i< g_theApp.m_nUsedLangNum)
		{
			m_Resource.ToolUsedInfo.nUsedSize -= pDBT->db_size;
            if( pDBT->pdb != pDBT0->pdb)
			{
				delete []pDBT->pdb;
			}
			i++;
			pDBT++;
		}	

		m_Resource.ToolUsedInfo.nUsedSize -= pDBT0->db_size;		
        delete []pDBT0->pdb;
        delete pFontInfo;

        m_mapFontEx.RemoveKey(pszID);

		return  TRUE;
    }
	else
		return FALSE;


}

BOOL CMMIRes::ReplaceFontEx( LPCTSTR pszID, CStringArray & arrFileName, BOOL bCheckLimit /* = FALSE*/ )
{
    PGUI_FONT_INFO_EX_T pFontInfo = NULL;
	if(!m_mapFontEx.Lookup(pszID, pFontInfo) )
		return FALSE;

    int nNewSize  = 0;
    int nOldSize  = 0;
	
    LPBYTE pDB    = NULL;
	DWORD  dwSize = 0;

	LPBYTE pDBNew0    = NULL;
	DWORD  dwSizeNew0 = 0;
	LPBYTE pDBOld0    = NULL;
	DWORD  dwSizeOld0 = 0;



	PGUI_FONT_DB_TABLE_T pDbtt   = (PGUI_FONT_DB_TABLE_T)new GUI_FONT_DB_TABLE_T;
	if(pDbtt == NULL)
		return FALSE;
    memset(pDbtt, 0, sizeof(GUI_FONT_DB_TABLE_T));

    pDBOld0    = ((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[0].pdb;
    dwSizeOld0 = ((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[0].db_size;
	nOldSize += dwSizeOld0;

	if(!arrFileName[0].IsEmpty())
	{
		VERIFY( LoadFontLib(arrFileName[0], pDBNew0, dwSizeNew0) );
		nNewSize += dwSizeNew0;
		pDbtt->db[0].pdb = pDBNew0;
		pDbtt->db[0].db_size = dwSizeNew0;
	}
	else
	{
		nNewSize += dwSizeOld0;
		pDB = new BYTE[dwSizeOld0];
		if(pDB == NULL)
			return FALSE;
		memcpy(pDB,pDBOld0,dwSizeOld0);

		pDbtt->db[0].pdb = pDB;
		pDbtt->db[0].db_size = dwSizeOld0;
	}
    int i;
    for(i =1;i<arrFileName.GetSize();i++)
	{
		if(!arrFileName[i].IsEmpty())
		{
			VERIFY( LoadFontLib(arrFileName[i], pDB, dwSize) );
			nNewSize += dwSize;
			pDbtt->db[i].pdb = pDB;
			pDbtt->db[i].db_size = dwSize;
		}
		else 
		{
			if(((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[i].pdb != pDBOld0)
			{
				dwSize = ((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[i].db_size;
				pDB = (PBYTE)new BYTE[dwSize];
				if(pDB == NULL)
					return FALSE;
				memcpy(pDB,((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[i].pdb,dwSize);

				pDbtt->db[i].pdb = pDB;
				pDbtt->db[i].db_size = dwSize;
				nNewSize += dwSize;		
			}
			else
			{
				pDbtt->db[i].pdb = pDbtt->db[0].pdb;
				pDbtt->db[i].db_size = pDbtt->db[0].db_size;
			}
		}

		if(((PGUI_FONT_DB_TABLE_T)(pFontInfo->pDbtt))->db[i].pdb != pDBOld0)
			nOldSize += pDbtt->db[i].db_size;
		
	}


    if( bCheckLimit && m_Resource.ToolUsedInfo.nMaxLimitSize > 0 )
    {
        UINT nMaxSize = m_Resource.ToolUsedInfo.nUsedSize;
        nMaxSize += ( nNewSize - nOldSize );
        if( nMaxSize > m_Resource.ToolUsedInfo.nMaxLimitSize )
        {
            _stprintf(m_szErrMsg, _T("Exceed the limit size %d!"), m_Resource.ToolUsedInfo.nMaxLimitSize );
            
            for(i=arrFileName.GetSize()-1;i>=0;i--)
			{
				if((i!=0 && pDbtt->db[i].pdb != pDbtt->db[0].pdb) || i == 0)
					delete[] pDbtt->db[i].pdb;
			}

            return FALSE;
        }
    }

    m_Resource.ToolUsedInfo.nUsedSize += (nNewSize - nOldSize);
    PGUI_FONT_DB_T pDBT,pDBT0;
	pDBT = pDBT0 = (PGUI_FONT_DB_T)pFontInfo->pDbtt;

	for(i=arrFileName.GetSize()-1;i>=0;i--)
	{
		if((i!=0 && pDBT->pdb !=pDBT0->pdb) || i == 0)
			delete[] pDBT->pdb;
		pDBT++;
	}
	pFontInfo->pDbtt = (uint8 *)pDbtt;

    return  TRUE;
}

BOOL CMMIRes::FontExIsExist( LPCTSTR pszID )
{
    PGUI_FONT_INFO_EX_T pFontInfo = NULL;
    return m_mapFontEx.Lookup(pszID, pFontInfo);
}


BOOL CMMIRes::ExportFontEx( LPCTSTR pszID,LPCTSTR pszDirName)
{
    _ASSERTE( pszID != NULL && pszDirName!=NULL);

    PGUI_FONT_INFO_EX_T pFontInfo;

	VERIFY( m_mapFontEx.Lookup(pszID,pFontInfo));


    CString strDirName = pszDirName;
	strDirName += "\\";
    CString strFileName;

	PGUI_FONT_DB_T pDBT,pDBT0;

	pDBT =(PGUI_FONT_DB_T) (pFontInfo->pDbtt);
	pDBT0 = pDBT;
	int i=1;
	
	while(pDBT->pdb != NULL && i<= g_theApp.m_nUsedLangNum)
	{
		if( i == 1 || (i !=1 && pDBT->pdb != pDBT0->pdb))
		{
			strFileName.Format(_T("%s\\%s_LANG%d.lib"),pszDirName,pszID,i);
			DWORD dwWritten=0;
			HANDLE fh;
			fh = CreateFile(strFileName, GENERIC_WRITE,0, NULL, CREATE_ALWAYS, 
				FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); 

			if (fh == INVALID_HANDLE_VALUE) 
				return FALSE; 
			WriteFile(fh, pDBT->pdb, pDBT->db_size, &dwWritten, NULL); 
			CloseHandle(fh); 
		}
		i++;
		pDBT++;
	}

	return TRUE;
	
}

⌨️ 快捷键说明

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