92 lines
2.2 KiB
C++
92 lines
2.2 KiB
C++
|
#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;
|
||
|
}
|