blob: eab7f297f50e4b5826fa311c8ee3639997201b67 [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: FTGLTextureFont.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>FTGLTextureFont.cpp</h1><a href="FTGLTextureFont_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <span class="preprocessor">#include &lt;string&gt;</span> <span class="comment">// For memset</span>
00002
00003 <span class="preprocessor">#include "<a class="code" href="FTGLTextureFont_8h.html">FTGLTextureFont.h</a>"</span>
00004 <span class="preprocessor">#include "<a class="code" href="FTTextureGlyph_8h.html">FTTextureGlyph.h</a>"</span>
00005
00006
<a name="l00007"></a><a class="code" href="FTGLTextureFont_8cpp.html#a0">00007</a> <span class="keyword">inline</span> GLuint <a class="code" href="FTGLTextureFont_8cpp.html#a0">NextPowerOf2</a>( GLuint in)
00008 {
00009 in -= 1;
00010
00011 in |= in &gt;&gt; 16;
00012 in |= in &gt;&gt; 8;
00013 in |= in &gt;&gt; 4;
00014 in |= in &gt;&gt; 2;
00015 in |= in &gt;&gt; 1;
00016
00017 <span class="keywordflow">return</span> in + 1;
00018 }
00019
00020
<a name="l00021"></a><a class="code" href="classFTGLTextureFont.html#a0">00021</a> <a class="code" href="classFTGLTextureFont.html#a0">FTGLTextureFont::FTGLTextureFont</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* fontFilePath)
00022 : <a class="code" href="classFTFont.html">FTFont</a>( fontFilePath),
00023 maximumGLTextureSize(0),
00024 textureWidth(0),
00025 textureHeight(0),
00026 glyphHeight(0),
00027 glyphWidth(0),
00028 padding(3),
00029 xOffset(0),
00030 yOffset(0)
00031 {
00032 remGlyphs = numGlyphs = face.<a class="code" href="classFTFace.html#a11">GlyphCount</a>();
00033 }
00034
00035
<a name="l00036"></a><a class="code" href="classFTGLTextureFont.html#a1">00036</a> <a class="code" href="classFTGLTextureFont.html#a0">FTGLTextureFont::FTGLTextureFont</a>( <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *pBufferBytes, size_t bufferSizeInBytes)
00037 : <a class="code" href="classFTFont.html">FTFont</a>( pBufferBytes, bufferSizeInBytes),
00038 maximumGLTextureSize(0),
00039 textureWidth(0),
00040 textureHeight(0),
00041 glyphHeight(0),
00042 glyphWidth(0),
00043 padding(3),
00044 xOffset(0),
00045 yOffset(0)
00046 {
00047 remGlyphs = numGlyphs = face.<a class="code" href="classFTFace.html#a11">GlyphCount</a>();
00048 }
00049
00050
<a name="l00051"></a><a class="code" href="classFTGLTextureFont.html#a2">00051</a> <a class="code" href="classFTGLTextureFont.html#a2">FTGLTextureFont::~FTGLTextureFont</a>()
00052 {
00053 glDeleteTextures( textureIDList.<a class="code" href="classFTVector.html#a3">size</a>(), (<span class="keyword">const</span> GLuint*)&amp;textureIDList[0]);
00054 }
00055
00056
00057 <a class="code" href="classFTGlyph.html">FTGlyph</a>* <a class="code" href="classFTFont.html#b0">FTGLTextureFont::MakeGlyph</a>( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> glyphIndex)
00058 {
00059 FT_GlyphSlot ftGlyph = face.<a class="code" href="classFTFace.html#a10">Glyph</a>( glyphIndex, FT_LOAD_NO_HINTING);
00060
00061 <span class="keywordflow">if</span>( ftGlyph)
00062 {
00063 glyphHeight = static_cast&lt;int&gt;( charSize.<a class="code" href="classFTSize.html#a6">Height</a>());
00064 glyphWidth = static_cast&lt;int&gt;( charSize.<a class="code" href="classFTSize.html#a7">Width</a>());
00065
00066 <span class="keywordflow">if</span>( textureIDList.<a class="code" href="classFTVector.html#a9">empty</a>())
00067 {
00068 textureIDList.<a class="code" href="classFTVector.html#a14">push_back</a>( CreateTexture());
00069 xOffset = yOffset = padding;
00070 }
00071
00072 <span class="keywordflow">if</span>( xOffset &gt; ( textureWidth - glyphWidth))
00073 {
00074 xOffset = padding;
00075 yOffset += glyphHeight;
00076
00077 <span class="keywordflow">if</span>( yOffset &gt; ( textureHeight - glyphHeight))
00078 {
00079 textureIDList.<a class="code" href="classFTVector.html#a14">push_back</a>( CreateTexture());
00080 yOffset = padding;
00081 }
00082 }
00083
00084 <a class="code" href="classFTTextureGlyph.html">FTTextureGlyph</a>* tempGlyph = <span class="keyword">new</span> <a class="code" href="classFTTextureGlyph.html">FTTextureGlyph</a>( ftGlyph, textureIDList[textureIDList.<a class="code" href="classFTVector.html#a3">size</a>() - 1],
00085 xOffset, yOffset, textureWidth, textureHeight);
00086 xOffset += static_cast&lt;int&gt;( tempGlyph-&gt;<a class="code" href="classFTGlyph.html#a4">BBox</a>().<a class="code" href="classFTBBox.html#o3">upperX</a> - tempGlyph-&gt;<a class="code" href="classFTGlyph.html#a4">BBox</a>().<a class="code" href="classFTBBox.html#o0">lowerX</a> + padding);
00087
00088 --remGlyphs;
00089 <span class="keywordflow">return</span> tempGlyph;
00090 }
00091
00092 <a class="code" href="classFTFont.html#p3">err</a> = <a class="code" href="classFTFont.html#p0">face</a>.<a class="code" href="classFTFace.html#a12">Error</a>();
00093 <span class="keywordflow">return</span> NULL;
00094 }
00095
00096
00097 <span class="keywordtype">void</span> FTGLTextureFont::CalculateTextureSize()
00098 {
00099 <span class="keywordflow">if</span>( !maximumGLTextureSize)
00100 {
00101 glGetIntegerv( GL_MAX_TEXTURE_SIZE, (GLint*)&amp;maximumGLTextureSize);
00102 assert(maximumGLTextureSize); <span class="comment">// If you hit this then you have an invalid OpenGL context.</span>
00103 }
00104
00105 textureWidth = <a class="code" href="FTGLTextureFont_8cpp.html#a0">NextPowerOf2</a>( (remGlyphs * glyphWidth) + ( padding * 2));
00106 textureWidth = textureWidth &gt; maximumGLTextureSize ? maximumGLTextureSize : textureWidth;
00107
00108 <span class="keywordtype">int</span> h = static_cast&lt;int&gt;( (textureWidth - ( padding * 2)) / glyphWidth);
00109
00110 textureHeight = <a class="code" href="FTGLTextureFont_8cpp.html#a0">NextPowerOf2</a>( (( numGlyphs / h) + 1) * glyphHeight);
00111 textureHeight = textureHeight &gt; maximumGLTextureSize ? maximumGLTextureSize : textureHeight;
00112 }
00113
00114
00115 GLuint FTGLTextureFont::CreateTexture()
00116 {
00117 CalculateTextureSize();
00118
00119 <span class="keywordtype">int</span> totalMemory = textureWidth * textureHeight;
00120 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* textureMemory = <span class="keyword">new</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>[totalMemory];
00121 memset( textureMemory, 0, totalMemory);
00122
00123 GLuint textID;
00124 glGenTextures( 1, (GLuint*)&amp;textID);
00125
00126 glBindTexture( GL_TEXTURE_2D, textID);
00127 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00128 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00129 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00130 glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00131
00132 glTexImage2D( GL_TEXTURE_2D, 0, GL_ALPHA, textureWidth, textureHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, textureMemory);
00133
00134 <span class="keyword">delete</span> [] textureMemory;
00135
00136 <span class="keywordflow">return</span> textID;
00137 }
00138
00139
<a name="l00140"></a><a class="code" href="classFTGLTextureFont.html#a3">00140</a> <span class="keywordtype">bool</span> <a class="code" href="classFTFont.html#a9">FTGLTextureFont::FaceSize</a>( <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> size, <span class="keyword">const</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> res)
00141 {
00142 <span class="keywordflow">if</span>( !textureIDList.<a class="code" href="classFTVector.html#a9">empty</a>())
00143 {
00144 glDeleteTextures( textureIDList.<a class="code" href="classFTVector.html#a3">size</a>(), (<span class="keyword">const</span> GLuint*)&amp;textureIDList[0]);
00145 textureIDList.<a class="code" href="classFTVector.html#a12">clear</a>();
00146 remGlyphs = numGlyphs = face.<a class="code" href="classFTFace.html#a11">GlyphCount</a>();
00147 }
00148
00149 <span class="keywordflow">return</span> <a class="code" href="classFTFont.html#a9">FTFont::FaceSize</a>( size, res);
00150 }
00151
00152
<a name="l00153"></a><a class="code" href="classFTGLTextureFont.html#a4">00153</a> <span class="keywordtype">void</span> <a class="code" href="classFTGLTextureFont.html#a4">FTGLTextureFont::Render</a>( <span class="keyword">const</span> <span class="keywordtype">char</span>* string)
00154 {
00155 glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT);
00156
00157 glEnable(GL_BLEND);
00158 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); <span class="comment">// GL_ONE</span>
00159
00160 <a class="code" href="classFTTextureGlyph.html#e0">FTTextureGlyph::ResetActiveTexture</a>();
00161
00162 <a class="code" href="classFTFont.html#a19">FTFont::Render</a>( string);
00163
00164 glPopAttrib();
00165 }
00166
00167
<a name="l00168"></a><a class="code" href="classFTGLTextureFont.html#a5">00168</a> <span class="keywordtype">void</span> <a class="code" href="classFTGLTextureFont.html#a4">FTGLTextureFont::Render</a>( <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* string)
00169 {
00170 glPushAttrib( GL_ENABLE_BIT | GL_COLOR_BUFFER_BIT);
00171
00172 glEnable(GL_BLEND);
00173 glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); <span class="comment">// GL_ONE</span>
00174
00175 <a class="code" href="classFTTextureGlyph.html#e0">FTTextureGlyph::ResetActiveTexture</a>();
00176
00177 <a class="code" href="classFTFont.html#a19">FTFont::Render</a>( string);
00178
00179 glPopAttrib();
00180 }
00181
</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>