Files
core/ASCImageStudio3/ASCGraphics/Objects/ASCWinFonts.h

246 lines
5.9 KiB
C++

// FontManager.h : Declaration of the CFontManager
#pragma once
#include "..\Interfaces\IASCWinFonts.h"
#include "Font\WinFont.h"
#include "Font\WinFontStorage.h"
#include "..\Interfaces\BaseThread.h"
#include "../../../Common/OfficeDrawing/File.h"
#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)
#error "Single-threaded COM objects are not properly supported on Windows CE platform, such as the Windows Mobile platforms that do not include full DCOM support. Define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA to force ATL to support creating single-thread COM object's and allow use of it's single-threaded COM object implementations. The threading model in your rgs file was set to 'Free' as that is the only threading model supported in non DCOM Windows CE platforms."
#endif
// CASCWinFonts
[
coclass,
default(IASCWinFonts),
threading(apartment),
vi_progid("AVSOfficeWinFonts.WinFonts"),
progid("AVSOfficeWinFonts.WinFonts.1"),
version(1.0),
uuid("051DCF8B-2932-4f04-A50F-5BDDC1DF3384"),
helpstring("WinFonts Class")
]
class ATL_NO_VTABLE CASCWinFonts : public IASCWinFonts
{
private:
WinFontsStatusStorage m_oSS;
CWinFontsInfoStorage *m_pInfoStorage;
CWinFontsStatusStorage *m_pStatusStorage;
CString m_strInputFontDirectory;
CString m_strDumpFontSelectionFile; // "debug" teamlab server fonts
public:
CASCWinFonts()
{
m_strDumpFontSelectionFile = _T("");
m_strInputFontDirectory = _T("");
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
m_pStatusStorage = NULL;
m_pInfoStorage = NULL;
m_pStatusStorage = new CWinFontsStatusStorage( STATUS_STORAGE_NAME );
do
{
bool bGetMaster = false;
m_pStatusStorage->GetStatus( &bGetMaster, &m_oSS );
if ( STIF_BROKEN == m_oSS.m_sStatus || STIF_ERROR == m_oSS.m_sStatus )
{
m_oSS.m_sStatus = STIF_CREATING;
m_pStatusStorage->WriteStruct( &m_oSS );
//FT_Library pLibrary = NULL;
//CString sXml;
//if( !FT_Init_FreeType( &pLibrary ) )
//{
// sXml = CWinFontList::GetWinFontsXml( pLibrary );
// FT_Done_FreeType( pLibrary );
//}
//m_oSS.m_sStatus = STIF_AVAILABLE;
//WinFontsInfoStorage oInfo;
//BSTR bsXml = sXml.AllocSysString();
//oInfo.GenerateInfo( bsXml );
//LONG64 lLen = oInfo.GetLength();
//oInfo.m_lCount = 1;
//m_oSS.m_lLength = lLen;
FT_Library pLibrary = NULL;
BYTE* pData;
LONG lLen2;
if( !FT_Init_FreeType( &pLibrary ) )
{
if (_T("") == m_strInputFontDirectory)
{
pData = CWinFontList::GetWinFontsData( pLibrary, lLen2 );
}
else
{
CWinFontList oList(pLibrary, m_strInputFontDirectory);
oList.ToBuffer(&pData, & lLen2);
}
FT_Done_FreeType( pLibrary );
}
m_oSS.m_sStatus = STIF_AVAILABLE;
WinFontsInfoStorage oInfo;
oInfo.GenerateInfo( pData, lLen2 );
if (_T("") != m_strDumpFontSelectionFile)
{
CFile oFile;
if (S_OK == oFile.CreateFile(m_strDumpFontSelectionFile))
{
oFile.WriteFile((BYTE*)pData, (DWORD)lLen2);
oFile.CloseFile();
}
}
LONG64 lLen = lLen2;
oInfo.m_lCount = 1;
m_oSS.m_lLength = lLen;
RELEASEOBJECT(m_pInfoStorage);
m_pInfoStorage = new CWinFontsInfoStorage( STATUS_STORAGE_NAME, lLen );
m_pInfoStorage->WriteStruct( &oInfo );
m_pStatusStorage->WriteStruct( &m_oSS );
RELEASEARRAYOBJECTS(pData);
}
else if ( STIF_CREATING == m_oSS.m_sStatus )
{
Sleep ( 100 );
}
else if ( STIF_AVAILABLE == m_oSS.m_sStatus )
{
RELEASEOBJECT(m_pInfoStorage);
m_pInfoStorage = new CWinFontsInfoStorage( STATUS_STORAGE_NAME, m_oSS.m_lLength );
WinFontsInfoStorage oInfo;
m_pInfoStorage->ReadStruct( &oInfo );
}
}
while ( STIF_CREATING == m_oSS.m_sStatus );
return S_OK;
}
void FinalRelease()
{
RELEASEOBJECT(m_pStatusStorage);
RELEASEOBJECT(m_pInfoStorage);
}
void ReInit()
{
FT_Library pLibrary = NULL;
BYTE* pData;
LONG lLen2;
if( !FT_Init_FreeType( &pLibrary ) )
{
if (_T("") == m_strInputFontDirectory)
{
pData = CWinFontList::GetWinFontsData( pLibrary, lLen2 );
}
else
{
CWinFontList oList(pLibrary, m_strInputFontDirectory);
oList.ToBuffer(&pData, &lLen2, m_strInputFontDirectory);
}
FT_Done_FreeType( pLibrary );
}
if (_T("") != m_strDumpFontSelectionFile)
{
CFile oFile;
if (S_OK == oFile.CreateFile(m_strDumpFontSelectionFile))
{
oFile.WriteFile((BYTE*)pData, (DWORD)lLen2);
oFile.CloseFile();
}
}
}
private:
public:
//----- IASCGraphicsBase ----------------------------------------------------------------------------
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
{
CString sParamName = ParamName;
if ( _T("DumpBinaryPath") == sParamName && VT_BSTR == ParamValue.vt )
{
m_strDumpFontSelectionFile = (CString)ParamValue.bstrVal;
ReInit();
}
if ( _T("InputFontsPath") == sParamName && VT_BSTR == ParamValue.vt )
{
m_strInputFontDirectory = (CString)ParamValue.bstrVal;
}
return S_OK;
}
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
{
return S_OK;
}
STDMETHOD(CreateDublicate)(IASCGraphicsBase** ppGraphicsBase)
{
return S_OK;
}
};
class CThreadFonts : public CBaseThread
{
private:
IASCWinFonts* m_pFonts;
public:
CThreadFonts() : CBaseThread(0)
{
m_pFonts = NULL;
StartWork(THREAD_PRIORITY_NORMAL);
}
~CThreadFonts()
{
StopWork();
RELEASEINTERFACE(m_pFonts);
}
protected:
virtual DWORD ThreadProc()
{
CoInitialize(NULL);
CoCreateInstance(__uuidof(CASCWinFonts), NULL, CLSCTX_INPROC, __uuidof(IASCWinFonts), (void**)&m_pFonts);
CoUninitialize();
m_bRunThread = FALSE;
return 0;
}
};