blob: 3794f698a903e6e1a58a48038afe0ed586ffb513 [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: FTVectoriser.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>FTVectoriser.cpp</h1><a href="FTVectoriser_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#include "<a class="code" href="FTVectoriser_8h.html">FTVectoriser.h</a>"</span>
00002 <span class="preprocessor">#include "<a class="code" href="FTGL_8h.html">FTGL.h</a>"</span>
00003
00004 <span class="preprocessor">#ifndef CALLBACK</span>
00005 <span class="preprocessor"></span><span class="preprocessor">#define CALLBACK</span>
00006 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00007 <span class="preprocessor"></span>
00008 <span class="preprocessor">#ifdef __APPLE_CC__ </span>
00009 <span class="preprocessor"></span> <span class="keyword">typedef</span> GLvoid (*GLUTesselatorFunction)(...);
00010 <span class="preprocessor">#elif defined( __mips ) || defined( __linux__ ) || defined( __FreeBSD__ ) || defined( __OpenBSD__ ) || defined( __sun ) || defined (__CYGWIN__)</span>
00011 <span class="preprocessor"></span> <span class="keyword">typedef</span> GLvoid (*GLUTesselatorFunction)();
00012 <span class="preprocessor">#elif defined ( WIN32)</span>
00013 <span class="preprocessor"></span> <span class="keyword">typedef</span> GLvoid (CALLBACK *GLUTesselatorFunction)( );
00014 <span class="preprocessor">#else</span>
00015 <span class="preprocessor"></span><span class="preprocessor"> #error "Error - need to define type GLUTesselatorFunction for this platform/compiler"</span>
00016 <span class="preprocessor"></span><span class="preprocessor">#endif</span>
00017 <span class="preprocessor"></span>
00018
<a name="l00019"></a><a class="code" href="FTVectoriser_8cpp.html#a0">00019</a> <span class="keywordtype">void</span> CALLBACK <a class="code" href="FTVectoriser_8cpp.html#a0">ftglError</a>( GLenum errCode, <a class="code" href="classFTMesh.html">FTMesh</a>* mesh)
00020 {
00021 mesh-&gt;<a class="code" href="classFTMesh.html#a6">Error</a>( errCode);
00022 }
00023
00024
<a name="l00025"></a><a class="code" href="FTVectoriser_8cpp.html#a1">00025</a> <span class="keywordtype">void</span> CALLBACK <a class="code" href="FTVectoriser_8cpp.html#a1">ftglVertex</a>( <span class="keywordtype">void</span>* data, <a class="code" href="classFTMesh.html">FTMesh</a>* mesh)
00026 {
00027 <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a>* vertex = static_cast&lt;FTGL_DOUBLE*&gt;(data);
00028 mesh-&gt;<a class="code" href="classFTMesh.html#a2">AddPoint</a>( vertex[0], vertex[1], vertex[2]);
00029 }
00030
00031
<a name="l00032"></a><a class="code" href="FTVectoriser_8cpp.html#a2">00032</a> <span class="keywordtype">void</span> CALLBACK <a class="code" href="FTVectoriser_8cpp.html#a2">ftglCombine</a>( <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> coords[3], <span class="keywordtype">void</span>* vertex_data[4], GLfloat weight[4], <span class="keywordtype">void</span>** outData, <a class="code" href="classFTMesh.html">FTMesh</a>* mesh)
00033 {
00034 <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a>* vertex = static_cast&lt;FTGL_DOUBLE*&gt;(coords);
00035 *outData = mesh-&gt;<a class="code" href="classFTMesh.html#a3">Combine</a>( vertex[0], vertex[1], vertex[2]);
00036 }
00037
00038
<a name="l00039"></a><a class="code" href="FTVectoriser_8cpp.html#a3">00039</a> <span class="keywordtype">void</span> CALLBACK <a class="code" href="FTVectoriser_8cpp.html#a3">ftglBegin</a>( GLenum type, <a class="code" href="classFTMesh.html">FTMesh</a>* mesh)
00040 {
00041 mesh-&gt;<a class="code" href="classFTMesh.html#a4">Begin</a>( type);
00042 }
00043
00044
<a name="l00045"></a><a class="code" href="FTVectoriser_8cpp.html#a4">00045</a> <span class="keywordtype">void</span> CALLBACK <a class="code" href="FTVectoriser_8cpp.html#a4">ftglEnd</a>( <a class="code" href="classFTMesh.html">FTMesh</a>* mesh)
00046 {
00047 mesh-&gt;<a class="code" href="classFTMesh.html#a5">End</a>();
00048 }
00049
00050
<a name="l00051"></a><a class="code" href="classFTMesh.html#a0">00051</a> <a class="code" href="classFTMesh.html#a0">FTMesh::FTMesh</a>()
00052 : currentTesselation(0),
00053 err(0)
00054 {
00055 tesselationList.<a class="code" href="classFTVector.html#a13">reserve</a>( 16);
00056 }
00057
00058
<a name="l00059"></a><a class="code" href="classFTMesh.html#a1">00059</a> <a class="code" href="classFTMesh.html#a1">FTMesh::~FTMesh</a>()
00060 {
00061 <span class="keywordflow">for</span>( size_t t = 0; t &lt; tesselationList.<a class="code" href="classFTVector.html#a3">size</a>(); ++t)
00062 {
00063 <span class="keyword">delete</span> tesselationList[t];
00064 }
00065
00066 tesselationList.<a class="code" href="classFTVector.html#a12">clear</a>();
00067 }
00068
00069
<a name="l00070"></a><a class="code" href="classFTMesh.html#a2">00070</a> <span class="keywordtype">void</span> <a class="code" href="classFTMesh.html#a2">FTMesh::AddPoint</a>( <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> x, <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> y, <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> z)
00071 {
00072 currentTesselation-&gt;<a class="code" href="classFTTesselation.html#a2">AddPoint</a>( x, y, z);
00073 }
00074
00075
<a name="l00076"></a><a class="code" href="classFTMesh.html#a3">00076</a> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a>* <a class="code" href="classFTMesh.html#a3">FTMesh::Combine</a>( <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> x, <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> y, <span class="keyword">const</span> <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> z)
00077 {
00078 tempPointList.<a class="code" href="classFTList.html#a3">push_back</a>( <a class="code" href="classFTPoint.html">FTPoint</a>( x, y,z));
00079 <span class="keywordflow">return</span> static_cast&lt;FTGL_DOUBLE*&gt;(tempPointList.<a class="code" href="classFTList.html#a5">back</a>());
00080 }
00081
00082
<a name="l00083"></a><a class="code" href="classFTMesh.html#a4">00083</a> <span class="keywordtype">void</span> <a class="code" href="classFTMesh.html#a4">FTMesh::Begin</a>( GLenum meshType)
00084 {
00085 currentTesselation = <span class="keyword">new</span> <a class="code" href="classFTTesselation.html">FTTesselation</a>( meshType);
00086 }
00087
00088
<a name="l00089"></a><a class="code" href="classFTMesh.html#a5">00089</a> <span class="keywordtype">void</span> <a class="code" href="classFTMesh.html#a5">FTMesh::End</a>()
00090 {
00091 tesselationList.<a class="code" href="classFTVector.html#a14">push_back</a>( currentTesselation);
00092 }
00093
00094
<a name="l00095"></a><a class="code" href="classFTMesh.html#a8">00095</a> <span class="keyword">const</span> <a class="code" href="classFTTesselation.html">FTTesselation</a>* <span class="keyword">const</span> <a class="code" href="classFTMesh.html#a8">FTMesh::Tesselation</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)<span class="keyword"> const</span>
00096 <span class="keyword"></span>{
00097 <span class="keywordflow">return</span> ( index &lt; tesselationList.<a class="code" href="classFTVector.html#a3">size</a>()) ? tesselationList[index] : NULL;
00098 }
00099
00100
<a name="l00101"></a><a class="code" href="classFTVectoriser.html#a0">00101</a> <a class="code" href="classFTVectoriser.html#a0">FTVectoriser::FTVectoriser</a>( <span class="keyword">const</span> FT_GlyphSlot glyph)
00102 : contourList(0),
00103 mesh(0),
00104 ftContourCount(0),
00105 contourFlag(0)
00106 {
00107 <span class="keywordflow">if</span>( glyph)
00108 {
00109 outline = glyph-&gt;outline;
00110
00111 ftContourCount = outline.n_contours;
00112 contourList = 0;
00113 contourFlag = outline.flags;
00114
00115 ProcessContours();
00116 }
00117 }
00118
00119
<a name="l00120"></a><a class="code" href="classFTVectoriser.html#a1">00120</a> <a class="code" href="classFTVectoriser.html#a1">FTVectoriser::~FTVectoriser</a>()
00121 {
00122 <span class="keywordflow">for</span>( size_t c = 0; c &lt; <a class="code" href="classFTVectoriser.html#a5">ContourCount</a>(); ++c)
00123 {
00124 <span class="keyword">delete</span> contourList[c];
00125 }
00126
00127 <span class="keyword">delete</span> [] contourList;
00128 <span class="keyword">delete</span> mesh;
00129 }
00130
00131
00132 <span class="keywordtype">void</span> FTVectoriser::ProcessContours()
00133 {
00134 <span class="keywordtype">short</span> contourLength = 0;
00135 <span class="keywordtype">short</span> startIndex = 0;
00136 <span class="keywordtype">short</span> endIndex = 0;
00137
00138 contourList = <span class="keyword">new</span> <a class="code" href="classFTContour.html">FTContour</a>*[ftContourCount];
00139
00140 <span class="keywordflow">for</span>( <span class="keywordtype">short</span> contourIndex = 0; contourIndex &lt; ftContourCount; ++contourIndex)
00141 {
00142 FT_Vector* pointList = &amp;outline.points[startIndex];
00143 <span class="keywordtype">char</span>* tagList = &amp;outline.tags[startIndex];
00144
00145 endIndex = outline.contours[contourIndex];
00146 contourLength = ( endIndex - startIndex) + 1;
00147
00148 FTContour* contour = <span class="keyword">new</span> FTContour( pointList, tagList, contourLength);
00149
00150 contourList[contourIndex] = contour;
00151
00152 startIndex = endIndex + 1;
00153 }
00154 }
00155
00156
<a name="l00157"></a><a class="code" href="classFTVectoriser.html#a4">00157</a> size_t <a class="code" href="classFTVectoriser.html#a4">FTVectoriser::PointCount</a>()
00158 {
00159 size_t s = 0;
00160 <span class="keywordflow">for</span>( size_t c = 0; c &lt; <a class="code" href="classFTVectoriser.html#a5">ContourCount</a>(); ++c)
00161 {
00162 s += contourList[c]-&gt;<a class="code" href="classFTContour.html#a3">PointCount</a>();
00163 }
00164
00165 <span class="keywordflow">return</span> s;
00166 }
00167
00168
<a name="l00169"></a><a class="code" href="classFTVectoriser.html#a6">00169</a> <span class="keyword">const</span> <a class="code" href="classFTContour.html">FTContour</a>* <span class="keyword">const</span> <a class="code" href="classFTVectoriser.html#a6">FTVectoriser::Contour</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> index)<span class="keyword"> const</span>
00170 <span class="keyword"></span>{
00171 <span class="keywordflow">return</span> ( index &lt; <a class="code" href="classFTVectoriser.html#a5">ContourCount</a>()) ? contourList[index] : NULL;
00172 }
00173
00174
<a name="l00175"></a><a class="code" href="classFTVectoriser.html#a2">00175</a> <span class="keywordtype">void</span> <a class="code" href="classFTVectoriser.html#a2">FTVectoriser::MakeMesh</a>( <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a> zNormal)
00176 {
00177 <span class="keywordflow">if</span>( mesh)
00178 {
00179 <span class="keyword">delete</span> mesh;
00180 }
00181
00182 mesh = <span class="keyword">new</span> <a class="code" href="classFTMesh.html">FTMesh</a>;
00183
00184 GLUtesselator* tobj = gluNewTess();
00185
00186 gluTessCallback( tobj, GLU_TESS_BEGIN_DATA, (GLUTesselatorFunction)<a class="code" href="FTVectoriser_8cpp.html#a3">ftglBegin</a>);
00187 gluTessCallback( tobj, GLU_TESS_VERTEX_DATA, (GLUTesselatorFunction)<a class="code" href="FTVectoriser_8cpp.html#a1">ftglVertex</a>);
00188 gluTessCallback( tobj, GLU_TESS_COMBINE_DATA, (GLUTesselatorFunction)<a class="code" href="FTVectoriser_8cpp.html#a2">ftglCombine</a>);
00189 gluTessCallback( tobj, GLU_TESS_END_DATA, (GLUTesselatorFunction)<a class="code" href="FTVectoriser_8cpp.html#a4">ftglEnd</a>);
00190 gluTessCallback( tobj, GLU_TESS_ERROR_DATA, (GLUTesselatorFunction)<a class="code" href="FTVectoriser_8cpp.html#a0">ftglError</a>);
00191
00192 <span class="keywordflow">if</span>( contourFlag &amp; ft_outline_even_odd_fill) <span class="comment">// ft_outline_reverse_fill</span>
00193 {
00194 gluTessProperty( tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ODD);
00195 }
00196 <span class="keywordflow">else</span>
00197 {
00198 gluTessProperty( tobj, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_NONZERO);
00199 }
00200
00201
00202 gluTessProperty( tobj, GLU_TESS_TOLERANCE, 0);
00203 gluTessNormal( tobj, 0.0f, 0.0f, zNormal);
00204 gluTessBeginPolygon( tobj, mesh);
00205
00206 <span class="keywordflow">for</span>( size_t c = 0; c &lt; <a class="code" href="classFTVectoriser.html#a5">ContourCount</a>(); ++c)
00207 {
00208 <span class="keyword">const</span> <a class="code" href="classFTContour.html">FTContour</a>* contour = contourList[c];
00209
00210 gluTessBeginContour( tobj);
00211
00212 <span class="keywordflow">for</span>( size_t p = 0; p &lt; contour-&gt;<a class="code" href="classFTContour.html#a3">PointCount</a>(); ++p)
00213 {
00214 <a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a>* d = (<a class="code" href="FTGL_8h.html#a4">FTGL_DOUBLE</a>*)(contour-&gt;<a class="code" href="classFTContour.html#a2">Point</a>(p)); <span class="comment">// FIXME use c++ cast</span>
00215 gluTessVertex( tobj, d, d);
00216 }
00217
00218 gluTessEndContour( tobj);
00219 }
00220
00221 gluTessEndPolygon( tobj);
00222
00223 gluDeleteTess( tobj);
00224 }
00225
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Dec 5 22:24:06 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>