276 lines
6.2 KiB
C++
276 lines
6.2 KiB
C++
#ifndef __FTVectoriser__
|
|
#define __FTVectoriser__
|
|
|
|
|
|
#include "FTContour.h"
|
|
#include "FTList.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( GLenum m)
|
|
: meshType(m)
|
|
{
|
|
pointList.reserve( 128);
|
|
}
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~FTTesselation()
|
|
{
|
|
pointList.clear();
|
|
}
|
|
|
|
/**
|
|
* Add a point to the mesh.
|
|
*/
|
|
void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z)
|
|
{
|
|
pointList.push_back( FTPoint( x, y, z));
|
|
}
|
|
|
|
/**
|
|
* The number of points in this mesh
|
|
*/
|
|
size_t PointCount() const { return pointList.size();}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
const FTPoint& Point( unsigned int index) const { return pointList[index];}
|
|
|
|
/**
|
|
* Return the OpenGL polygon type.
|
|
*/
|
|
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
|
|
{
|
|
typedef FTVector<FTTesselation*> TesselationVector;
|
|
typedef FTList<FTPoint> PointList;
|
|
|
|
public:
|
|
/**
|
|
* Default constructor
|
|
*/
|
|
FTMesh();
|
|
|
|
/**
|
|
* Destructor
|
|
*/
|
|
~FTMesh();
|
|
|
|
/**
|
|
* Add a point to the mesh
|
|
*/
|
|
void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z);
|
|
|
|
/**
|
|
* Create a combine point for the gluTesselator
|
|
*/
|
|
const FTGL_DOUBLE* Combine( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z);
|
|
|
|
/**
|
|
* Begin a new polygon
|
|
*/
|
|
void Begin( GLenum meshType);
|
|
|
|
/**
|
|
* End a polygon
|
|
*/
|
|
void End();
|
|
|
|
/**
|
|
* Record a gluTesselation error
|
|
*/
|
|
void Error( GLenum e) { err = e;}
|
|
|
|
/**
|
|
* The number of tesselations in the mesh
|
|
*/
|
|
unsigned int TesselationCount() const { return tesselationList.size();}
|
|
|
|
/**
|
|
* Get a tesselation by index
|
|
*/
|
|
const FTTesselation* const Tesselation( unsigned int index) const;
|
|
|
|
/**
|
|
* Return the temporary point list. For testing only.
|
|
*/
|
|
const PointList& TempPointList() const { return tempPointList;}
|
|
|
|
/**
|
|
* Get the GL ERROR returned by the glu tesselator
|
|
*/
|
|
GLenum Error() const { return err;}
|
|
|
|
private:
|
|
/**
|
|
* The current sub mesh that we are constructing.
|
|
*/
|
|
FTTesselation* currentTesselation;
|
|
|
|
/**
|
|
* Holds each sub mesh that comprises this glyph.
|
|
*/
|
|
TesselationVector tesselationList;
|
|
|
|
/**
|
|
* Holds extra points created by gluTesselator. See ftglCombine.
|
|
*/
|
|
PointList tempPointList;
|
|
|
|
/**
|
|
* GL ERROR returned by the glu tesselator
|
|
*/
|
|
GLenum err;
|
|
|
|
};
|
|
|
|
const FTGL_DOUBLE FTGL_FRONT_FACING = 1.0;
|
|
const FTGL_DOUBLE FTGL_BACK_FACING = -1.0;
|
|
|
|
/**
|
|
* 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_GlyphSlot 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 = FTGL_FRONT_FACING);
|
|
|
|
/**
|
|
* 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 outline;
|
|
};
|
|
|
|
|
|
#endif // __FTVectoriser__
|