#include "FTGlyphContainer.h" #include "FTGlyph.h" #include "FTFace.h" #include "FTCharmap.h" FTGlyphContainer::FTGlyphContainer( FTFace* f) : face(f), err(0) { glyphs.push_back( NULL); charMap = new FTCharmap( face); } FTGlyphContainer::~FTGlyphContainer() { GlyphVector::iterator glyphIterator; for( glyphIterator = glyphs.begin(); glyphIterator != glyphs.end(); ++glyphIterator) { delete *glyphIterator; } glyphs.clear(); delete charMap; } bool FTGlyphContainer::CharMap( FT_Encoding encoding) { bool result = charMap->CharMap( encoding); err = charMap->Error(); return result; } unsigned int FTGlyphContainer::FontIndex( const unsigned int characterCode) const { return charMap->FontIndex( characterCode); } void FTGlyphContainer::Add( FTGlyph* tempGlyph, const unsigned int characterCode) { charMap->InsertIndex( characterCode, glyphs.size()); glyphs.push_back( tempGlyph); } const FTGlyph* const FTGlyphContainer::Glyph( const unsigned int characterCode) const { signed int index = charMap->GlyphListIndex( characterCode); return glyphs[index]; } FTBBox FTGlyphContainer::BBox( const unsigned int characterCode) const { return glyphs[charMap->GlyphListIndex( characterCode)]->BBox(); } float FTGlyphContainer::Advance( const unsigned int characterCode, const unsigned int nextCharacterCode) { unsigned int left = charMap->FontIndex( characterCode); unsigned int right = charMap->FontIndex( nextCharacterCode); float width = face->KernAdvance( left, right).X(); width += glyphs[charMap->GlyphListIndex( characterCode)]->Advance().X(); return width; } FTPoint FTGlyphContainer::Render( const unsigned int characterCode, const unsigned int nextCharacterCode, FTPoint penPosition) { FTPoint kernAdvance, advance; unsigned int left = charMap->FontIndex( characterCode); unsigned int right = charMap->FontIndex( nextCharacterCode); kernAdvance = face->KernAdvance( left, right); if( !face->Error()) { advance = glyphs[charMap->GlyphListIndex( characterCode)]->Render( penPosition); } kernAdvance += advance; return kernAdvance; }