Hash :
1a6d8d57
Author :
Date :
2001-08-28T05:07:52
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#include "GL/gl.h"
#include "FTVectorGlyph.h"
#include "FTVectoriser.h"
#include "FTGL.h"
FTVectorGlyph::FTVectorGlyph( FT_Glyph glyph, unsigned int gi)
: FTGlyph(gi),
vectoriser(0),
numPoints(0),
numContours(0),
contourLength(0),
data(0),
glList(0)
{
if( ft_glyph_format_outline != glyph->format)
{ return;}
vectoriser = new FTVectoriser( glyph);
if( vectoriser->Ingest())
{
numContours = vectoriser->contours();
contourLength = new int[ numContours];
for( int c = 0; c < numContours; ++c)
{
contourLength[c] = vectoriser->contourSize( c);
}
numPoints = vectoriser->points();
data = new double[ numPoints * 3];
vectoriser->Output( data);
advance = glyph->advance.x >> 16; // this is 6 in the freetype docs!!!!!!
}
delete vectoriser;
if ( ( numContours < 1) || ( numPoints < 3)) // check this
return;
glList = glGenLists(1);
int d = 0;
glNewList( glList, GL_COMPILE);
for( int c = 0; c < numContours; ++c)
{
glBegin( GL_LINE_LOOP);
for( int p = 0; p < ( contourLength[c]); ++p)
{
glVertex2dv( data + d);
d += 3;
}
glEnd();
}
glEndList();
}
FTVectorGlyph::~FTVectorGlyph()
{
delete [] data;
delete [] contourLength;
}
float FTVectorGlyph::Render( const FT_Vector& pen)
{
if( glList)
{
glTranslatef( pen.x + pos.x, pen.y, 0);
glCallList( glList);
glTranslatef( -pen.x + pos.x, -pen.y, 0);
}
return advance;
}