diff options
Diffstat (limited to 'src/ftgl/FTContour.h')
-rw-r--r-- | src/ftgl/FTContour.h | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/src/ftgl/FTContour.h b/src/ftgl/FTContour.h new file mode 100644 index 0000000..4cfff6c --- /dev/null +++ b/src/ftgl/FTContour.h @@ -0,0 +1,209 @@ +/* + * FTGL - OpenGL font library + * + * Copyright (c) 2001-2004 Henry Maddocks <ftgl@opengl.geek.nz> + * Copyright (c) 2008 Éric Beets <ericbeets@free.fr> + * 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 __FTContour__ +#define __FTContour__ + +#include "FTGL/ftgl.h" + +#include "FTVector.h" + + +/** + * FTContour class is a container of points that describe a vector font + * outline. It is used as a container for the output of the bezier curve + * evaluator in FTVectoriser. + * + * @see FTOutlineGlyph + * @see FTPolygonGlyph + * @see FTPoint + */ +class FTContour +{ + public: + /** + * Constructor + * + * @param contour + * @param pointTags + * @param numberOfPoints + */ + FTContour(FT_Vector* contour, char* pointTags, unsigned int numberOfPoints); + + /** + * Destructor + */ + ~FTContour() + { + pointList.clear(); + outsetPointList.clear(); + frontPointList.clear(); + backPointList.clear(); + } + + /** + * Return a point at index. + * + * @param index of the point in the curve. + * @return const point reference + */ + const FTPoint& Point(size_t index) const { return pointList[index]; } + + /** + * Return a point at index. + * + * @param index of the point in the outset curve. + * @return const point reference + */ + const FTPoint& Outset(size_t index) const { return outsetPointList[index]; } + + /** + * Return a point at index of the front outset contour. + * + * @param index of the point in the curve. + * @return const point reference + */ + const FTPoint& FrontPoint(size_t index) const + { + if(frontPointList.size() == 0) + return Point(index); + return frontPointList[index]; + } + + + /** + * Return a point at index of the back outset contour. + * + * @param index of the point in the curve. + * @return const point reference + */ + const FTPoint& BackPoint(size_t index) const + { + if(backPointList.size() == 0) + return Point(index); + return backPointList[index]; + } + + /** + * How many points define this contour + * + * @return the number of points in this contour + */ + size_t PointCount() const { return pointList.size(); } + + /** + * Make sure the glyph has the proper parity and create the front/back + * outset contour. + * + * @param parity The contour's parity within the glyph. + */ + void SetParity(int parity); + + // FIXME: this should probably go away. + void buildFrontOutset(float outset); + void buildBackOutset(float outset); + + private: + /** + * Add a point to this contour. This function tests for duplicate + * points. + * + * @param point The point to be added to the contour. + */ + inline void AddPoint(FTPoint point); + + /** + * Add a point to this contour. This function tests for duplicate + * points. + * + * @param point The point to be added to the contour. + */ + inline void AddOutsetPoint(FTPoint point); + + /* + * Add a point to this outset contour. This function tests for duplicate + * points. + * + * @param point The point to be added to the contour outset. + */ + inline void AddFrontPoint(FTPoint point); + inline void AddBackPoint(FTPoint point); + + /** + * De Casteljau (bezier) algorithm contributed by Jed Soane + * Evaluates a quadratic or conic (second degree) curve + */ + inline void evaluateQuadraticCurve(FTPoint, FTPoint, FTPoint); + + /** + * De Casteljau (bezier) algorithm contributed by Jed Soane + * Evaluates a cubic (third degree) curve + */ + inline void evaluateCubicCurve(FTPoint, FTPoint, FTPoint, FTPoint); + + /** + * Compute the vector norm + */ + inline FTGL_DOUBLE NormVector(const FTPoint &v); + + /** + * Compute a rotation matrix from a vector + */ + inline void RotationMatrix(const FTPoint &a, const FTPoint &b, FTGL_DOUBLE *matRot, FTGL_DOUBLE *invRot); + + /** + * Matrix and vector multiplication + */ + inline void MultMatrixVect(FTGL_DOUBLE *mat, FTPoint &v); + + /** + * Compute the vector bisecting from a vector 'v' and a distance 'd' + */ + inline void ComputeBisec(FTPoint &v); + + /** + * Compute the outset point coordinates + */ + inline FTPoint ComputeOutsetPoint(FTPoint a, FTPoint b, FTPoint c); + + /** + * The list of points in this contour + */ + typedef FTVector<FTPoint> PointVector; + PointVector pointList; + PointVector outsetPointList; + PointVector frontPointList; + PointVector backPointList; + + /** + * Is this contour clockwise or anti-clockwise? + */ + bool clockwise; +}; + +#endif // __FTContour__ + |