Edit

kc3-lang/ftgl/include/FTVectoriser.h

Branch :

  • Show log

    Commit

  • Author : henry
    Date : 2002-08-27 07:12:49
    Hash : fdccc4bf
    Message : Updated dox comments

  • include/FTVectoriser.h
  • #ifndef     __FTVectoriser__
    #define     __FTVectoriser__
    
    //#include <vector>
    
    #include <ft2build.h>
    #include FT_FREETYPE_H
    #include FT_GLYPH_H
    
    #include "FTGL.h"
    
    #include "FTVector.h"
    
    #ifndef CALLBACK
    #define CALLBACK
    #endif
    
    /**
     * ftPoint class is a basic 3 dimensional point for holding vector font
     * point data.
     *
     * @see FTOutlineGlyph
     * @see FTPolyGlyph
     *
     */
    class FTGL_EXPORT ftPoint
    {
        public:
            /**
             * Default constructor. Point is set to zero.
             */
            ftPoint()
            : x(0), y(0), z(0)
            {}
            
            /**
             * Constructor.
             *
             * @param X
             * @param Y
             * @param Z
             */
            ftPoint( const FTGL_DOUBLE X, const FTGL_DOUBLE Y, const FTGL_DOUBLE Z)
            : x(X), y(Y), z(Z)
            {}
            
            /**
             * Operator == Tests for eqaulity
             *
             * @param a
             * @param b
             * @return
             */
            friend bool operator == ( const ftPoint &a, const ftPoint &b);
    
            /**
             * Operator != Tests for non equality
             *
             * @param a
             * @param b
             * @return
             */
            friend bool operator != ( const ftPoint &a, const ftPoint &b);
            
            /**
             * The point data
             */
            FTGL_DOUBLE x, y, z; // FIXME make private
            
        private:
    };
    
    
    /**
     * FTContour class is a container of points that describe a vector font
     * outline
     *
     * @see FTOutlineGlyph
     * @see FTPolyGlyph
     * @see ftPoint
     *
     */
    class FTGL_EXPORT FTContour
    {
        public:
            /**
             * Default constructor
             */
            FTContour()
            :   kMAXPOINTS( 1000)
            {   
                pointList.reserve( kMAXPOINTS);
            }
    
            /**
             *  Destructor
             */
            ~FTContour()
            {
                pointList.clear();
            }
    
            /**
             * Add a point to the end of this contour.
             *
             * Doesn't add the point if it's already on the end or the start
             * of the contour. The Z component is always 0
             *
             * @param x The X component of the point
             * @param y The Y component of the point
             */
            void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y)
            {
                ftPoint point( x, y, 0.0); 
                
                // Eliminate duplicate points.
                if( pointList.empty() || ( pointList[pointList.size() - 1] != point && pointList[0] != point))
                {
                    pointList.push_back( point);
                }
            }
    
            /**
             * How many points define this contour
             *
             * @return the number of points in this contour
             */
            size_t size() const { return pointList.size();}
    
            /**
             *  The list of points in this contour
             */
            typedef FTVector<ftPoint> PointVector;
            PointVector pointList;
            
        private:
            /**
            * A 'max' number of points that this contour holds. Note however it
            * can hold more than this number. It is just used to reserve space
            * in the <vector>
            */
            const unsigned int kMAXPOINTS;
    };
    
    
    class FTGL_EXPORT FTTesselation
    {
        public:
            FTTesselation()
            {
                pointList.reserve( 128);
            }
    
            ~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 size() const { return pointList.size();}
    
            GLenum meshType;
            typedef FTVector<ftPoint> PointVector;
            PointVector pointList;
            
        private:
            
    };
    
    
    class FTGL_EXPORT FTMesh
    {
        public:
            FTMesh();
            ~FTMesh();
            
            void AddPoint( const FTGL_DOUBLE x, const FTGL_DOUBLE y, const FTGL_DOUBLE z);
            void Begin( GLenum m);
            void End();
            
            FTGL_DOUBLE* Point();
            int size() const;
            
            void Error( GLenum e) { err = e;}
            GLenum Error() const { return err;}
    
            typedef FTVector<ftPoint> PointVector;
            PointVector tempPool;
            
            typedef FTVector<FTTesselation*> TesselationVector;
            TesselationVector tess;
            
        protected:
        
        private:
            /**
             *  The list of points in this mesh
             */
            FTTesselation* tempTess;
            GLenum err;
    
    };
    
    
    
    /**
     * FTVectoriser class is a helper class that converts font outlines into
     * point data. It includes a bezier curve evaluator
     *
     * @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();
    
            /**
             * Process the freetype outline data into contours of points
             *
             * @return <code>true</code> on success
             */
            bool Process();
    
            /**
             * Copy the outline data into a block of <code>FTGL_DOUBLEs</code>
             *
             * @param d a pointer to the memory to copy the data into.
             */
            void GetOutline( FTGL_DOUBLE* d);
    
            /**
             * 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);
            
            /**
             * Copy the tesselation data into a block of <code>FTGL_DOUBLEs</code>
             *
             * @param d a pointer to the memory to copy the data into.
             */
            void GetMesh( FTGL_DOUBLE* d);
            
            /** Get the number of points in the tesselation
             *
             * @return the number of points.
             */
            size_t MeshPoints() const { return mesh->size();}
            
            /**
             * Get the total count of points in this outline
             *
             * @return the number of points
             */
            int points();
    
            /**
             * Get the count of contours in this outline
             *
             * @return the number of contours
             */
            size_t contours() const { return contourList.size();}
    
            /**
             * Get the nuber of points in a 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]->size();}
    
            /**
             * Get the flag for the tesselation rule for this outline
             *
             * @return The contour flag
             */
            int ContourFlag() const { return contourFlag;}
            
        private:
            /**
             * Process a conic ( second order bezier curve)
             *
             * @param index The index of the current point in the point list.
             * @param first The index into the pointlist of the first point in
             *              the contour that the current point is part of.
             * @param last  The index into the pointlist of the last point in
             *              the contour that the current point is part of.
             * @return      the number of control points processed
             */
            int Conic( const int index, const int first, const int last);
    
            /**
             * Process a cubic ( third order) bezier curve
             *
             * @param index The index of the current point in the point list.
             * @param first The index into the pointlist of the first point in
             *              the contour that the current point is part of.
             * @param last  The index into the pointlist of the last point in
             *              the contour that the current point is part of.
             * @return      the number of control points processed
             */
            int Cubic( const int index, const int first, const int last);
    
            /**
             * @param t
             * @param n
             */
            inline void deCasteljau( const float t, const int n);
    
            /**
             * @param n
             */
            inline void evaluateCurve( const int n);
    
            /**
             * The list of contours in this outline
             */
            typedef FTVector<FTContour*> ContourVector;
            ContourVector contourList;
                
            /**
             * A Mesh for tesselations
             */
            FTContour* contour;
                
            /**
             * A Mesh for tesselations
             */
            FTMesh* mesh;
    
            /**
            * A flag indicating the tesselation rule for this outline
             */
            int contourFlag;
    
            /**
             * A Freetype outline
             */
            FT_Outline ftOutline;
            
            /**
             */
             // Magic numbers -- #define MAX_DEG 4
            float bValues[4][4][2];  //3D array storing values of de Casteljau algorithm.
            float ctrlPtArray[4][2]; // Magic numbers
            
            /**
             */
            const float kBSTEPSIZE;
    
    };
    
    
    #endif  //  __FTVectoriser__