summaryrefslogtreecommitdiff
path: root/src/ftgl/FTVectoriser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ftgl/FTVectoriser.h')
-rw-r--r--src/ftgl/FTVectoriser.h313
1 files changed, 313 insertions, 0 deletions
diff --git a/src/ftgl/FTVectoriser.h b/src/ftgl/FTVectoriser.h
new file mode 100644
index 0000000..942aea1
--- /dev/null
+++ b/src/ftgl/FTVectoriser.h
@@ -0,0 +1,313 @@
+/*
+ * FTGL - OpenGL font library
+ *
+ * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz>
+ * Copyright (c) 2008 Sam Hocevar <sam@zoy.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef __FTVectoriser__
+#define __FTVectoriser__
+
+#include "FTGL/ftgl.h"
+
+#include "FTContour.h"
+#include "FTList.h"
+#include "FTVector.h"
+
+
+#ifndef CALLBACK
+#define CALLBACK
+#endif
+
+
+/**
+ * FTTesselation captures points that are output by OpenGL's gluTesselator.
+ */
+class 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 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
+ */
+ size_t TesselationCount() const { return tesselationList.size(); }
+
+ /**
+ * Get a tesselation by index
+ */
+ const FTTesselation* const Tesselation(size_t 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 FTExtrudeGlyph
+ * @see FTOutlineGlyph
+ * @see FTPolygonGlyph
+ * @see FTContour
+ * @see FTPoint
+ *
+ */
+class 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
+ * FIXME: change the following for a constant
+ * @param outsetType Specify the outset type contour
+ * 0 : Original
+ * 1 : Front
+ * 2 : Back
+ * @param outsetSize Specify the outset size contour
+ */
+ void MakeMesh(FTGL_DOUBLE zNormal = FTGL_FRONT_FACING, int outsetType = 0, float outsetSize = 0.0f);
+
+ /**
+ * 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(size_t 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
+ *
+ * @param front front outset distance
+ * @param back back outset distance
+ */
+ 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__