00001 #include "FTFace.h"
00002 #include "FTLibrary.h"
00003
00004 #include FT_TRUETYPE_TABLES_H
00005
00006 FTFace::FTFace( const char* fontFilePath)
00007 : numGlyphs(0),
00008 fontEncodingList(0),
00009 err(0)
00010 {
00011 const FT_Long DEFAULT_FACE_INDEX = 0;
00012 ftFace = new FT_Face;
00013
00014 err = FT_New_Face( *FTLibrary::Instance().GetLibrary(), fontFilePath, DEFAULT_FACE_INDEX, ftFace);
00015
00016 if( err)
00017 {
00018 delete ftFace;
00019 ftFace = 0;
00020 }
00021 else
00022 {
00023 numGlyphs = (*ftFace)->num_glyphs;
00024 hasKerningTable = FT_HAS_KERNING((*ftFace));
00025 }
00026 }
00027
00028
00029 FTFace::FTFace( const unsigned char *pBufferBytes, size_t bufferSizeInBytes)
00030 : numGlyphs(0),
00031 err(0)
00032 {
00033 const FT_Long DEFAULT_FACE_INDEX = 0;
00034 ftFace = new FT_Face;
00035
00036 err = FT_New_Memory_Face( *FTLibrary::Instance().GetLibrary(), (FT_Byte *)pBufferBytes, bufferSizeInBytes, DEFAULT_FACE_INDEX, ftFace);
00037
00038 if( err)
00039 {
00040 delete ftFace;
00041 ftFace = 0;
00042 }
00043 else
00044 {
00045 numGlyphs = (*ftFace)->num_glyphs;
00046 }
00047 }
00048
00049
00050 FTFace::~FTFace()
00051 {
00052 if( ftFace)
00053 {
00054 FT_Done_Face( *ftFace);
00055 delete ftFace;
00056 ftFace = 0;
00057 }
00058 }
00059
00060
00061 bool FTFace::Attach( const char* fontFilePath)
00062 {
00063 err = FT_Attach_File( *ftFace, fontFilePath);
00064 return !err;
00065 }
00066
00067
00068 bool FTFace::Attach( const unsigned char *pBufferBytes, size_t bufferSizeInBytes)
00069 {
00070 FT_Open_Args open;
00071
00072 open.flags = FT_OPEN_MEMORY;
00073 open.memory_base = (FT_Byte *)pBufferBytes;
00074 open.memory_size = bufferSizeInBytes;
00075
00076 err = FT_Attach_Stream( *ftFace, &open);
00077 return !err;
00078 }
00079
00080
00081 const FTSize& FTFace::Size( const unsigned int size, const unsigned int res)
00082 {
00083 charSize.CharSize( ftFace, size, res, res);
00084 err = charSize.Error();
00085
00086 return charSize;
00087 }
00088
00089
00090 unsigned int FTFace::CharMapCount()
00091 {
00092 return (*ftFace)->num_charmaps;
00093 }
00094
00095
00096 FT_Encoding* FTFace::CharMapList()
00097 {
00098 if( 0 == fontEncodingList)
00099 {
00100 fontEncodingList = new FT_Encoding[CharMapCount()];
00101 for( size_t encodingIndex = 0; encodingIndex < CharMapCount(); ++encodingIndex)
00102 {
00103 fontEncodingList[encodingIndex] = (*ftFace)->charmaps[encodingIndex]->encoding;
00104 }
00105 }
00106
00107 return fontEncodingList;
00108 }
00109
00110
00111 FTPoint FTFace::KernAdvance( unsigned int index1, unsigned int index2)
00112 {
00113 float x, y;
00114 x = y = 0.0f;
00115
00116 if( hasKerningTable && index1 && index2)
00117 {
00118 FT_Vector kernAdvance;
00119 kernAdvance.x = kernAdvance.y = 0;
00120
00121 err = FT_Get_Kerning( *ftFace, index1, index2, ft_kerning_unfitted, &kernAdvance);
00122 if( !err)
00123 {
00124 x = static_cast<float>( kernAdvance.x) / 64.0f;
00125 y = static_cast<float>( kernAdvance.y) / 64.0f;
00126 }
00127 }
00128
00129 return FTPoint( x, y, 0.0);
00130 }
00131
00132
00133 FT_GlyphSlot FTFace::Glyph( unsigned int index, FT_Int load_flags)
00134 {
00135 err = FT_Load_Glyph( *ftFace, index, load_flags);
00136 if( err)
00137 {
00138 return NULL;
00139 }
00140
00141 return (*ftFace)->glyph;
00142 }
00143