Adding in new .cpp versions of FT font code.
This commit is contained in:
91
src/osgText/FTCharmap.cpp
Normal file
91
src/osgText/FTCharmap.cpp
Normal file
@@ -0,0 +1,91 @@
|
||||
#include "FTCharmap.h"
|
||||
|
||||
|
||||
FTCharmap::FTCharmap( FT_Face face)
|
||||
: err(0),
|
||||
ftFace( face)
|
||||
{
|
||||
ftEncoding = face->charmap->encoding;
|
||||
}
|
||||
|
||||
|
||||
FTCharmap::~FTCharmap()
|
||||
{
|
||||
charMap.clear();
|
||||
}
|
||||
|
||||
|
||||
bool FTCharmap::CharMap( FT_Encoding encoding)
|
||||
{
|
||||
if( ftEncoding == encoding)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
err = FT_Select_Charmap( ftFace, encoding );
|
||||
|
||||
if( !err)
|
||||
{
|
||||
ftEncoding = encoding;
|
||||
charMap.clear();
|
||||
}
|
||||
|
||||
return !err;
|
||||
}
|
||||
|
||||
|
||||
bool FTCharmap::CharMap( FT_UShort platform, FT_UShort encoding)
|
||||
{
|
||||
FT_CharMap found = 0;
|
||||
FT_CharMap charmap;
|
||||
|
||||
for( int n = 0; n < ftFace->num_charmaps; n++ )
|
||||
{
|
||||
charmap = ftFace->charmaps[n];
|
||||
|
||||
if( charmap->platform_id == platform && charmap->encoding_id == encoding)
|
||||
{
|
||||
found = charmap;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if( !found )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if( ftEncoding == found->encoding)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/* now, select the charmap for the face object */
|
||||
err = FT_Set_Charmap( ftFace, found );
|
||||
|
||||
if( !err)
|
||||
{
|
||||
ftEncoding = found->encoding;
|
||||
charMap.clear();
|
||||
}
|
||||
|
||||
return !err;
|
||||
}
|
||||
|
||||
|
||||
unsigned int FTCharmap::CharIndex( unsigned int index )
|
||||
{
|
||||
CharacterMap::const_iterator result = charMap.find( index);
|
||||
|
||||
if( result == charMap.end())
|
||||
{
|
||||
unsigned int glyph = FT_Get_Char_Index( ftFace, index);
|
||||
charMap.insert( CharacterMap::value_type( index, glyph));
|
||||
return glyph;
|
||||
}
|
||||
else
|
||||
{
|
||||
return result->second;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user