#include "FTPolyGlyph.h" #include "FTVectoriser.h" FTPolyGlyph::FTPolyGlyph( FT_GlyphSlot glyph, bool useDisplayList) : FTGlyph( glyph), glList(0) { if( ft_glyph_format_outline != glyph->format) { err = 0x14; // Invalid_Outline return; } FTVectoriser vectoriser( glyph); if(( vectoriser.ContourCount() < 1) || ( vectoriser.PointCount() < 3)) { return; } unsigned int horizontalTextureScale = glyph->face->size->metrics.x_ppem * 64; unsigned int verticalTextureScale = glyph->face->size->metrics.y_ppem * 64; vectoriser.MakeMesh( 1.0); if( useDisplayList) { glList = glGenLists( 1); glNewList( glList, GL_COMPILE); } const FTMesh* mesh = vectoriser.GetMesh(); for( unsigned int index = 0; index < mesh->TesselationCount(); ++index) { const FTTesselation* subMesh = mesh->Tesselation( index); unsigned int polyonType = subMesh->PolygonType(); glBegin( polyonType); for( unsigned int pointIndex = 0; pointIndex < subMesh->PointCount(); ++pointIndex) { FTPoint point = subMesh->Point(pointIndex); glTexCoord2f( point.X() / horizontalTextureScale, point.Y() / verticalTextureScale); glVertex3f( point.X() / 64.0f, point.Y() / 64.0f, 0.0f); } glEnd(); } if(useDisplayList) { glEndList(); } } FTPolyGlyph::~FTPolyGlyph() { glDeleteLists( glList, 1); } const FTPoint& FTPolyGlyph::Render( const FTPoint& pen) { glTranslatef( pen.X(), pen.Y(), 0.0f); if( glList) { glCallList( glList); } return advance; }