FTFace.cxx

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

Generated on Tue Jul 5 14:16:16 2011 for ROOT_528-00b_version by  doxygen 1.5.1