#include "FTFace.h" #include "FTLibrary.h" #include FT_TRUETYPE_TABLES_H FTFace::FTFace( const char* fontFilePath) : numGlyphs(0), fontEncodingList(0), err(0) { const FT_Long DEFAULT_FACE_INDEX = 0; ftFace = new FT_Face; err = FT_New_Face( *FTLibrary::Instance().GetLibrary(), fontFilePath, DEFAULT_FACE_INDEX, ftFace); if (err) { delete ftFace; ftFace = 0; } else { numGlyphs = (*ftFace)->num_glyphs; hasKerningTable = FT_HAS_KERNING((*ftFace)); } } FTFace::FTFace( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) : numGlyphs(0), err(0) { const FT_Long DEFAULT_FACE_INDEX = 0; ftFace = new FT_Face; err = FT_New_Memory_Face( *FTLibrary::Instance().GetLibrary(), (FT_Byte *)pBufferBytes, bufferSizeInBytes, DEFAULT_FACE_INDEX, ftFace); if (err) { delete ftFace; ftFace = 0; } else { numGlyphs = (*ftFace)->num_glyphs; } } FTFace::~FTFace() { if (ftFace) { FT_Done_Face( *ftFace); delete ftFace; ftFace = 0; } } bool FTFace::Attach( const char* fontFilePath) { err = FT_Attach_File( *ftFace, fontFilePath); return !err; } bool FTFace::Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes) { FT_Open_Args open; open.flags = FT_OPEN_MEMORY; open.memory_base = (FT_Byte *)pBufferBytes; open.memory_size = bufferSizeInBytes; err = FT_Attach_Stream( *ftFace, &open); return !err; } const FTSize& FTFace::Size( const unsigned int size, const unsigned int res) { charSize.CharSize( ftFace, size, res, res); err = charSize.Error(); return charSize; } unsigned int FTFace::CharMapCount() { return (*ftFace)->num_charmaps; } FT_Encoding* FTFace::CharMapList() { if (0 == fontEncodingList) { fontEncodingList = new FT_Encoding[CharMapCount()]; for (size_t encodingIndex = 0; encodingIndex < CharMapCount(); ++encodingIndex) { fontEncodingList[encodingIndex] = (*ftFace)->charmaps[encodingIndex]->encoding; } } return fontEncodingList; } FTPoint FTFace::KernAdvance( unsigned int index1, unsigned int index2) { float x, y; x = y = 0.0f; if (hasKerningTable && index1 && index2) { FT_Vector kernAdvance; kernAdvance.x = kernAdvance.y = 0; err = FT_Get_Kerning( *ftFace, index1, index2, ft_kerning_unfitted, &kernAdvance); if (!err) { x = static_cast( kernAdvance.x) / 64.0f; y = static_cast( kernAdvance.y) / 64.0f; } } return FTPoint( x, y, 0.0); } FT_GlyphSlot FTFace::Glyph( unsigned int index, FT_Int load_flags) { err = FT_Load_Glyph( *ftFace, index, load_flags); if (err) return NULL; return (*ftFace)->glyph; }