#ifndef __FTVectoriser__
#define __FTVectoriser__
#include "FTContour.h"
#include "FTPoint.h"
#include "FTVector.h"
#include "FTGL.h"
#ifndef CALLBACK
#define CALLBACK
#endif
/**
* FTTesselation captures points that are output by OpenGL's gluTesselator.
*/
class FTGL_EXPORT FTTesselation
{
public:
/**
* Default constructor
*/
FTTesselation()
{
pointList.reserve( 128);
}
/**
* Destructor
*/
~FTTesselation()
{
pointList.clear();
}
void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z)
{
pointList.push_back( FTPoint( x, y, z));
}
size_t PointCount() const { return pointList.size();}
const FTPoint& Point( unsigned int index) const { return pointList[index];}
void PolygonType( GLenum m) { meshType = m;}
GLenum PolygonType() const { return meshType;}
private:
/**
* Points generated by gluTesselator.
*/
typedef FTVector<FTPoint> PointVector;
PointVector pointList;
/**
* OpenGL primitive type from gluTesselator.
*/
GLenum meshType;
};
/**
* FTMesh is a container of FTTesselation's that make up a polygon glyph
*/
class FTGL_EXPORT FTMesh
{
public:
/**
* Default constructor
*/
FTMesh();
/**
* Destructor
*/
~FTMesh();
void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z);
void Begin( GLenum m);
void End();
void Error( GLenum e) { err = e;}
unsigned int TesselationCount() const { return tesselationList.size();}
const FTTesselation* const Tesselation( unsigned int index) const;
/**
* Get the GL ERROR returned by the glu tesselator
*/
GLenum Error() const { return err;}
/**
* Holds extra points created by gluTesselator. See ftglCombine.
*/
typedef FTVector<FTPoint> PointVector;
PointVector tempPointList;
protected:
private:
/**
* The current sub mesh that we are constructing.
*/
FTTesselation* currentTesselation;
/**
* Holds each sub mesh that comprises this glyph.
*/
typedef FTVector<FTTesselation*> TesselationVector;
TesselationVector tesselationList;
/**
* GL ERROR returned by the glu tesselator
*/
GLenum err;
};
/**
* FTVectoriser class is a helper class that converts font outlines into
* point data.
*
* @see FTExtrdGlyph
* @see FTOutlineGlyph
* @see FTPolyGlyph
* @see FTContour
* @see FTPoint
*
*/
class FTGL_EXPORT FTVectoriser
{
public:
/**
* Constructor
*
* @param glyph The freetype glyph to be processed
*/
FTVectoriser( const FT_Glyph glyph);
/**
* Destructor
*/
virtual ~FTVectoriser();
/**
* Build an FTMesh from the vector outline data.
*
* @param zNormal The direction of the z axis of the normal
* for this mesh
*/
void MakeMesh( FTGL_DOUBLE zNormal = 1.0);
/**
* Get the current mesh.
*/
const FTMesh* const GetMesh() const { return mesh;}
/**
* Get the total count of points in this outline
*
* @return the number of points
*/
size_t PointCount();
/**
* Get the count of contours in this outline
*
* @return the number of contours
*/
size_t ContourCount() const { return ftContourCount;}
/**
* Return a contour at index
*
* @return the number of contours
*/
const FTContour* const Contour( unsigned int index) const;
/**
* Get the number of points in a specific contour in this outline
*
* @param c The contour index
* @return the number of points in contour[c]
*/
size_t ContourSize( int c) const { return contourList[c]->PointCount();}
/**
* Get the flag for the tesselation rule for this outline
*
* @return The contour flag
*/
int ContourFlag() const { return contourFlag;}
private:
/**
* Process the freetype outline data into contours of points
*/
void ProcessContours();
/**
* The list of contours in the glyph
*/
FTContour** contourList;
/**
* A Mesh for tesselations
*/
FTMesh* mesh;
/**
* The number of contours reported by Freetype
*/
short ftContourCount;
/**
* A flag indicating the tesselation rule for the glyph
*/
int contourFlag;
/**
* A Freetype outline
*/
FT_Outline ftOutline;
};
#endif // __FTVectoriser__