Files
core/ASCImageStudio3/ASCGraphics/Objects/Font/FT_FontFile.cpp
Oleg.Korshul c3cb7fd17d (1.0.1.175) unhandle uncorrect font
git-svn-id: svn://fileserver/activex/AVS/Sources/TeamlabOffice/trunk/ServerComponents@53940 954022d7-b5bf-4e40-9824-e11837661b57
2016-05-20 22:39:35 +03:00

93 lines
2.6 KiB
C++

#include "stdafx.h"
#include "FT_FontEngine.h"
#include "FT_Font.h"
#include "FT_FontFile.h"
//-------------------------------------------------------------------------------------------------------------------------------
// CFreeTypeFontFile
//-------------------------------------------------------------------------------------------------------------------------------
CFontFile *CFreeTypeFontFile::LoadFont(CFreeTypeFontEngine *pEngine, wchar_t *wsFileName, long lIndex)
{
USES_CONVERSION;
FT_Face pFace = NULL;
// îòêðûâàåì ôàéë
HANDLE hFile = CreateFile( (LPCWSTR)wsFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
return NULL; // Íåâîçìîæíî îòêðûòü ôàéë
// ìàïèì ýòîò ôàéë â ïàìÿòü - òàê áûñòðåå ÷èòàþòñÿ äàííûå èç ôàéëà
DWORD nFileSize = GetFileSize(hFile, NULL);
HANDLE hMapFile = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, nFileSize, NULL);
if (NULL == hMapFile)
{
CloseHandle( hFile );
return NULL; // Íåâîçìîæíî ñîçäàòü îòîáðàæåíèå ôàéëà
}
void *pBaseAddress = MapViewOfFile( hMapFile, FILE_MAP_READ, 0, 0, 0 );
if ( !pBaseAddress )
{
CloseHandle( hMapFile );
CloseHandle( hFile );
return NULL;
}
FT_Open_Args oOpenArgs;
oOpenArgs.flags = FT_OPEN_MEMORY;
oOpenArgs.memory_base = (BYTE*)pBaseAddress;
oOpenArgs.memory_size = (FT_Long)nFileSize;
if ( FT_Open_Face( pEngine->m_pLibrary, &oOpenArgs, lIndex, &pFace ) )
//if ( FT_New_Face( pEngine->m_pLibrary, W2A( wsFileName ), lIndex, &pFace ) )
{
if ( pBaseAddress )
UnmapViewOfFile( pBaseAddress );
CloseHandle( hMapFile );
CloseHandle( hFile );
return NULL;
}
if ( NULL == pFace->charmap && 0 != pFace->num_charmaps )
FT_Set_Charmap( pFace, pFace->charmaps[0] );
return new CFreeTypeFontFile( pEngine, wsFileName, lIndex, pFace, hFile, hMapFile, pBaseAddress );
}
CFreeTypeFontFile::CFreeTypeFontFile(CFreeTypeFontEngine *pEngine, wchar_t *wsFileName, long lIndex, FT_Face pFace, HANDLE hFile, HANDLE hMapFile, void *pBaseAddress):
CFontFile(wsFileName, lIndex)
{
m_pEngine = pEngine;
m_pFace = pFace;
m_pBaseAddress = pBaseAddress;
m_hFile = hFile;
m_hMapFile = hMapFile;
}
CFreeTypeFontFile::~CFreeTypeFontFile()
{
if ( m_pFace )
{
FT_Done_Face( m_pFace );
}
if ( m_pBaseAddress )
UnmapViewOfFile( m_pBaseAddress );
if ( m_hMapFile )
CloseHandle( m_hMapFile );
if ( m_hFile )
CloseHandle( m_hFile );
}
CFont *CFreeTypeFontFile::MakeFont()
{
CFont *pFont = new CFreeTypeFont( this );
pFont->InitCache();
return pFont;
}