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