| #include "FTOutlineGlyph.h" |
| #include "FTVectoriser.h" |
| |
| |
| FTOutlineGlyph::FTOutlineGlyph( FT_GlyphSlot glyph, bool useDisplayList) |
| : FTGlyph( glyph), |
| glList(0) |
| { |
| if( ft_glyph_format_outline != glyph->format) |
| { |
| err = 0x14; // Invalid_Outline |
| return; |
| } |
| |
| FTVectoriser vectoriser( glyph); |
| |
| size_t numContours = vectoriser.ContourCount(); |
| if ( ( numContours < 1) || ( vectoriser.PointCount() < 3)) |
| { |
| return; |
| } |
| |
| if(useDisplayList) |
| { |
| glList = glGenLists(1); |
| glNewList( glList, GL_COMPILE); |
| } |
| |
| for( unsigned int c = 0; c < numContours; ++c) |
| { |
| const FTContour* contour = vectoriser.Contour(c); |
| |
| glBegin( GL_LINE_LOOP); |
| for( unsigned int pointIndex = 0; pointIndex < contour->PointCount(); ++pointIndex) |
| { |
| FTPoint point = contour->Point(pointIndex); |
| glVertex2f( point.X() / 64.0f, point.Y() / 64.0f); |
| } |
| glEnd(); |
| } |
| |
| if(useDisplayList) |
| { |
| glEndList(); |
| } |
| } |
| |
| |
| FTOutlineGlyph::~FTOutlineGlyph() |
| { |
| glDeleteLists( glList, 1); |
| } |
| |
| |
| const FTPoint& FTOutlineGlyph::Render( const FTPoint& pen) |
| { |
| glTranslatef( pen.X(), pen.Y(), 0.0f); |
| |
| if( glList) |
| { |
| glCallList( glList); |
| } |
| |
| return advance; |
| } |
| |