?? mmires_font.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 + -