Commit e7a531cd authored by Oleg.Korshul's avatar Oleg.Korshul Committed by Alexander Trofimov

новая версия

git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@61555 954022d7-b5bf-4e40-9824-e11837661b57
parent 2ebe9701
...@@ -1258,13 +1258,36 @@ void CFontList::LoadFromArrayFiles(CArray<std::wstring>& oArray) ...@@ -1258,13 +1258,36 @@ void CFontList::LoadFromArrayFiles(CArray<std::wstring>& oArray)
pParams[2].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY; pParams[2].tag = FT_PARAM_TAG_IGNORE_PREFERRED_FAMILY;
pParams[2].data = NULL; pParams[2].data = NULL;
pParams[3].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY; pParams[3].tag = FT_PARAM_TAG_IGNORE_PREFERRED_SUBFAMILY;
pParams[3].data = NULL; pParams[3].data = NULL;
// определяем размер буфера, чтобы не выделять много кусков, а обойтись одним
int nMaxFontSize = 0;
for (int nIndex = 0; nIndex < nCount; ++nIndex)
{
NSFile::CFileBinary oFile;
if (oFile.OpenFile(oArray[nIndex]))
{
int nSizeTmp = (int)oFile.GetFileSize();
if (nSizeTmp > 100000000)
{
// такие огромные шрифты не учитываем
oArray.RemoveAt(nIndex);
nIndex--;
nCount--;
}
if (nMaxFontSize < nSizeTmp)
nMaxFontSize = nSizeTmp;
}
}
BYTE* pDataFontFile = new BYTE[nMaxFontSize];
for (int nIndex = 0; nIndex < nCount; ++nIndex) for (int nIndex = 0; nIndex < nCount; ++nIndex)
{ {
// open file // open file
CFontStream oStream; CFontStream oStream;
if (!oStream.CreateFromFile(oArray[nIndex])) if (!oStream.CreateFromFile(oArray[nIndex], pDataFontFile))
continue; continue;
FT_Open_Args oOpenArgs; FT_Open_Args oOpenArgs;
...@@ -1464,6 +1487,8 @@ void CFontList::LoadFromArrayFiles(CArray<std::wstring>& oArray) ...@@ -1464,6 +1487,8 @@ void CFontList::LoadFromArrayFiles(CArray<std::wstring>& oArray)
FT_Done_Face( pFace ); FT_Done_Face( pFace );
} }
} }
RELEASEARRAYOBJECTS(pDataFontFile);
::free( pParams ); ::free( pParams );
FT_Done_FreeType(pLibrary); FT_Done_FreeType(pLibrary);
......
...@@ -9,10 +9,12 @@ CFontStream::CFontStream() ...@@ -9,10 +9,12 @@ CFontStream::CFontStream()
m_pData = NULL; m_pData = NULL;
m_lSize = 0; m_lSize = 0;
m_lRef = 1; m_lRef = 1;
m_bIsAttach = false;
} }
CFontStream::~CFontStream() CFontStream::~CFontStream()
{ {
RELEASEARRAYOBJECTS(m_pData); if (!m_bIsAttach)
RELEASEARRAYOBJECTS(m_pData);
} }
int CFontStream::AddRef() int CFontStream::AddRef()
...@@ -28,14 +30,21 @@ int CFontStream::Release() ...@@ -28,14 +30,21 @@ int CFontStream::Release()
return ret; return ret;
} }
INT CFontStream::CreateFromFile(const std::wstring& strFileName) INT CFontStream::CreateFromFile(const std::wstring& strFileName, BYTE* pDataUse)
{ {
NSFile::CFileBinary oFile; NSFile::CFileBinary oFile;
if (!oFile.OpenFile(strFileName)) if (!oFile.OpenFile(strFileName))
return FALSE; return FALSE;
m_lSize = oFile.GetFileSize(); m_lSize = oFile.GetFileSize();
m_pData = new BYTE[m_lSize];
if (NULL == pDataUse)
m_pData = new BYTE[m_lSize];
else
{
m_bIsAttach = true;
m_pData = pDataUse;
}
DWORD dwRead = 0; DWORD dwRead = 0;
DWORD dwNeedRead = (DWORD)m_lSize; DWORD dwNeedRead = (DWORD)m_lSize;
...@@ -43,7 +52,9 @@ INT CFontStream::CreateFromFile(const std::wstring& strFileName) ...@@ -43,7 +52,9 @@ INT CFontStream::CreateFromFile(const std::wstring& strFileName)
if (dwNeedRead != dwRead) if (dwNeedRead != dwRead)
{ {
RELEASEARRAYOBJECTS(m_pData); if (!m_bIsAttach)
RELEASEARRAYOBJECTS(m_pData);
m_lSize = 0; m_lSize = 0;
return FALSE; return FALSE;
} }
......
...@@ -14,6 +14,7 @@ private: ...@@ -14,6 +14,7 @@ private:
public: public:
BYTE* m_pData; BYTE* m_pData;
LONG m_lSize; LONG m_lSize;
bool m_bIsAttach;
public: public:
CFontStream(); CFontStream();
...@@ -24,7 +25,7 @@ public: ...@@ -24,7 +25,7 @@ public:
public: public:
virtual INT CreateFromFile(const std::wstring& strFileName); virtual INT CreateFromFile(const std::wstring& strFileName, BYTE* pDataUse = NULL);
}; };
class CApplicationFontStreams class CApplicationFontStreams
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment