mirror of
https://github.com/ONLYOFFICE/core.git
synced 2026-04-07 13:55:33 +08:00
2302 lines
59 KiB
C++
2302 lines
59 KiB
C++
// FontManager.h : Declaration of the CFontManager
|
|
|
|
#pragma once
|
|
#include "../Interfaces/IAVSFontManager.h"
|
|
#include "../Interfaces/IAVSGraphicsPath.h"
|
|
#include "../Interfaces/IAVSWinFonts.h"
|
|
#include "../Objects/AVSWinFonts.h"
|
|
|
|
#include "Font/FontConsts.h"
|
|
#include "Font/WinFont.h"
|
|
#include "Font/FontErrors.h"
|
|
#include "Font/FontUtils.h"
|
|
|
|
#include "Font/FontEngine.h"
|
|
#include "Font/FT_Font.h"
|
|
#include "Font/FontPath.h"
|
|
#include "Font/GlyphString.h"
|
|
#include "Font/FontFile.h"
|
|
|
|
#include "Font/WinFontStorage.h"
|
|
|
|
#include "AVSGlyphImage.h"
|
|
#include "AVSGraphicsPath.h"
|
|
|
|
#include "TimeMeasurer.h"
|
|
#include "../Interfaces/XmlUtils.h"
|
|
#include "../../../AVSOfficeStudio/Common/OfficeDrawing/File.h"
|
|
|
|
#include FT_ADVANCES_H
|
|
#include FT_GLYPH_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
|
|
|
|
// CFontManager
|
|
|
|
[
|
|
coclass,
|
|
default(IAVSFontManager),
|
|
threading(apartment),
|
|
vi_progid("AVSOfficeFontManager.FontManager"),
|
|
progid("AVSOfficeFontManager.FontManager.1"),
|
|
version(1.0),
|
|
uuid("0FF37CE6-DD3C-488F-8319-13D9E392F1D8"),
|
|
helpstring("FontManager Class")
|
|
]
|
|
class ATL_NO_VTABLE CAVSFontManager :
|
|
public IAVSFontManager, public IAVSFontManager2
|
|
{
|
|
friend class CGraphics;
|
|
public:
|
|
|
|
private:
|
|
|
|
long m_lUnit;
|
|
|
|
CGlyphString m_oGlyphString; // Äëÿ ðàáîòû ñî ñòðîêîé
|
|
|
|
CFontEngine *m_pFontEngine; // Êëàññ äëÿ ðàáîòû ñî øðèôòàìè (óñòàíîâëåííûå øðèôòû, êýø øðèôòîâ è ò.ä.)
|
|
CFont *m_pFont; // Òåêóùèé øðèôò
|
|
|
|
BOOL m_bStringGID; //  ñòðîêàõ LoadString: FALSE - þíèêîäíûå çíà÷åíèå, TRUE - íîìåðà ãëèôîâ
|
|
BOOL m_bUseDefaultFont; // Èñïîëüçîâàòü ëè ñòàíäàðòíûé øðèôò ïðè ðèñîâàíèè íåäîñòàþùèõ â øðèôòå ñèìâîëîâ
|
|
|
|
double m_dCharSpacing; // Ìåæñèìâîëüíûé èíòåðâàë (äîáàâëÿåòñÿ ïîñëå êàæäîãî ñèìâîëà, âêëþ÷àÿ ïîñëåäíèé ñèìâîë)
|
|
|
|
class CMatrix
|
|
{
|
|
public:
|
|
|
|
CMatrix()
|
|
{
|
|
Reset();
|
|
}
|
|
~CMatrix()
|
|
{
|
|
}
|
|
|
|
void Reset()
|
|
{
|
|
m_dA = 1; m_dB = 0;
|
|
m_dC = 0; m_dD = 1;
|
|
m_dE = 0; m_dF = 0;
|
|
}
|
|
|
|
bool SetTransform(double dA, double dB, double dC, double dD, double dE, double dF)
|
|
{
|
|
if ( NotEqual( m_dA, dA ) || NotEqual( m_dB, dB ) || NotEqual( m_dC, dC ) ||
|
|
NotEqual( m_dD, dD ) || NotEqual( m_dE, dE ) || NotEqual( m_dF, dF ) )
|
|
{
|
|
m_dA = dA; m_dB = dB;
|
|
m_dC = dC; m_dD = dD;
|
|
m_dE = dE; m_dF = dF;
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private:
|
|
|
|
inline bool NotEqual(double dA, double dB) const
|
|
{
|
|
double dDiff = ( dA - dB );
|
|
dDiff = dDiff >= 0 ? dDiff : -dDiff;
|
|
if ( dDiff <= 0.001 )
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
public:
|
|
|
|
double m_dA;
|
|
double m_dB;
|
|
double m_dC;
|
|
double m_dD;
|
|
double m_dE;
|
|
double m_dF;
|
|
|
|
} m_oTextMatrix;
|
|
|
|
public:
|
|
CAVSFontManager()
|
|
{
|
|
}
|
|
|
|
|
|
|
|
DECLARE_PROTECT_FINAL_CONSTRUCT()
|
|
|
|
HRESULT FinalConstruct()
|
|
{
|
|
ATLTRACE2( _T("FontManager: Construct ++++++++++++++++++++++++++++++++++++++++++\n") );
|
|
m_pFontEngine = NULL;
|
|
m_pFont = NULL;
|
|
|
|
m_lUnit = 0;
|
|
|
|
m_dCharSpacing = 0.0;
|
|
|
|
m_bStringGID = FALSE;
|
|
m_bUseDefaultFont = FALSE;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
void FinalRelease()
|
|
{
|
|
ATLTRACE2( _T("FontManager: Release --------------------------------------------\n") );
|
|
|
|
if ( m_pFontEngine )
|
|
{
|
|
delete m_pFontEngine;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
double UpdateSize(double dOldSize, double dDpi, double dNewDpi)
|
|
{
|
|
if ( 0 == dNewDpi ) dNewDpi = 72.0;
|
|
if ( 0 == dDpi ) dDpi = 72.0;
|
|
|
|
return dOldSize * dDpi / dNewDpi;
|
|
}
|
|
double UpdateDpi(double dDpi, double dSize, double dNewSize)
|
|
{
|
|
if ( 0 == dNewSize ) dNewSize = 10.0;
|
|
if ( 0 == dDpi ) dDpi = 72.0;
|
|
|
|
return dDpi * dSize / dNewSize;
|
|
}
|
|
double XToMM(double dX)
|
|
{
|
|
if ( !m_pFont )
|
|
return 0;
|
|
|
|
return dX * 25.4 / m_pFont->GetHorDpi();
|
|
}
|
|
double YToMM(double dY)
|
|
{
|
|
if ( !m_pFont )
|
|
return 0;
|
|
|
|
return dY * 25.4 / m_pFont->GetVerDpi();
|
|
}
|
|
|
|
public:
|
|
|
|
//----- Îòêðûòèå/çàêðûòèå øðèôòà --------------------------------------------------------------------
|
|
STDMETHOD(Initialize)(BSTR bsXmlOptions)
|
|
{
|
|
BOOL bLoadWinList = TRUE;
|
|
CString wsLoadDir = _T("");
|
|
|
|
CStringW wsXml( bsXmlOptions );
|
|
|
|
if (_T("") != wsXml)
|
|
{
|
|
XmlUtils::CXmlNode oMainNode;
|
|
if ( oMainNode.FromXmlString( wsXml ) )
|
|
{
|
|
if ( -1 != oMainNode.GetName().Find( _T("FontManagerOptions") ) )
|
|
{
|
|
XmlUtils::CXmlNode oNode;
|
|
if ( oMainNode.GetNode( _T("WinList"), oNode ) )
|
|
{
|
|
CStringW wsLoad = oNode.GetAttribute( _T("load"), _T("1") );
|
|
bLoadWinList = (BOOL)_wtoi( wsLoad.GetBuffer() );
|
|
}
|
|
|
|
if ( oMainNode.GetNode( _T("FontDir"), oNode ) )
|
|
wsLoadDir = oNode.GetAttribute( _T("path"), _T("") );
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
WinFontsStatusStorage oSS;
|
|
CWinFontsStatusStorage oStatusStorage( STATUS_STORAGE_NAME );
|
|
|
|
//CString sXml;
|
|
//do
|
|
//{
|
|
// if ( STIF_BROKEN == oSS.m_sStatus || STIF_ERROR == oSS.m_sStatus )
|
|
// {
|
|
// // TO DO: äåëàåì îáû÷íûé Initialize
|
|
// break;
|
|
// }
|
|
// else if ( STIF_CREATING == oSS.m_sStatus )
|
|
// {
|
|
// Sleep ( 100 );
|
|
// }
|
|
// else if ( STIF_AVAILABLE == oSS.m_sStatus )
|
|
// {
|
|
// CWinFontsInfoStorage oInfoStorage( STATUS_STORAGE_NAME, oSS.m_lLength );
|
|
|
|
// WinFontsInfoStorage oInfo;
|
|
// oInfoStorage.ReadStruct( &oInfo );
|
|
|
|
// oInfo.m_lCount++;
|
|
// oInfoStorage.WriteCount( &oInfo );
|
|
|
|
// sXml = CString( oInfo.m_strXml );
|
|
// }
|
|
//}
|
|
//while ( STIF_CREATING == oSS.m_sStatus );
|
|
|
|
//m_pFontEngine = new CFontEngine(TRUE, TRUE, bLoadWinList, sXml);
|
|
|
|
BYTE* pData = NULL;
|
|
do
|
|
{
|
|
bool bGetMaster = false;
|
|
oStatusStorage.GetStatus( &bGetMaster, &oSS );
|
|
if ( STIF_BROKEN == oSS.m_sStatus || STIF_ERROR == oSS.m_sStatus )
|
|
{
|
|
// TO DO: äåëàåì îáû÷íûé Initialize
|
|
break;
|
|
}
|
|
else if ( STIF_CREATING == oSS.m_sStatus )
|
|
{
|
|
Sleep ( 100 );
|
|
}
|
|
else if ( STIF_AVAILABLE == oSS.m_sStatus )
|
|
{
|
|
CWinFontsInfoStorage oInfoStorage( STATUS_STORAGE_NAME, oSS.m_lLength );
|
|
|
|
WinFontsInfoStorage oInfo;
|
|
oInfoStorage.ReadStruct( &oInfo );
|
|
|
|
pData = oInfo.m_pBuffer;
|
|
}
|
|
}
|
|
while ( STIF_CREATING == oSS.m_sStatus );
|
|
|
|
m_pFontEngine = new CFontEngine(TRUE, TRUE, bLoadWinList, pData, wsLoadDir);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(LoadFontFromFile)(BSTR bsSrcPath, float fEmSize, double dHorDpi, double dVerDpi, long lFaceIndex)
|
|
{
|
|
if ( !m_pFontEngine )
|
|
return S_FALSE;
|
|
|
|
CFontFile *pFontFile = NULL;
|
|
if ( !( pFontFile = m_pFontEngine->GetFontFile( bsSrcPath, lFaceIndex ) ) )
|
|
{
|
|
pFontFile = m_pFontEngine->LoadFont( bsSrcPath, lFaceIndex );
|
|
}
|
|
|
|
if ( !pFontFile )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_OPEN_ERROR;
|
|
|
|
m_pFont = m_pFontEngine->GetFont( pFontFile );
|
|
|
|
if ( !m_pFont )
|
|
return S_FALSE;
|
|
|
|
UpdateStyles( m_pFont, FALSE, FALSE );
|
|
m_pFont->SetDefaultFont( m_pFontEngine->GetDefaultFont( FALSE, FALSE ) );
|
|
fEmSize = UpdateSize( (double) fEmSize, dVerDpi, (unsigned int)dVerDpi );
|
|
m_pFont->SetSizeAndDpi( fEmSize, (unsigned int)dHorDpi, (unsigned int)dVerDpi );
|
|
|
|
m_pFont->SetStringGID( m_bStringGID );
|
|
m_pFont->SetUseDefaultFont( m_bUseDefaultFont );
|
|
m_pFont->SetCharSpacing( m_dCharSpacing );
|
|
|
|
m_oTextMatrix.Reset();
|
|
m_oGlyphString.ResetCTM();
|
|
m_pFont->SetTextMatrix( 1, 0, 0, 1, 0, 0 );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(LoadFontByName)(BSTR bsFamilyName, float fEmSize, long lStyle, double dHorDpi, double dVerDpi)
|
|
{
|
|
if ( !m_pFontEngine )
|
|
return S_FALSE;
|
|
|
|
BOOL bBold = FALSE;
|
|
BOOL bItalic = FALSE;
|
|
|
|
if ( lStyle & FontConstants::FontStyle::FontStyleBold )
|
|
bBold = TRUE;
|
|
|
|
if ( lStyle & FontConstants::FontStyle::FontStyleItalic )
|
|
bItalic = TRUE;
|
|
|
|
CFontFile *pFontFile = NULL;
|
|
|
|
if ( !( pFontFile = m_pFontEngine->GetFontFile( bsFamilyName, bBold, bItalic ) ) )
|
|
{
|
|
pFontFile = m_pFontEngine->LoadFont( bsFamilyName, bBold, bItalic );
|
|
}
|
|
|
|
BOOL bDefaultFont = FALSE;
|
|
if ( !pFontFile )
|
|
{
|
|
bDefaultFont = TRUE;
|
|
m_pFont = m_pFontEngine->GetDefaultFont( bBold, bItalic );
|
|
}
|
|
else
|
|
{
|
|
m_pFont = m_pFontEngine->GetFont( pFontFile );
|
|
m_pFont->SetDefaultFont( m_pFontEngine->GetDefaultFont( bBold, bItalic ) );
|
|
}
|
|
|
|
if ( !m_pFont )
|
|
return S_FALSE;
|
|
|
|
UpdateStyles( m_pFont, bBold, bItalic );
|
|
fEmSize = UpdateSize( (double) fEmSize, dVerDpi, (unsigned int)dVerDpi );
|
|
m_pFont->SetSizeAndDpi( fEmSize, (unsigned int)dHorDpi, (unsigned int)dVerDpi );
|
|
|
|
m_pFont->SetStringGID( m_bStringGID );
|
|
m_pFont->SetUseDefaultFont( m_bUseDefaultFont );
|
|
m_pFont->SetCharSpacing( m_dCharSpacing );
|
|
|
|
m_oTextMatrix.Reset();
|
|
m_oGlyphString.ResetCTM();
|
|
m_pFont->SetTextMatrix( 1, 0, 0, 1, 0, 0 );
|
|
|
|
if ( TRUE == bDefaultFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_DEFAULT_FONT_WAS_LOAD;
|
|
else
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFontType)(BSTR *pbsType)
|
|
{
|
|
CStringW wsType = _T("");
|
|
if ( !m_pFont )
|
|
{
|
|
*pbsType = wsType.AllocSysString();
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
wsType = m_pFont->GetFontFormat();
|
|
*pbsType = wsType.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetDefaultFont)(BSTR bsFamilyName)
|
|
{
|
|
if ( !m_pFontEngine )
|
|
return S_FALSE;
|
|
|
|
m_pFontEngine->SetDefaultFont( bsFamilyName );
|
|
|
|
return S_OK;
|
|
}
|
|
//----- Ôóíêöèè àíàëîãè÷íûå ìåòîäàì êëàññîâ Font è FontFamily â GDI+ --------------------------------
|
|
STDMETHOD(GetCellAscent)(unsigned short *pusAscent)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pusAscent = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pusAscent = m_pFont->GetAscender();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCellDescent)(unsigned short *pusDescent)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pusDescent = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pusDescent = fabs( m_pFont->GetDescender() );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetEmHeight)(unsigned short *pusEmHeight)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pusEmHeight = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pusEmHeight = m_pFont->GetUnitsPerEm();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFamilyName)(BSTR *pbsFamilyName)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
CString sFamilyName( _T("") );
|
|
*pbsFamilyName = sFamilyName.AllocSysString();
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
CString sFamilyName( m_pFont->GetFamilyName() );
|
|
*pbsFamilyName = sFamilyName.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetLineSpacing)(unsigned short *pusLineSpacing)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pusLineSpacing = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pusLineSpacing = m_pFont->GetLineSpacing();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(IsStyleAvailable)(long lStyle, BOOL *pbAvailable)
|
|
{
|
|
if ( !m_pFontEngine || !m_pFont )
|
|
{
|
|
*pbAvailable = FALSE;
|
|
return S_OK;
|
|
}
|
|
|
|
*pbAvailable = m_pFontEngine->IsStyleAvailable( CStringW( m_pFont->GetFamilyName() ).GetBuffer(), lStyle );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
STDMETHOD(GetHeight)(float fDPI, float *pfHeight)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pfHeight = 0.0f;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
unsigned short usEmHeight = 0;
|
|
unsigned short usLineSpacing = 0;
|
|
|
|
HRESULT hRes = S_OK;
|
|
if ( FAILED( hRes = GetEmHeight( &usEmHeight ) ) || usEmHeight <= 0.0001 )
|
|
return hRes;
|
|
|
|
if ( FAILED( hRes = GetLineSpacing( &usLineSpacing ) ) )
|
|
return hRes;
|
|
|
|
float fKoef = 1.0f;
|
|
switch( m_lUnit )
|
|
{
|
|
case FontConstants::UnitPoint: fKoef = fDPI / 72; break;
|
|
case FontConstants::UnitInch: fKoef = fDPI; break;
|
|
case FontConstants::UnitDocument: fKoef = fDPI / 300; break;
|
|
case FontConstants::UnitMillimeter: fKoef = fDPI / 25.4; break;
|
|
}
|
|
|
|
*pfHeight = usLineSpacing * ( m_pFont->GetFontSize() / usEmHeight ) * fKoef;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFamilyNameEx)(BSTR bsOptions, BSTR *pbsFamilyName)
|
|
{
|
|
HRESULT hRes = S_OK;
|
|
|
|
if ( FAILED( hRes = GetFamilyName( pbsFamilyName ) ) )
|
|
{
|
|
if ( NULL != (*pbsFamilyName) ) ::SysFreeString( (*pbsFamilyName) );
|
|
return hRes;
|
|
}
|
|
|
|
XmlUtils::CXmlNode oMainNode;
|
|
oMainNode.FromXmlString( bsOptions );
|
|
|
|
if ( _T("DeletePDFPrefix") == oMainNode.GetName() )
|
|
{
|
|
CString sFamilyName( (*pbsFamilyName) );
|
|
// Óäàëÿåì ïðåôèêñ, êîòîðûé âñòðå÷àåòñÿ â øðèôòàõ âíåäðåííûõ â PDF
|
|
// Åãî âèä : BAAAAA+FamilyName (6 ëàòèíñêèõ áóêâ â âåðõíåì ðåãèñòðå è '+')
|
|
// Ïðèìåð : EOODIA+Poetica
|
|
|
|
if ( sFamilyName.GetLength() > 7 )
|
|
{
|
|
BOOL bPrefix = TRUE;
|
|
for ( int nIndex = 0; nIndex < 6; nIndex++ )
|
|
{
|
|
wchar_t nChar = sFamilyName.GetAt( nIndex );
|
|
if ( nChar < wchar_t('A') || nChar > wchar_t('Z') )
|
|
{
|
|
bPrefix = FALSE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( wchar_t( sFamilyName.GetAt( 6 ) ) != wchar_t('+') )
|
|
bPrefix = FALSE;
|
|
|
|
if ( bPrefix )
|
|
{
|
|
if ( NULL != (*pbsFamilyName) ) ::SysFreeString( (*pbsFamilyName) );
|
|
sFamilyName.Delete( 0, 7 );
|
|
(*pbsFamilyName) = sFamilyName.AllocSysString();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Íè÷åãî íå äåëàåì
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// íè÷åãî íå äåëàåì, îñòàâëÿåñ bsFamilyName êàê åñòü
|
|
}
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
//----- ×òåíèå ãëîáàëüíûõ ïàðàìåòðîâ øðèôòà ---------------------------------------------------------
|
|
STDMETHOD(GetFacesCount)(long *plFacesCount)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*plFacesCount = 0;
|
|
return S_FALSE;
|
|
}
|
|
|
|
*plFacesCount = m_pFont->GetFacesCount();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFaceIndex)(long *plFaceIndex)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*plFaceIndex = 0;
|
|
return S_FALSE;
|
|
}
|
|
|
|
*plFaceIndex = m_pFont->GetFaceIndex();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetGlyphsCount)(long *plGlyphsCount)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*plGlyphsCount = 0;
|
|
return S_FALSE;
|
|
}
|
|
|
|
*plGlyphsCount = m_pFont->GetGlyphsCount();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetStyleName)(BSTR *pbsStyleName)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
CString sStyleName( _T("") );
|
|
*pbsStyleName = sStyleName.AllocSysString();
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
CString sStyleName( m_pFont->GetStyleName() );
|
|
*pbsStyleName = sStyleName.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHOD(IsCharAvailable)(long lUnicode, BOOL *pbAvailable)
|
|
{
|
|
if ( !m_pFont )
|
|
return S_FALSE;
|
|
|
|
*pbAvailable = m_pFont->IsCharAvailable( lUnicode );
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(GetUnderlinePosition)(short *pshUnderPos)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pshUnderPos = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pshUnderPos = m_pFont->GetUnderlinePosition();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetUnderlineThickness)(short *pshUnderThick)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pshUnderThick = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pshUnderThick = m_pFont->GetUnderlineThickness();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetMaxAdvanceWidth)(short *pshMaxAdvWidth)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pshMaxAdvWidth = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pshMaxAdvWidth = m_pFont->GetMaxAdvanceWidth();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetMaxAdvanceHeight)(short *pshMaxAdvHeight)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*pshMaxAdvHeight = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
*pshMaxAdvHeight = m_pFont->GetMaxAdvanceHeight();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetBBox)(long *plMinX, long *plMinY, long *plMaxX, long *plMaxY)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
*plMinX = 0;
|
|
*plMinY = 0;
|
|
*plMaxX = 0;
|
|
*plMaxY = 0;
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
}
|
|
|
|
m_pFont->GetBBox( plMinX, plMinY, plMaxX, plMaxY );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(IsUnicodeRangeAvailable)(unsigned long ulBit, unsigned int unLongIndex, VARIANT_BOOL *pvbSuccess)
|
|
{
|
|
*pvbSuccess = VARIANT_FALSE;
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
if ( m_pFont->IsUnicodeRangeAvailable( ulBit, unLongIndex ) > 0 )
|
|
*pvbSuccess = VARIANT_TRUE;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetNameIndex)(BSTR bsName, unsigned short *pushGID)
|
|
{
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
USES_CONVERSION;
|
|
*pushGID = m_pFont->GetNameIndex( W2A(bsName) );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCodeByGID)(unsigned short ushGID, unsigned long *pulCharCode)
|
|
{
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
//*pulCharCode = m_pFont->GetCodeByGID( ushGID );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetPanose)(SAFEARRAY **ppsaPanose)
|
|
{
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
signed char *sPanose = new signed char[10];
|
|
if ( !sPanose )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
m_pFont->GetPanose( (char **)&sPanose );
|
|
|
|
SAFEARRAYBOUND saBound;
|
|
saBound.lLbound = 0;
|
|
saBound.cElements = 10;
|
|
|
|
SAFEARRAY *psaArray = SafeArrayCreate( VT_I1, 1, &saBound );
|
|
memcpy( psaArray->pvData, sPanose, 10 * sizeof(signed char) );
|
|
delete []sPanose;
|
|
|
|
*ppsaPanose = psaArray;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(IsFixedWidth)(BOOL *pbIsFixedWidth)
|
|
{
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
*pbIsFixedWidth = ( m_pFont->IsFixedWidth() ? TRUE : FALSE );
|
|
|
|
return S_OK;
|
|
}
|
|
//----- Ðàáîòà ñ ãëèôàìè ----------------------------------------------------------------------------
|
|
STDMETHOD(LoadString)(BSTR bsString, float fX, float fY)
|
|
{
|
|
if ( !m_pFont )
|
|
return FALSE;
|
|
|
|
CStringW wsBuffer = CStringW( bsString );
|
|
|
|
m_oGlyphString.SetString( wsBuffer, fX, fY );
|
|
m_pFont->GetString( &m_oGlyphString );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(LoadString2)(BSTR bsString, float fX, float fY)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
m_oGlyphString.Reset();
|
|
return FALSE;
|
|
}
|
|
|
|
CStringW wsBuffer = CStringW( bsString );
|
|
|
|
m_oGlyphString.SetString( wsBuffer, fX, fY );
|
|
m_pFont->GetString2( &m_oGlyphString );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetStringPath)(BSTR *pbsXmlPath)
|
|
{
|
|
if ( !m_pFont || m_oGlyphString.GetLength() <= 0 )
|
|
{
|
|
CString sXml( _T("") );
|
|
*pbsXmlPath = sXml.AllocSysString();
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
CFontPath *pOverallPath = new CFontPath();
|
|
if ( !pOverallPath )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
for ( int nIndex = 0; nIndex < m_oGlyphString.GetLength(); nIndex++ )
|
|
{
|
|
TGlyph *pCurGlyph = m_oGlyphString.GetAt(nIndex);
|
|
CFontPath *pPath = NULL;
|
|
if ( glyphstateNormal == pCurGlyph->eState || ( glyphstateDeafault == pCurGlyph->eState && NULL != m_pFont->GetDefaultFont() ) )
|
|
{
|
|
if ( glyphstateNormal == pCurGlyph->eState )
|
|
{
|
|
pPath = m_pFont->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
else
|
|
{
|
|
pPath = m_pFont->GetDefaultFont()->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
}
|
|
|
|
if ( !pPath )
|
|
continue;
|
|
|
|
pPath->Reverse();
|
|
pPath->Offset( m_oGlyphString.GetAt(nIndex)->fX + m_oGlyphString.m_fX, m_oGlyphString.GetAt(nIndex)->fY + m_oGlyphString.m_fY );
|
|
pOverallPath->Append( pPath );
|
|
delete pPath;
|
|
}
|
|
|
|
*pbsXmlPath = pOverallPath->ToXmlString().AllocSysString();
|
|
delete pOverallPath;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetStringPath2)(IAVSGraphicsBase **ppPath)
|
|
{
|
|
if ( !m_pFont || m_oGlyphString.GetLength() <= 0 )
|
|
return S_FALSE;
|
|
|
|
CFontPath *pOverallPath = new CFontPath();
|
|
if ( !pOverallPath )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
for ( int nIndex = 0; nIndex < m_oGlyphString.GetLength(); nIndex++ )
|
|
{
|
|
TGlyph *pCurGlyph = m_oGlyphString.GetAt(nIndex);
|
|
CFontPath *pPath = NULL;
|
|
if ( glyphstateNormal == pCurGlyph->eState || ( glyphstateDeafault == pCurGlyph->eState && NULL != m_pFont->GetDefaultFont() ) )
|
|
{
|
|
if ( glyphstateNormal == pCurGlyph->eState )
|
|
{
|
|
pPath = m_pFont->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
else
|
|
{
|
|
pPath = m_pFont->GetDefaultFont()->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
}
|
|
|
|
if ( !pPath )
|
|
continue;
|
|
|
|
pPath->Reverse();
|
|
pPath->Offset( m_oGlyphString.GetAt(nIndex)->fX + m_oGlyphString.m_fX, m_oGlyphString.GetAt(nIndex)->fY + m_oGlyphString.m_fY );
|
|
pOverallPath->Append( pPath );
|
|
delete pPath;
|
|
}
|
|
|
|
if ( !ppPath )
|
|
{
|
|
delete pOverallPath;
|
|
return S_FALSE;
|
|
}
|
|
|
|
*ppPath = NULL;
|
|
HRESULT hRes = CoCreateInstance( __uuidof(CAVSGraphicsPath), NULL, CLSCTX_ALL, __uuidof(IAVSGraphicsPath), (void**)ppPath );
|
|
if ( hRes != S_OK || NULL == *ppPath )
|
|
{
|
|
delete pOverallPath;
|
|
return S_FALSE;
|
|
}
|
|
|
|
pOverallPath->ToInterface( (IAVSGraphicsPath **)ppPath );
|
|
delete pOverallPath;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetNextChar)(IUnknown **ppImage, float *pfX, float *pfY, VARIANT_BOOL *pvbSuccess)
|
|
{
|
|
*pvbSuccess = VARIANT_FALSE;
|
|
BOOL bNotLast = TRUE;
|
|
|
|
TGlyph oCurGlyph;
|
|
if ( !(m_oGlyphString.GetNext( &oCurGlyph )) )
|
|
{
|
|
*ppImage = NULL;
|
|
*pfX = -0xFFFF;
|
|
*pfY = -0xFFFF;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
if ( !m_pFont )
|
|
return S_FALSE;
|
|
|
|
if ( glyphstateNormal == oCurGlyph.eState || ( glyphstateDeafault == oCurGlyph.eState && NULL != m_pFont->GetDefaultFont() ) )
|
|
{
|
|
long lUnicode = oCurGlyph.lUnicode;
|
|
|
|
TGlyphBitmap oBitmap;
|
|
CFont *pCurFont = NULL;
|
|
|
|
if ( glyphstateNormal == oCurGlyph.eState )
|
|
pCurFont = m_pFont;
|
|
else
|
|
pCurFont = m_pFont->GetDefaultFont();
|
|
|
|
if ( false == oCurGlyph.bBitmap )
|
|
pCurFont->GetGlyph( lUnicode, 0, 0, &oBitmap );
|
|
else
|
|
oBitmap = oCurGlyph.oBitmap;
|
|
|
|
if ( oBitmap.nWidth > 0 && oBitmap.nHeight > 0 )
|
|
{
|
|
// Ïîäãîòàâëèâàåì pInterface
|
|
IUnknown **pInterface = (IUnknown**)ppImage;
|
|
if ( !pInterface )
|
|
return S_FALSE;
|
|
|
|
// create result interface
|
|
*pInterface = NULL;
|
|
HRESULT hRes = CoCreateInstance( MediaCore::CLSID_CAVSUncompressedVideoFrame, NULL, CLSCTX_ALL, MediaCore::IID_IAVSUncompressedVideoFrame, (void**)pInterface );
|
|
if ( hRes != S_OK || NULL == *pInterface )
|
|
return S_FALSE;
|
|
|
|
MediaCore::IAVSUncompressedVideoFrame* pMediaData = (MediaCore::IAVSUncompressedVideoFrame*)*pInterface;
|
|
|
|
int nWidth = oBitmap.nWidth;
|
|
int nHeight = oBitmap.nHeight;
|
|
|
|
int nBufferSize = 4 * nWidth * nHeight;
|
|
if ( nBufferSize < 1 )
|
|
return S_FALSE;
|
|
|
|
pMediaData->put_ColorSpace( 1 << 6 ); // CPS_BGRA
|
|
pMediaData->put_Width( nWidth );
|
|
pMediaData->put_Height( nHeight );
|
|
pMediaData->put_AspectRatioX( nWidth );
|
|
pMediaData->put_AspectRatioY( nHeight );
|
|
pMediaData->put_Interlaced( VARIANT_FALSE );
|
|
pMediaData->put_Stride( 0, 4 * nWidth );
|
|
pMediaData->AllocateBuffer( nBufferSize );
|
|
|
|
unsigned char *pBufferPtr = NULL;
|
|
long nCreatedBufferSize = 0;
|
|
|
|
pMediaData->get_Buffer( &pBufferPtr );
|
|
pMediaData->get_BufferSize( &nCreatedBufferSize );
|
|
pMediaData->put_Plane( 0, pBufferPtr );
|
|
|
|
if ( !pBufferPtr || nCreatedBufferSize != nBufferSize )
|
|
return S_FALSE;
|
|
|
|
*pInterface = pMediaData;
|
|
|
|
// Ïèøåì äàííûå â pBufferPtr
|
|
|
|
for ( int nY = 0; nY < nHeight; nY++ )
|
|
{
|
|
for ( int nX = 0; nX < nWidth; nX++ )
|
|
{
|
|
unsigned char nG = 255 - oBitmap.pData[nWidth * nY + nX ];
|
|
|
|
//pBufferPtr[0] = nG;
|
|
//pBufferPtr[1] = nG;
|
|
//pBufferPtr[2] = nG;
|
|
//pBufferPtr[3] = 255;
|
|
|
|
pBufferPtr[0] = 0;//nG;
|
|
pBufferPtr[1] = 0;//nG;
|
|
pBufferPtr[2] = 0;//nG;
|
|
pBufferPtr[3] = 255 - nG;
|
|
|
|
pBufferPtr += 4;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
*ppImage = NULL;
|
|
}
|
|
*pfX = m_oGlyphString.m_fX + oCurGlyph.fX + oBitmap.nX;
|
|
*pfY = m_oGlyphString.m_fY + oCurGlyph.fY - oBitmap.nY; // Îòäàåì êîîðäèíàòó ëåâîãî âåðõíåãî óãëà
|
|
|
|
}
|
|
else
|
|
{
|
|
// Ñèìâîë íå íàéäåí, íè÷åãî íå ðèñóåì
|
|
*ppImage = NULL;
|
|
|
|
*pfX = m_oGlyphString.m_fX + oCurGlyph.fX;
|
|
*pfY = m_oGlyphString.m_fY + oCurGlyph.fY;
|
|
}
|
|
*pvbSuccess = VARIANT_TRUE;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetNextChar2)(IAVSGlyphImage **ppImage, float *pfX, float *pfY, VARIANT_BOOL *pvbSuccess)
|
|
{
|
|
*pvbSuccess = VARIANT_FALSE;
|
|
BOOL bNotLast = TRUE;
|
|
|
|
TGlyph oCurGlyph;
|
|
if ( !(m_oGlyphString.GetNext( &oCurGlyph )) )
|
|
{
|
|
*ppImage = NULL;
|
|
*pfX = -0xFFFF;
|
|
*pfY = -0xFFFF;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
if ( !m_pFont )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
if ( glyphstateNormal == oCurGlyph.eState || ( glyphstateDeafault == oCurGlyph.eState && NULL != m_pFont->GetDefaultFont() ) )
|
|
{
|
|
long lUnicode = oCurGlyph.lUnicode;
|
|
|
|
TGlyphBitmap oBitmap;
|
|
CFont *pCurFont = NULL;
|
|
|
|
if ( glyphstateNormal == oCurGlyph.eState )
|
|
pCurFont = m_pFont;
|
|
else
|
|
pCurFont = m_pFont->GetDefaultFont();
|
|
|
|
if ( false == oCurGlyph.bBitmap )
|
|
pCurFont->GetGlyph( lUnicode, 0, 0, &oBitmap );
|
|
else
|
|
oBitmap = oCurGlyph.oBitmap;
|
|
|
|
if ( oBitmap.nWidth > 0 && oBitmap.nHeight > 0 )
|
|
{
|
|
if ( !ppImage )
|
|
return S_FALSE;
|
|
|
|
// create result interface
|
|
*ppImage = NULL;
|
|
HRESULT hRes = CoCreateInstance( __uuidof(CAVSGlyphImage), NULL, CLSCTX_ALL, __uuidof(IAVSGlyphImage), (void**)ppImage );
|
|
if ( hRes != S_OK || NULL == *ppImage )
|
|
return S_FALSE;
|
|
|
|
IAVSGlyphImage2* pGlyph2 = NULL;
|
|
(*ppImage)->QueryInterface(__uuidof(IAVSGlyphImage2), (void**)&pGlyph2);
|
|
|
|
if (NULL != pGlyph2)
|
|
pGlyph2->Create(oBitmap.pData, oBitmap.nX, oBitmap.nY, oBitmap.nWidth, oBitmap.nHeight, FALSE/*oBitmap.bFreeData*/);
|
|
|
|
RELEASEINTERFACE(pGlyph2);
|
|
|
|
//CAVSGlyphImage* pClassImage = dynamic_cast<CAVSGlyphImage*>(*ppImage);
|
|
//if (NULL != pClassImage)
|
|
// pClassImage->Create( &oBitmap );
|
|
}
|
|
else
|
|
{
|
|
*ppImage = NULL;
|
|
}
|
|
*pfX = m_oGlyphString.m_fX + oCurGlyph.fX + oBitmap.nX;
|
|
*pfY = m_oGlyphString.m_fY + oCurGlyph.fY - oBitmap.nY; // Îòäàåì êîîðäèíàòó ëåâîãî âåðõíåãî óãëà
|
|
|
|
}
|
|
else
|
|
{
|
|
// Ñèìâîë íå íàéäåí, íè÷åãî íå ðèñóåì
|
|
*ppImage = NULL;
|
|
|
|
*pfX = m_oGlyphString.m_fX + oCurGlyph.fX;
|
|
*pfY = m_oGlyphString.m_fY + oCurGlyph.fY;
|
|
}
|
|
*pvbSuccess = VARIANT_TRUE;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCharBBox)(float *pfX, float *pfY, float *pfWidth, float *pfHeight)
|
|
{
|
|
if ( m_oGlyphString.GetLength() <= 0 )
|
|
{
|
|
*pfX = 0;
|
|
*pfY = 0;
|
|
*pfWidth = 0;
|
|
*pfHeight = 0;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
float fLeft = 0, fTop = 0, fBottom = 0, fRight = 0;
|
|
|
|
m_oGlyphString.GetBBox( &fLeft, &fTop, &fRight, &fBottom );
|
|
|
|
*pfX = fLeft;
|
|
*pfY = fTop;
|
|
|
|
*pfWidth = fabs( (fRight - fLeft) );
|
|
*pfHeight = fabs( (fTop - fBottom) );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetUnderline)(float *pfStartX, float *pfStartY, float *pfEndX, float *pfEndY, float *pfSize)
|
|
{
|
|
if ( m_oGlyphString.GetLength() <= 0 || !m_pFont )
|
|
{
|
|
*pfStartX = 0;
|
|
*pfStartY = 0;
|
|
*pfEndX = 0;
|
|
*pfEndY = 0;
|
|
*pfSize = 0;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
float fStartX = m_oGlyphString.m_fX;
|
|
float fStartY = m_oGlyphString.m_fY;
|
|
float fEndX = m_oGlyphString.m_fEndX;
|
|
float fEndY = m_oGlyphString.m_fEndY;
|
|
|
|
short shUnderlinePos = m_pFont->GetUnderlinePosition();
|
|
short shUnderlineSize = m_pFont->GetUnderlineThickness();
|
|
|
|
float fKoef = (float)(m_pFont->GetFontSize() / 1000 * m_pFont->GetVerDpi() / 72.0f);
|
|
float fUnderlinePos = shUnderlinePos * fKoef;
|
|
float fUnderLineSize = shUnderlineSize * fKoef;
|
|
|
|
fStartY -= fUnderlinePos;
|
|
fEndY -= fUnderlinePos;
|
|
|
|
m_oGlyphString.Transform( &fStartX, &fStartY );
|
|
m_oGlyphString.Transform( &fEndX, &fEndY );
|
|
|
|
*pfStartX = fStartX;
|
|
*pfStartY = fStartY;
|
|
|
|
*pfEndX = fEndX;
|
|
*pfEndY = fEndY;
|
|
|
|
*pfSize = fUnderLineSize;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(MeasureString)(float *pfX, float *pfY, float *pfWidth, float *pfHeight)
|
|
{
|
|
if ( m_oGlyphString.GetLength() <= 0 )
|
|
{
|
|
*pfX = 0;
|
|
*pfY = 0;
|
|
*pfWidth = 0;
|
|
*pfHeight = 0;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
float fTop = 0xFFFF, fBottom = -0xFFFF, fLeft = 0xFFFF, fRight = -0xFFFF;
|
|
for ( int nIndex = 0; nIndex < m_oGlyphString.GetLength(); nIndex++ )
|
|
{
|
|
float fT, fB, fL, fR;
|
|
m_oGlyphString.GetBBox( &fL, &fT, &fR, &fB, nIndex );
|
|
|
|
if ( fBottom < fB )
|
|
fBottom = fB;
|
|
|
|
if ( fTop > fT )
|
|
fTop = fT;
|
|
|
|
if ( fLeft > fL )
|
|
fLeft = fL;
|
|
|
|
if ( fRight < fR )
|
|
fRight = fR;
|
|
}
|
|
|
|
*pfX = fLeft;
|
|
*pfY = fTop;
|
|
|
|
*pfWidth = fabs( (fRight - fLeft) );
|
|
*pfHeight = fabs( (fTop - fBottom) );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(MeasureString2)(float *pfX, float *pfY, float *pfWidth, float *pfHeight)
|
|
{
|
|
if ( m_oGlyphString.GetLength() <= 0 )
|
|
{
|
|
*pfX = 0;
|
|
*pfY = 0;
|
|
*pfWidth = 0;
|
|
*pfHeight = 0;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
float fTop = 0xFFFF, fBottom = -0xFFFF, fLeft = 0xFFFF, fRight = -0xFFFF;
|
|
|
|
m_oGlyphString.GetBBox2( &fLeft, &fTop, &fRight, &fBottom );
|
|
|
|
*pfX = fLeft;
|
|
*pfY = fTop;
|
|
|
|
*pfWidth = fabs( (fRight - fLeft) );
|
|
*pfHeight = fabs( (fTop - fBottom) );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetFontMatrix)(float fA, float fB, float fC, float fD, float fE, float fF)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
m_pFont->SetFontMatrix( fA, fB, fC, fD, fE, fF );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetTextMatrix)(float fA, float fB, float fC, float fD, float fE, float fF)
|
|
{
|
|
if ( !m_pFont )
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
//if ( m_oTextMatrix.SetTransform( fA, fB, fC, fD, fE, fF ) )
|
|
//{
|
|
// m_pFont->SetTextMatrix( fA, fB, fC, fD, fE, fF );
|
|
// m_oGlyphString.SetCTM( fA, fB, fC, fD, fE, fF );
|
|
//}
|
|
|
|
if ( m_oTextMatrix.SetTransform( fA, fB, fC, fD, 0, 0 ) )
|
|
{
|
|
m_pFont->SetTextMatrix( fA, fB, fC, fD, 0, 0 );
|
|
m_oGlyphString.SetCTM( fA, fB, fC, fD, 0, 0 );
|
|
m_oGlyphString.SetTrans( fE, fF );
|
|
}
|
|
else
|
|
{
|
|
m_oGlyphString.SetTrans( fE, fF );
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetStringGID)(BOOL bStringGID)
|
|
{
|
|
m_bStringGID = bStringGID;
|
|
|
|
if ( !m_pFont )
|
|
return S_OK;
|
|
|
|
m_pFont->SetStringGID( m_bStringGID );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetStringGID)(BOOL *pbStringGID)
|
|
{
|
|
if ( !pbStringGID )
|
|
return S_FALSE;
|
|
|
|
*pbStringGID = m_bStringGID;
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(SetCharSpacing)(double dSpacing)
|
|
{
|
|
m_dCharSpacing = dSpacing;
|
|
|
|
if ( m_pFont )
|
|
m_pFont->SetCharSpacing( m_dCharSpacing );
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetCharSpacing)(double *pdSpacing)
|
|
{
|
|
if ( !pdSpacing )
|
|
return S_FALSE;
|
|
|
|
*pdSpacing = m_dCharSpacing;
|
|
|
|
return S_OK;
|
|
}
|
|
//----- Ðàáîòà ñî øðèôòàìè Windows ------------------------------------------------------------------
|
|
STDMETHOD(GetWinFontsCount)(long *plCount)
|
|
{
|
|
if ( !m_pFontEngine )
|
|
{
|
|
*plCount = 0;
|
|
return S_OK;
|
|
}
|
|
|
|
*plCount = m_pFontEngine->GetInstalledFontsCount();
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetWinFontByIndex)(long nIndex, BSTR *pbsFontName, BSTR *pbsFontStyle, BSTR *pbsFontPath, long *plIndex, BOOL *pbBold, BOOL *pbItalic)
|
|
{
|
|
if ( !m_pFontEngine )
|
|
{
|
|
*pbsFontName = CStringW( _T("") ).AllocSysString();
|
|
*pbsFontStyle = CStringW( _T("") ).AllocSysString();
|
|
*pbsFontPath = CStringW( _T("") ).AllocSysString();
|
|
*plIndex = 0;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
CWinFontInfo *pFontInfo = m_pFontEngine->GetInstalledFont( nIndex );
|
|
|
|
*pbsFontName = CStringW( pFontInfo->m_wsFontName ).AllocSysString();
|
|
*pbsFontStyle = CStringW( pFontInfo->m_wsStyle ).AllocSysString();
|
|
*pbsFontPath = CStringW( pFontInfo->m_wsFontPath ).AllocSysString();
|
|
*plIndex = pFontInfo->m_lIndex;
|
|
*pbBold = pFontInfo->m_bBold;
|
|
*pbItalic = pFontInfo->m_bItalic;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
STDMETHOD(GetWinFontByName)(BSTR bsFontName, BSTR *pbsFontPath, long *plIndex)
|
|
{
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetWinFontByParams)(BSTR bsFontParams, BSTR *pbsFontPath, long *plIndex)
|
|
{
|
|
CWinFontInfo *pFontInfo = NULL;
|
|
if ( !m_pFontEngine || NULL == ( pFontInfo = m_pFontEngine->GetInstalledFont( bsFontParams ) ) )
|
|
{
|
|
*pbsFontPath = CStringW( _T("") ).AllocSysString();
|
|
*plIndex = 0;
|
|
|
|
return S_FALSE;
|
|
}
|
|
|
|
*pbsFontPath = pFontInfo->m_wsFontPath.AllocSysString();
|
|
*plIndex = pFontInfo->m_lIndex;
|
|
|
|
return S_OK;
|
|
}
|
|
//----- IAVSGraphicsBase ----------------------------------------------------------------------------
|
|
STDMETHOD(SetAdditionalParam)(BSTR ParamName, VARIANT ParamValue)
|
|
{
|
|
CString sParamName = ParamName;
|
|
if ( _T("UseDefaultFont") == sParamName && VT_BOOL == ParamValue.vt )
|
|
{
|
|
m_bUseDefaultFont = ( ParamValue.boolVal == -1 ? TRUE : FALSE );
|
|
}
|
|
else if ( _T("DumpFontsJS") == sParamName && VT_BSTR == ParamValue.vt )
|
|
{
|
|
DumpToJSEditor((CString)ParamValue.bstrVal, false);
|
|
}
|
|
else if (_T("InitializeFromFolder") == sParamName && VT_BSTR == ParamValue.vt)
|
|
{
|
|
CFile oFile;
|
|
if (S_OK == oFile.OpenFile(((CString)ParamValue.bstrVal) + _T("\\font_selection.bin")))
|
|
{
|
|
LONG lSize = (LONG)oFile.GetFileSize();
|
|
BYTE* pData = new BYTE[lSize];
|
|
oFile.ReadFile(pData, (DWORD)lSize);
|
|
|
|
m_pFontEngine = new CFontEngine(TRUE, TRUE, TRUE, pData, (CString)ParamValue.bstrVal);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
else
|
|
{
|
|
Initialize(L"");
|
|
}
|
|
}
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetAdditionalParam)(BSTR ParamName, VARIANT* ParamValue)
|
|
{
|
|
CString sParamName = ParamName;
|
|
if ( (NULL == m_pFont) && (_T("GetAllStylesByFontName") != sParamName) )
|
|
return S_FALSE;
|
|
|
|
if ( _T("GetFontPath") == sParamName && NULL != ParamValue )
|
|
{
|
|
ParamValue->vt = VT_BSTR;
|
|
ParamValue->bstrVal = m_pFont->GetFontFile()->GetFontPath().AllocSysString();
|
|
}
|
|
if ( _T("GetFontIndex") == sParamName && NULL != ParamValue )
|
|
{
|
|
ParamValue->vt = VT_INT;
|
|
ParamValue->intVal = m_pFont->GetFontFile()->GetFontIndex();
|
|
}
|
|
if (_T("GetAllStylesByFontName") == sParamName && NULL != ParamValue && ParamValue->vt == VT_BSTR)
|
|
{
|
|
CString strName = (CString)ParamValue->bstrVal;
|
|
SysFreeString((ParamValue->bstrVal));
|
|
|
|
ParamValue->bstrVal = m_pFontEngine->GetInstalledFonts(strName).AllocSysString();
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(CreateDublicate)(IAVSGraphicsBase** ppGraphicsBase)
|
|
{
|
|
return S_OK;
|
|
}
|
|
//---------------------------------------------------------------------------------------------------
|
|
// IAVSFontManager2
|
|
//---------------------------------------------------------------------------------------------------
|
|
STDMETHOD(UseDefaultFont)(BOOL bUseDefFont)
|
|
{
|
|
m_bUseDefaultFont = bUseDefFont;
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFontPath)(BSTR *pbsFontPath)
|
|
{
|
|
if ( NULL == m_pFont )
|
|
return S_FALSE;
|
|
|
|
*pbsFontPath = m_pFont->GetFontFile()->GetFontPath().AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetFontIndex)(LONG *plFontIndex)
|
|
{
|
|
if ( NULL == m_pFont )
|
|
return S_FALSE;
|
|
|
|
*plFontIndex = m_pFont->GetFontFile()->GetFontIndex();
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetWinFontByParams2)(BSTR *pbsFontName, BSTR bsAltFontName, LONG lCharset, BSTR bsFamilyClass, LONG* plStyle, LONG lFixed, BSTR bsPanose, LONG lUnicodeRange1, LONG lUnicodeRange2, LONG lUnicodeRange3, LONG lUnicodeRange4, LONG lCodePageRange1, LONG lCodePageRange2, LONG lAvgWidth)
|
|
{
|
|
CWinFontInfo *pFontInfo = NULL;
|
|
|
|
long lStyle = -1;
|
|
if ( plStyle )
|
|
lStyle = *plStyle;
|
|
|
|
if ( !m_pFontEngine || NULL == ( pFontInfo = m_pFontEngine->GetInstalledFont( (wchar_t*)bsAltFontName, lCharset, (wchar_t*)bsFamilyClass, lStyle, lFixed, (wchar_t*)bsPanose, lUnicodeRange1, lUnicodeRange2, lUnicodeRange3, lUnicodeRange4, lCodePageRange1, lCodePageRange2, lAvgWidth ) ) )
|
|
{
|
|
*pbsFontName = CStringW( _T("") ).AllocSysString();
|
|
return S_FALSE;
|
|
}
|
|
|
|
if ( plStyle )
|
|
*plStyle = ( pFontInfo->m_bBold ? 1 : 0 ) + ( pFontInfo->m_bItalic ? 2 : 0 ) ;
|
|
|
|
*pbsFontName = pFontInfo->m_wsFontName.AllocSysString();
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHOD(SetFontsList)(BSTR bsXml)
|
|
{
|
|
// TO DO: Ñäåëàòü äàííóþ ôóíêöèþ
|
|
// Ñìûñë â òîì, ÷òîáû ñîñòàâèòü äîïîëíèòåëüíûé ñïèñîê øðèôòîâ CWinFonts
|
|
// òîëüêî èç òåõ øðèôòîâ, êîòîðûå óêàçàíû â Xml.
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(UseFontsList)(BOOL bUseList, BSTR bsXmlOptions)
|
|
{
|
|
// TO DO: Èñïîëüçóåì èëè íåò äîïîëíèòåëüíûé ñïèñîê.
|
|
//  îïöèÿõ óêàçûâàåòñÿ äëÿ ÷åãî ìû åãî èñïîëüçóåì (ïîèñê/çàãðóçêà)
|
|
|
|
return S_OK;
|
|
}
|
|
STDMETHOD(GetPanose2)(BSTR* bsPanose)
|
|
{
|
|
*bsPanose = NULL;
|
|
if ( !m_pFont )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_FONT_WASNT_LOAD;
|
|
|
|
BYTE *sPanose = new BYTE[10];
|
|
if ( !sPanose )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
m_pFont->GetPanose( (char **)&sPanose );
|
|
|
|
CString strMem = _T("");
|
|
strMem.Format(_T("%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"), sPanose[0], sPanose[1], sPanose[2], sPanose[3], sPanose[4], sPanose[5],
|
|
sPanose[6], sPanose[7], sPanose[8], sPanose[9]);
|
|
|
|
*bsPanose = strMem.AllocSysString();
|
|
|
|
delete []sPanose;
|
|
return S_OK;
|
|
|
|
}
|
|
public:
|
|
|
|
STDMETHOD(GetStringPath3)(ISimpleGraphicsPath* pPath)
|
|
{
|
|
if (NULL == pPath)
|
|
return S_FALSE;
|
|
|
|
if ( !m_pFont || m_oGlyphString.GetLength() <= 0 )
|
|
return S_FALSE;
|
|
|
|
CFontPath *pOverallPath = new CFontPath();
|
|
if ( !pOverallPath )
|
|
return AVS_OFFICEFONTMANAGER_ERROR_NOT_ENOUGH_MEMORY;
|
|
|
|
for ( int nIndex = 0; nIndex < m_oGlyphString.GetLength(); nIndex++ )
|
|
{
|
|
TGlyph *pCurGlyph = m_oGlyphString.GetAt(nIndex);
|
|
CFontPath *pPath = NULL;
|
|
if ( glyphstateNormal == pCurGlyph->eState || ( glyphstateDeafault == pCurGlyph->eState && NULL != m_pFont->GetDefaultFont() ) )
|
|
{
|
|
if ( glyphstateNormal == pCurGlyph->eState )
|
|
{
|
|
pPath = m_pFont->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
else
|
|
{
|
|
pPath = m_pFont->GetDefaultFont()->GetGlyphPath( pCurGlyph->lUnicode );
|
|
}
|
|
}
|
|
|
|
if ( !pPath )
|
|
continue;
|
|
|
|
pPath->Reverse();
|
|
pPath->ToMM( m_pFont->GetHorDpi(), m_pFont->GetVerDpi() );
|
|
pPath->Offset( XToMM( m_oGlyphString.GetAt(nIndex)->fX ) + m_oGlyphString.m_fX, YToMM( m_oGlyphString.GetAt(nIndex)->fY ) + m_oGlyphString.m_fY );
|
|
pOverallPath->Append( pPath );
|
|
delete pPath;
|
|
}
|
|
|
|
pOverallPath->ToInterface( pPath );
|
|
delete pOverallPath;
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
protected:
|
|
|
|
class CTextItem
|
|
{
|
|
protected:
|
|
wchar_t* m_pData;
|
|
size_t m_lSize;
|
|
|
|
wchar_t* m_pDataCur;
|
|
size_t m_lSizeCur;
|
|
|
|
public:
|
|
CTextItem()
|
|
{
|
|
m_pData = NULL;
|
|
m_lSize = 0;
|
|
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = m_lSize;
|
|
}
|
|
CTextItem(const CTextItem& oSrc)
|
|
{
|
|
m_pData = NULL;
|
|
*this = oSrc;
|
|
}
|
|
CTextItem& operator=(const CTextItem& oSrc)
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
|
|
m_lSize = oSrc.m_lSize;
|
|
m_lSizeCur = oSrc.m_lSizeCur;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, oSrc.m_pData, m_lSizeCur * sizeof(wchar_t));
|
|
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
|
|
return *this;
|
|
}
|
|
|
|
CTextItem(const size_t& nLen)
|
|
{
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = 0;
|
|
m_pDataCur = m_pData;
|
|
}
|
|
CTextItem(wchar_t* pData, const size_t& nLen)
|
|
{
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, pData, m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = m_lSize;
|
|
m_pDataCur = m_pData + m_lSize;
|
|
}
|
|
CTextItem(wchar_t* pData, BYTE* pUnicodeChecker = NULL)
|
|
{
|
|
size_t nLen = GetStringLen(pData);
|
|
|
|
m_lSize = nLen;
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
memcpy(m_pData, pData, m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = m_lSize;
|
|
m_pDataCur = m_pData + m_lSize;
|
|
|
|
if (NULL != pUnicodeChecker)
|
|
{
|
|
wchar_t* pMemory = m_pData;
|
|
while (pMemory < m_pDataCur)
|
|
{
|
|
if (!pUnicodeChecker[*pMemory])
|
|
*pMemory = wchar_t(' ');
|
|
++pMemory;
|
|
}
|
|
}
|
|
}
|
|
virtual ~CTextItem()
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
}
|
|
|
|
__forceinline void AddSize(const size_t& nSize)
|
|
{
|
|
if (NULL == m_pData)
|
|
{
|
|
m_lSize = max(nSize, 1000);
|
|
m_pData = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
|
|
m_lSizeCur = 0;
|
|
m_pDataCur = m_pData;
|
|
return;
|
|
}
|
|
|
|
if ((m_lSizeCur + nSize) > m_lSize)
|
|
{
|
|
while ((m_lSizeCur + nSize) > m_lSize)
|
|
{
|
|
m_lSize *= 2;
|
|
}
|
|
|
|
wchar_t* pRealloc = (wchar_t*)realloc(m_pData, m_lSize * sizeof(wchar_t));
|
|
if (NULL != pRealloc)
|
|
{
|
|
// ðåàëëîê ñðàáîòàë
|
|
m_pData = pRealloc;
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
}
|
|
else
|
|
{
|
|
wchar_t* pMalloc = (wchar_t*)malloc(m_lSize * sizeof(wchar_t));
|
|
memcpy(pMalloc, m_pData, m_lSizeCur * sizeof(wchar_t));
|
|
|
|
free(m_pData);
|
|
m_pData = pMalloc;
|
|
m_pDataCur = m_pData + m_lSizeCur;
|
|
}
|
|
}
|
|
}
|
|
|
|
public:
|
|
|
|
__forceinline void operator+=(const CTextItem& oTemp)
|
|
{
|
|
WriteString(oTemp.m_pData, oTemp.m_lSizeCur);
|
|
}
|
|
__forceinline void operator+=(_bstr_t& oTemp)
|
|
{
|
|
size_t nLen = oTemp.length();
|
|
WriteString(oTemp.GetBSTR(), nLen);
|
|
}
|
|
__forceinline void operator+=(CString& oTemp)
|
|
{
|
|
size_t nLen = (size_t)oTemp.GetLength();
|
|
|
|
#ifdef _UNICODE
|
|
WriteString(oTemp.GetBuffer(), nLen);
|
|
#else
|
|
CStringW str = (CStringW)oTemp;
|
|
WriteString(str.GetBuffer(), nLen);
|
|
#endif
|
|
}
|
|
__forceinline wchar_t operator[](const size_t& nIndex)
|
|
{
|
|
if (nIndex < m_lSizeCur)
|
|
return m_pData[nIndex];
|
|
|
|
return 0;
|
|
}
|
|
|
|
__forceinline void SetText(BSTR& bsText)
|
|
{
|
|
ClearNoAttack();
|
|
size_t nLen = GetStringLen(bsText);
|
|
|
|
WriteString(bsText, nLen);
|
|
|
|
for (size_t i = 0; i < nLen; ++i)
|
|
{
|
|
if (WCHAR(8233) == m_pData[i])
|
|
m_pData[i] = WCHAR(' ');
|
|
}
|
|
}
|
|
__forceinline void AddSpace()
|
|
{
|
|
AddSize(1);
|
|
*m_pDataCur = wchar_t(' ');
|
|
|
|
++m_lSizeCur;
|
|
++m_pDataCur;
|
|
}
|
|
__forceinline void CorrectUnicode(const BYTE* pUnicodeChecker)
|
|
{
|
|
if (NULL != pUnicodeChecker)
|
|
{
|
|
wchar_t* pMemory = m_pData;
|
|
while (pMemory < m_pDataCur)
|
|
{
|
|
if (!pUnicodeChecker[*pMemory])
|
|
*pMemory = wchar_t(' ');
|
|
++pMemory;
|
|
}
|
|
}
|
|
}
|
|
__forceinline void RemoveLastSpaces()
|
|
{
|
|
wchar_t* pMemory = m_pDataCur - 1;
|
|
while ((pMemory > m_pData) && (wchar_t(' ') == *pMemory))
|
|
{
|
|
--pMemory;
|
|
--m_lSizeCur;
|
|
--m_pDataCur;
|
|
}
|
|
|
|
}
|
|
__forceinline bool IsSpace()
|
|
{
|
|
if (1 != m_lSizeCur)
|
|
return false;
|
|
return (wchar_t(' ') == *m_pData);
|
|
}
|
|
|
|
public:
|
|
__forceinline void WriteString(wchar_t* pString, const size_t& nLen)
|
|
{
|
|
AddSize(nLen);
|
|
//memcpy(m_pDataCur, pString, nLen * sizeof(wchar_t));
|
|
memcpy(m_pDataCur, pString, nLen << 1);
|
|
m_pDataCur += nLen;
|
|
m_lSizeCur += nLen;
|
|
}
|
|
__forceinline size_t GetCurSize()
|
|
{
|
|
return m_lSizeCur;
|
|
}
|
|
__forceinline size_t GetSize()
|
|
{
|
|
return m_lSize;
|
|
}
|
|
__forceinline void Clear()
|
|
{
|
|
RELEASEMEM(m_pData);
|
|
|
|
m_pData = NULL;
|
|
m_lSize = 0;
|
|
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = 0;
|
|
}
|
|
__forceinline void ClearNoAttack()
|
|
{
|
|
m_pDataCur = m_pData;
|
|
m_lSizeCur = 0;
|
|
}
|
|
|
|
__forceinline size_t GetStringLen(wchar_t* pData)
|
|
{
|
|
wchar_t* s = pData;
|
|
for (; *s != 0; ++s);
|
|
return (size_t)(s - pData);
|
|
}
|
|
|
|
__forceinline CString GetCString()
|
|
{
|
|
CString str(m_pData, (int)m_lSizeCur);
|
|
return str;
|
|
}
|
|
__forceinline wchar_t* GetBuffer()
|
|
{
|
|
return m_pData;
|
|
}
|
|
};
|
|
|
|
class CStringWriter : public CTextItem
|
|
{
|
|
public:
|
|
CStringWriter() : CTextItem()
|
|
{
|
|
}
|
|
virtual ~CStringWriter()
|
|
{
|
|
}
|
|
|
|
public:
|
|
|
|
__forceinline void WriteString(_bstr_t& bsString)
|
|
{
|
|
size_t nLen = bsString.length();
|
|
CTextItem::WriteString(bsString.GetBSTR(), nLen);
|
|
}
|
|
__forceinline void WriteString(CString& sString)
|
|
{
|
|
size_t nLen = (size_t)sString.GetLength();
|
|
|
|
#ifdef _UNICODE
|
|
CTextItem::WriteString(sString.GetBuffer(), nLen);
|
|
#else
|
|
CStringW str = (CStringW)sString;
|
|
WriteString(str.GetBuffer(), nLen);
|
|
#endif
|
|
}
|
|
__forceinline void WriteStringC(const CString& sString)
|
|
{
|
|
CString* pPointer = const_cast<CString*>(&sString);
|
|
|
|
size_t nLen = (size_t)pPointer->GetLength();
|
|
|
|
#ifdef _UNICODE
|
|
CTextItem::WriteString(pPointer->GetBuffer(), nLen);
|
|
#else
|
|
CStringW str = (CStringW)sString;
|
|
WriteString(str.GetBuffer(), nLen);
|
|
#endif
|
|
}
|
|
__forceinline void WriteString(wchar_t* pString, const size_t& nLen)
|
|
{
|
|
CTextItem::WriteString(pString, nLen);
|
|
}
|
|
__forceinline void Write(CStringWriter& oWriter)
|
|
{
|
|
CTextItem::WriteString(oWriter.m_pData, oWriter.m_lSizeCur);
|
|
}
|
|
};
|
|
|
|
class CFontInfoJS
|
|
{
|
|
public:
|
|
CString m_sName;
|
|
|
|
LONG m_lIndexR;
|
|
LONG m_lFaceIndexR;
|
|
LONG m_lIndexI;
|
|
LONG m_lFaceIndexI;
|
|
LONG m_lIndexB;
|
|
LONG m_lFaceIndexB;
|
|
LONG m_lIndexBI;
|
|
LONG m_lFaceIndexBI;
|
|
|
|
CFontInfoJS()
|
|
{
|
|
m_sName = _T("");
|
|
|
|
m_lIndexR = -1;
|
|
m_lFaceIndexR = -1;
|
|
m_lIndexI = -1;
|
|
m_lFaceIndexI = -1;
|
|
m_lIndexB = -1;
|
|
m_lFaceIndexB = -1;
|
|
m_lIndexBI = -1;
|
|
m_lFaceIndexBI = -1;
|
|
}
|
|
|
|
CFontInfoJS(const CFontInfoJS& oSrc)
|
|
{
|
|
*this = oSrc;
|
|
}
|
|
|
|
CFontInfoJS& operator=(const CFontInfoJS& oSrc)
|
|
{
|
|
m_sName = oSrc.m_sName;
|
|
|
|
m_lIndexR = oSrc.m_lIndexR;
|
|
m_lIndexI = oSrc.m_lIndexI;
|
|
m_lIndexB = oSrc.m_lIndexB;
|
|
m_lIndexBI = oSrc.m_lIndexBI;
|
|
|
|
m_lFaceIndexR = oSrc.m_lFaceIndexR;
|
|
m_lFaceIndexI = oSrc.m_lFaceIndexI;
|
|
m_lFaceIndexB = oSrc.m_lFaceIndexB;
|
|
m_lFaceIndexBI = oSrc.m_lFaceIndexBI;
|
|
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
void DumpJSFontFile(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
int nEnd = strFontId.ReverseFind('.');
|
|
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
DWORD dwCount = (DWORD)oFileFontFile.GetFileSize();
|
|
BYTE* pBuffer = new BYTE[dwCount];
|
|
oFileFontFile.ReadFile(pBuffer, dwCount);
|
|
oFileFontFile.CloseFile();
|
|
|
|
CStringWriter oWriter;
|
|
oWriter.WriteString(_T("gFontArraysObj[\"") + strFontId + _T("\"] = ["));
|
|
bstr_t b = L",";
|
|
|
|
for (DWORD lIndexByte = 0; lIndexByte < dwCount; ++lIndexByte)
|
|
{
|
|
if (0 != lIndexByte)
|
|
oWriter.WriteString(b);
|
|
|
|
CString strNum = _T("");
|
|
strNum.Format(_T("%d"), pBuffer[lIndexByte]);
|
|
oWriter.WriteString(strNum);
|
|
}
|
|
|
|
CString str2 = _T("];\ngFontNamesObj[gFontNamesObj.length - 1] = \"") + strFontId +
|
|
_T("\";\n_STDIO.prepare(\"") + strFontId + _T("\", gFontArraysObj[\"") + strFontId + _T("\"]);");
|
|
|
|
oWriter.WriteString(str2);
|
|
|
|
RELEASEARRAYOBJECTS(pBuffer);
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
CStringA strA = (CStringA)oWriter.GetCString();
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
oFileFontFileJS.CloseFile();
|
|
}
|
|
|
|
void DumpJSFontFile2(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
int nEnd = strFontId.ReverseFind('.');
|
|
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
DWORD dwCount = (DWORD)oFileFontFile.GetFileSize();
|
|
BYTE* pBuffer = new BYTE[dwCount];
|
|
oFileFontFile.ReadFile(pBuffer, dwCount);
|
|
oFileFontFile.CloseFile();
|
|
|
|
CString strFileLen = _T("");
|
|
strFileLen.Format(_T("%u"), dwCount);
|
|
|
|
CString strFontID = _T("gFontArraysObj[\"") + strFontId + _T("\"]");
|
|
|
|
CStringWriter oWriter;
|
|
CString _t1 = strFontID + _T(" = CreateFontArray(") + strFileLen + _T(");");
|
|
oWriter.WriteString(_t1);
|
|
bstr_t b = L",";
|
|
|
|
CString strFontNum = _T("");
|
|
strFontNum.Format(_T("%d"), lFontIndex);
|
|
CString _t2 = _T("function createFont") + strFontNum + _T("(){var p = ") + strFontID + _T(".data;var i = 0;\n");
|
|
oWriter.WriteString(_t2);
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
|
|
LONG lCurrentCount = 0;
|
|
for (DWORD lIndexByte = 0; lIndexByte < dwCount; ++lIndexByte)
|
|
{
|
|
++lCurrentCount;
|
|
CString strWrite = _T("");
|
|
strWrite.Format(_T("p[i++]=%d;"), pBuffer[lIndexByte]);
|
|
oWriter.WriteString(strWrite);
|
|
|
|
if (lCurrentCount > 1000000)
|
|
{
|
|
lCurrentCount = 0;
|
|
CStringA strA = (CStringA)oWriter.GetCString();
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
oWriter.ClearNoAttack();
|
|
}
|
|
}
|
|
|
|
CString _t3 = _T("}\ncreateFont") + strFontNum + _T("();\ngFontNamesObj[gFontNamesObj.length - 1] = \"") + strFontId +
|
|
_T("\";\n_STDIO.prepare(\"") + strFontId + _T("\", gFontArraysObj[\"") + strFontId + _T("\"]);");
|
|
|
|
oWriter.WriteString(_t3);
|
|
|
|
RELEASEARRAYOBJECTS(pBuffer);
|
|
|
|
CStringA strA = (CStringA)oWriter.GetCString();
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
oFileFontFileJS.CloseFile();
|
|
}
|
|
|
|
void DumpJSFontFile3(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
int nEnd = strFontId.ReverseFind('.');
|
|
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
DWORD dwCount = (DWORD)oFileFontFile.GetFileSize();
|
|
|
|
LONG __lcount = (LONG)(dwCount + 3) / 4;
|
|
double __dcount = (double)__lcount;
|
|
double __dcountsize = sqrt(__dcount);
|
|
|
|
LONG lSizeX = (LONG)sqrt(__dcount) + 1;
|
|
LONG lSizeY = lSizeX;
|
|
|
|
//if (lSizeX * lSizeY < __lcount)
|
|
// lSizeY += 1;
|
|
|
|
MediaCore::IAVSUncompressedVideoFrame* pUnkFrame = NULL;
|
|
CoCreateInstance(MediaCore::CLSID_CAVSUncompressedVideoFrame, NULL, CLSCTX_ALL, MediaCore::IID_IAVSUncompressedVideoFrame, (void**)&pUnkFrame);
|
|
|
|
pUnkFrame->put_ColorSpace( ( 1 << 6) ); // CPS_BGRA | CPS_FLIP
|
|
pUnkFrame->put_Width( lSizeX );
|
|
pUnkFrame->put_Height( lSizeY );
|
|
pUnkFrame->put_AspectRatioX( lSizeX );
|
|
pUnkFrame->put_AspectRatioY( lSizeY );
|
|
pUnkFrame->put_Interlaced( VARIANT_FALSE );
|
|
pUnkFrame->put_Stride( 0, 4 * lSizeX );
|
|
pUnkFrame->AllocateBuffer( -1 );
|
|
|
|
BYTE* pBuffer = NULL;
|
|
pUnkFrame->get_Buffer(&pBuffer);
|
|
memset(pBuffer, 0, 4 * lSizeX * lSizeY);
|
|
|
|
oFileFontFile.ReadFile(pBuffer, dwCount);
|
|
oFileFontFile.CloseFile();
|
|
|
|
ImageStudio::IImageTransforms* pTransform = NULL;
|
|
CoCreateInstance(ImageStudio::CLSID_ImageTransforms, NULL, CLSCTX_ALL, ImageStudio::IID_IImageTransforms, (void**)&pTransform);
|
|
|
|
VARIANT var;
|
|
var.vt = VT_UNKNOWN;
|
|
var.punkVal = (IUnknown*)pUnkFrame;
|
|
|
|
VARIANT_BOOL vbSuccess = VARIANT_FALSE;
|
|
pTransform->SetSource(0, var);
|
|
pTransform->SetXml(L"<ImageFile-SaveAsPng destinationpath=\"C:\\1.png\" format=\"8888\"/>", &vbSuccess);
|
|
pTransform->Transform(&vbSuccess);
|
|
|
|
RELEASEINTERFACE(pUnkFrame);
|
|
RELEASEINTERFACE(pTransform);
|
|
|
|
if (TRUE)
|
|
{
|
|
if (_T("arial") == strFontId)
|
|
{
|
|
CopyFile(_T("C:\\1.png"), _T("C:\\arial.png"), FALSE);
|
|
}
|
|
}
|
|
|
|
CFile oImageFile;
|
|
oImageFile.OpenFile(_T("C:\\1.png"));
|
|
int nInputLen = (int)oImageFile.GetFileSize();
|
|
BYTE* pData = new BYTE[nInputLen];
|
|
oImageFile.ReadFile(pData, nInputLen);
|
|
oImageFile.CloseFile();
|
|
|
|
int nOutputLen = Base64EncodeGetRequiredLength(nInputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
BYTE* pOutput = new BYTE[nOutputLen];
|
|
Base64Encode(pData, nInputLen, (LPSTR)pOutput, &nOutputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
|
|
/*
|
|
BYTE* pMemory = new BYTE[2 * nOutputLen];
|
|
BYTE* pCurrentMemory = pMemory;
|
|
BYTE* pCurrentOutput = pOutput;
|
|
BYTE* pEnd = pOutput + nOutputLen;
|
|
|
|
BYTE dump[3];
|
|
dump[0] = BYTE('\\');
|
|
dump[1] = 0x0D;
|
|
dump[2] = 0x0A;
|
|
|
|
int n = 0;
|
|
while (true)
|
|
{
|
|
if ((pCurrentOutput + 76) >= pEnd)
|
|
{
|
|
memcpy(pCurrentMemory, pCurrentOutput, (pEnd - pCurrentOutput));
|
|
pCurrentMemory += (pEnd - pCurrentOutput);
|
|
break;
|
|
}
|
|
memcpy(pCurrentMemory, pCurrentOutput, 76);
|
|
pCurrentMemory += 76;
|
|
pCurrentOutput += 76;
|
|
|
|
memcpy(pCurrentMemory, dump, 3);
|
|
pCurrentMemory += 3;
|
|
pCurrentOutput += 2;
|
|
}
|
|
*/
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
|
|
CString strNum = _T("");
|
|
strNum.Format(_T("%d"), lFontIndex);
|
|
strNum = _T("__font_image") + strNum;
|
|
|
|
CString strNumF = _T("");
|
|
strNumF.Format(_T("g_fontFiles[%d].IsLoaded = true;}\n"), lFontIndex);
|
|
|
|
CString str = _T("var ") + strNum + _T("=new Image();\n") + strNum + _T(".onload=function(){\ngFontArraysObj[\"") + strFontId + _T("\"] = CreateFontData(") + strNum + _T(");\n");
|
|
str += (_T("delete ") + strNum + _T(";\ngFontNamesObj[gFontNamesObj.length - 1] = \"") + strFontId + _T("\";\n_STDIO.prepare(\""));
|
|
str += (strFontId + _T("\", gFontArraysObj[\"") + strFontId + _T("\"]);\n") + strNumF);
|
|
|
|
CStringA strA = (CStringA)str;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
|
|
str = strNum + _T(".src = \"data:image/png;base64,");
|
|
strA = (CStringA)str;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
|
|
//oFileFontFileJS.WriteFile((void*)pMemory, (DWORD)(pCurrentMemory - pMemory));
|
|
oFileFontFileJS.WriteFile((void*)pOutput, (DWORD)(nOutputLen));
|
|
|
|
str = _T("\";");
|
|
strA = (CStringA)str;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
|
|
oFileFontFileJS.CloseFile();
|
|
|
|
//RELEASEARRAYOBJECTS(pMemory);
|
|
RELEASEARRAYOBJECTS(pOutput);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
|
|
void DumpJSFontFile4(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
int nEnd = strFontId.ReverseFind('.');
|
|
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
|
|
int nInputLen = (int)oFileFontFile.GetFileSize();
|
|
BYTE* pData = new BYTE[nInputLen];
|
|
oFileFontFile.ReadFile(pData, (DWORD)nInputLen);
|
|
|
|
int nOutputLen = Base64EncodeGetRequiredLength(nInputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
BYTE* pOutput = new BYTE[nOutputLen];
|
|
Base64Encode(pData, nInputLen, (LPSTR)pOutput, &nOutputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
|
|
CString strNum = _T("");
|
|
strNum.Format(_T("%d"), lFontIndex);
|
|
strNum = _T("__font_data") + strNum;
|
|
|
|
CStringA strA;
|
|
|
|
CString t1 = _T("var ") + strNum + _T("=\"");
|
|
strA = (CStringA)t1;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
oFileFontFileJS.WriteFile((void*)pOutput, (DWORD)(nOutputLen));
|
|
|
|
CString strNumF = _T("");
|
|
strNumF.Format(_T("g_fontFiles[%d].IsLoaded = true;\n"), lFontIndex);
|
|
|
|
CString strDecodeLen = _T("");
|
|
strDecodeLen.Format(_T(",%d);\n"), nInputLen);
|
|
|
|
CString t2 = _T("\";\ngFontArraysObj[\"") + strFontId + _T("\"] = CreateFontData2(") + strNum + strDecodeLen;
|
|
t2 += (_T("delete ") + strNum + _T(";\ngFontNamesObj[gFontNamesObj.length - 1] = \"") + strFontId + _T("\";\n_STDIO.prepare(\""));
|
|
t2 += (strFontId + _T("\", gFontArraysObj[\"") + strFontId + _T("\"]);\n") + strNumF);
|
|
|
|
strA = (CStringA)t2;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
|
|
oFileFontFileJS.CloseFile();
|
|
|
|
RELEASEARRAYOBJECTS(pOutput);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
void DumpJSFontFile5(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
int nEnd = strFontId.ReverseFind('.');
|
|
strFontId = strFontId.Mid(nStart + 1, nEnd - nStart - 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
|
|
int nInputLen = (int)oFileFontFile.GetFileSize();
|
|
BYTE* pData = new BYTE[nInputLen];
|
|
oFileFontFile.ReadFile(pData, (DWORD)nInputLen);
|
|
|
|
int nOutputLen = Base64EncodeGetRequiredLength(nInputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
BYTE* pOutput = new BYTE[nOutputLen];
|
|
Base64Encode(pData, nInputLen, (LPSTR)pOutput, &nOutputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
|
|
CString strNum = _T("");
|
|
strNum.Format(_T("%d"), lFontIndex);
|
|
strNum = _T("__font_data") + strNum;
|
|
|
|
CStringA strA;
|
|
|
|
CString t1 = _T("var ") + strNum + _T("=\"");
|
|
strA = (CStringA)t1;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
oFileFontFileJS.WriteFile((void*)pOutput, (DWORD)(nOutputLen));
|
|
|
|
CString strRes = _T("");
|
|
strRes.Format(_T("\";\nvar __font_data%d_idx = g_fonts_streams.length;\n\
|
|
g_fonts_streams[__font_data%d_idx] = CreateFontData2(__font_data%d,%d);\n\
|
|
__font_data%d = null;\n\
|
|
g_font_files[%d].SetStreamIndex(__font_data%d_idx);"), lFontIndex, lFontIndex, lFontIndex, nInputLen, lFontIndex, lFontIndex, lFontIndex);
|
|
strA = (CStringA)strRes;
|
|
oFileFontFileJS.WriteFile((void*)strA.GetBuffer(), (DWORD)strA.GetLength());
|
|
|
|
oFileFontFileJS.CloseFile();
|
|
|
|
RELEASEARRAYOBJECTS(pOutput);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
|
|
void DumpJSFontFile6(const CString& strPath, CString strDirectory, LONG lFontIndex)
|
|
{
|
|
CString strFontId = strPath;
|
|
|
|
strFontId.Replace(_T("\\\\"), _T("\\"));
|
|
strFontId.Replace(_T("/"), _T("\\"));
|
|
int nStart = strFontId.ReverseFind('\\');
|
|
strFontId = strFontId.Mid(nStart + 1);
|
|
|
|
CFile oFileFontFile;
|
|
oFileFontFile.OpenFile(strPath);
|
|
|
|
int nInputLen = (int)oFileFontFile.GetFileSize();
|
|
BYTE* pData = new BYTE[nInputLen];
|
|
oFileFontFile.ReadFile(pData, (DWORD)nInputLen);
|
|
|
|
int nOutputLen = Base64EncodeGetRequiredLength(nInputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
BYTE* pOutput = new BYTE[nOutputLen];
|
|
Base64Encode(pData, nInputLen, (LPSTR)pOutput, &nOutputLen, ATL_BASE64_FLAG_NOCRLF);
|
|
|
|
CString sFilePathDst = strDirectory + _T("\\") + strFontId + _T(".js");
|
|
CFile oFileFontFileJS;
|
|
oFileFontFileJS.CreateFile(sFilePathDst);
|
|
|
|
BYTE utf8_flag[3];
|
|
utf8_flag[2] = 0xEF;
|
|
utf8_flag[1] = 0xBB;
|
|
utf8_flag[0] = 0xBF;
|
|
oFileFontFileJS.WriteFile2((void*)utf8_flag, 3);
|
|
|
|
CString strWrite = _T("window[\"");
|
|
strWrite += strFontId;
|
|
strWrite += _T("\"] = \"");
|
|
|
|
CString strLen = _T("");
|
|
strLen.Format(_T("%d;"), nInputLen);
|
|
strWrite += strLen;
|
|
|
|
oFileFontFileJS.WriteStringUTF8(strWrite);
|
|
oFileFontFileJS.WriteFile((void*)pOutput, (DWORD)(nOutputLen));
|
|
|
|
strWrite = _T("\";");
|
|
oFileFontFileJS.WriteStringUTF8(strWrite);
|
|
oFileFontFileJS.CloseFile();
|
|
|
|
RELEASEARRAYOBJECTS(pOutput);
|
|
RELEASEARRAYOBJECTS(pData);
|
|
}
|
|
|
|
void DumpToJSEditor(CString strDirectory, bool bIsUnionFamily);
|
|
};
|
|
|