blob: 97f33b1a9b70779c1791ff9c4b61831d1c0bfa4f [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>FTGL: FTContour.cpp Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.3.6 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a></div>
<h1>FTContour.cpp</h1><a href="FTContour_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#include "<a class="code" href="FTContour_8h.html">FTContour.h</a>"</span>
00002
<a name="l00003"></a><a class="code" href="FTContour_8cpp.html#a0">00003</a> <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">float</span> <a class="code" href="FTContour_8cpp.html#a0">BEZIER_STEP_SIZE</a> = 0.2f;
00004
00005
00006 <span class="keywordtype">void</span> FTContour::AddPoint( <a class="code" href="classFTPoint.html">FTPoint</a> point)
00007 {
00008 <span class="keywordflow">if</span>( pointList.<a class="code" href="classFTVector.html#a9">empty</a>() || point != pointList[pointList.<a class="code" href="classFTVector.html#a3">size</a>() - 1])
00009 {
00010 pointList.<a class="code" href="classFTVector.html#a14">push_back</a>( point);
00011 }
00012 }
00013
00014
00015 <span class="keywordtype">void</span> FTContour::AddPoint( <span class="keywordtype">float</span> x, <span class="keywordtype">float</span> y)
00016 {
00017 AddPoint( <a class="code" href="classFTPoint.html">FTPoint</a>( x, y, 0.0f));
00018 }
00019
00020
00021 <span class="keywordtype">void</span> FTContour::evaluateQuadraticCurve()
00022 {
00023 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt;= ( 1.0f / <a class="code" href="FTContour_8cpp.html#a0">BEZIER_STEP_SIZE</a>); i++)
00024 {
00025 <span class="keywordtype">float</span> bezierValues[2][2];
00026
00027 <span class="keywordtype">float</span> t = static_cast&lt;float&gt;(i) * <a class="code" href="FTContour_8cpp.html#a0">BEZIER_STEP_SIZE</a>;
00028
00029 bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0];
00030 bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1];
00031
00032 bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0];
00033 bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1];
00034
00035 bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
00036 bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
00037
00038 AddPoint( bezierValues[0][0], bezierValues[0][1]);
00039 }
00040 }
00041
00042 <span class="keywordtype">void</span> FTContour::evaluateCubicCurve()
00043 {
00044 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i = 0; i &lt;= ( 1.0f / <a class="code" href="FTContour_8cpp.html#a0">BEZIER_STEP_SIZE</a>); i++)
00045 {
00046 <span class="keywordtype">float</span> bezierValues[3][2];
00047
00048 <span class="keywordtype">float</span> t = static_cast&lt;float&gt;(i) * <a class="code" href="FTContour_8cpp.html#a0">BEZIER_STEP_SIZE</a>;
00049
00050 bezierValues[0][0] = (1.0f - t) * controlPoints[0][0] + t * controlPoints[1][0];
00051 bezierValues[0][1] = (1.0f - t) * controlPoints[0][1] + t * controlPoints[1][1];
00052
00053 bezierValues[1][0] = (1.0f - t) * controlPoints[1][0] + t * controlPoints[2][0];
00054 bezierValues[1][1] = (1.0f - t) * controlPoints[1][1] + t * controlPoints[2][1];
00055
00056 bezierValues[2][0] = (1.0f - t) * controlPoints[2][0] + t * controlPoints[3][0];
00057 bezierValues[2][1] = (1.0f - t) * controlPoints[2][1] + t * controlPoints[3][1];
00058
00059 bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
00060 bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
00061
00062 bezierValues[1][0] = (1.0f - t) * bezierValues[1][0] + t * bezierValues[2][0];
00063 bezierValues[1][1] = (1.0f - t) * bezierValues[1][1] + t * bezierValues[2][1];
00064
00065 bezierValues[0][0] = (1.0f - t) * bezierValues[0][0] + t * bezierValues[1][0];
00066 bezierValues[0][1] = (1.0f - t) * bezierValues[0][1] + t * bezierValues[1][1];
00067
00068 AddPoint( bezierValues[0][0], bezierValues[0][1]);
00069 }
00070 }
00071
00072
<a name="l00073"></a><a class="code" href="classFTContour.html#a0">00073</a> <a class="code" href="classFTContour.html#a0">FTContour::FTContour</a>( FT_Vector* contour, <span class="keywordtype">char</span>* pointTags, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> numberOfPoints)
00074 {
00075 <span class="keywordflow">for</span>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> pointIndex = 0; pointIndex &lt; numberOfPoints; ++ pointIndex)
00076 {
00077 <span class="keywordtype">char</span> pointTag = pointTags[pointIndex];
00078
00079 <span class="keywordflow">if</span>( pointTag == FT_Curve_Tag_On || numberOfPoints &lt; 2)
00080 {
00081 AddPoint( contour[pointIndex].x, contour[pointIndex].y);
00082 <span class="keywordflow">continue</span>;
00083 }
00084
00085 <a class="code" href="classFTPoint.html">FTPoint</a> controlPoint( contour[pointIndex]);
00086 <a class="code" href="classFTPoint.html">FTPoint</a> previousPoint = ( 0 == pointIndex)
00087 ? <a class="code" href="classFTPoint.html">FTPoint</a>( contour[numberOfPoints - 1])
00088 : pointList[pointList.<a class="code" href="classFTVector.html#a3">size</a>() - 1];
00089
00090 <a class="code" href="classFTPoint.html">FTPoint</a> nextPoint = ( pointIndex == numberOfPoints - 1)
00091 ? pointList[0]
00092 : <a class="code" href="classFTPoint.html">FTPoint</a>( contour[pointIndex + 1]);
00093
00094 <span class="keywordflow">if</span>( pointTag == FT_Curve_Tag_Conic)
00095 {
00096 <span class="keywordtype">char</span> nextPointTag = ( pointIndex == numberOfPoints - 1)
00097 ? pointTags[0]
00098 : pointTags[pointIndex + 1];
00099
00100 <span class="keywordflow">while</span>( nextPointTag == FT_Curve_Tag_Conic)
00101 {
00102 nextPoint = ( controlPoint + nextPoint) * 0.5f;
00103
00104 controlPoints[0][0] = previousPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[0][1] = previousPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00105 controlPoints[1][0] = controlPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[1][1] = controlPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00106 controlPoints[2][0] = nextPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[2][1] = nextPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00107
00108 evaluateQuadraticCurve();
00109 ++pointIndex;
00110
00111 previousPoint = nextPoint;
00112 controlPoint = <a class="code" href="classFTPoint.html">FTPoint</a>( contour[pointIndex]);
00113 nextPoint = ( pointIndex == numberOfPoints - 1)
00114 ? pointList[0]
00115 : FTPoint( contour[pointIndex + 1]);
00116 nextPointTag = ( pointIndex == numberOfPoints - 1)
00117 ? pointTags[0]
00118 : pointTags[pointIndex + 1];
00119 }
00120
00121 controlPoints[0][0] = previousPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[0][1] = previousPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00122 controlPoints[1][0] = controlPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[1][1] = controlPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00123 controlPoints[2][0] = nextPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[2][1] = nextPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00124
00125 evaluateQuadraticCurve();
00126 <span class="keywordflow">continue</span>;
00127 }
00128
00129 <span class="keywordflow">if</span>( pointTag == FT_Curve_Tag_Cubic)
00130 {
00131 <a class="code" href="classFTPoint.html">FTPoint</a> controlPoint2 = nextPoint;
00132
00133 <a class="code" href="classFTPoint.html">FTPoint</a> nextPoint = ( pointIndex == numberOfPoints - 2)
00134 ? pointList[0]
00135 : <a class="code" href="classFTPoint.html">FTPoint</a>( contour[pointIndex + 2]);
00136
00137 controlPoints[0][0] = previousPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[0][1] = previousPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00138 controlPoints[1][0] = controlPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[1][1] = controlPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00139 controlPoints[2][0] = controlPoint2.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[2][1] = controlPoint2.<a class="code" href="classFTPoint.html#a8">Y</a>();
00140 controlPoints[3][0] = nextPoint.<a class="code" href="classFTPoint.html#a7">X</a>(); controlPoints[3][1] = nextPoint.<a class="code" href="classFTPoint.html#a8">Y</a>();
00141
00142 evaluateCubicCurve();
00143 ++pointIndex;
00144 <span class="keywordflow">continue</span>;
00145 }
00146 }
00147 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Dec 5 22:24:05 2004 for FTGL by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border=0 >
</a>1.3.6 </small></address>
</body>
</html>