<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://thechange.wiki/index.php?action=history&amp;feed=atom&amp;title=Code%3Atext-quads.h</id>
	<title>Code:text-quads.h - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://thechange.wiki/index.php?action=history&amp;feed=atom&amp;title=Code%3Atext-quads.h"/>
	<link rel="alternate" type="text/html" href="https://thechange.wiki/index.php?title=Code:text-quads.h&amp;action=history"/>
	<updated>2026-06-16T17:11:55Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=519&amp;oldid=prev</id>
		<title>Elie at 13:40, 30 November 2022</title>
		<link rel="alternate" type="text/html" href="https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=519&amp;oldid=prev"/>
		<updated>2022-11-30T13:40:24Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:40, 30 November 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dependency&lt;/del&gt;: [[:File:font.data-uint8-1004x19]]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;C header for drawing text in OpenGL.&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Depends on font bitmap&lt;/ins&gt;: [[:File:font.data-uint8-1004x19]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Code==&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Code==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Elie</name></author>
	</entry>
	<entry>
		<id>https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=518&amp;oldid=prev</id>
		<title>Elie at 13:37, 30 November 2022</title>
		<link rel="alternate" type="text/html" href="https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=518&amp;oldid=prev"/>
		<updated>2022-11-30T13:37:48Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:37, 30 November 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Dependency: [[:File:font.data-uint8-1004x19]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;==Code==&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// text-quads.h&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;// text-quads.h&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Elie</name></author>
	</entry>
	<entry>
		<id>https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=517&amp;oldid=prev</id>
		<title>Elie: Created page with &quot;&lt;syntaxhighlight lang=&quot;c&quot;&gt; // text-quads.h // Functions for drawing text in OpenGL, using textured quads. #define TQ_TEXTURE_WIDTH 1004 #define TQ_TEXTURE_HEIGHT 19 #define TQ_TEXTURE_FILENAME &quot;font.data-uint8-1004x19&quot; // DEPENDENCY: This texture file.  /*  Copyright 2022, Elie Goldman Smith   This program is FREE SOFTWARE: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation, either ver...&quot;</title>
		<link rel="alternate" type="text/html" href="https://thechange.wiki/index.php?title=Code:text-quads.h&amp;diff=517&amp;oldid=prev"/>
		<updated>2022-11-30T13:36:34Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt; // text-quads.h // Functions for drawing text in OpenGL, using textured quads. #define TQ_TEXTURE_WIDTH 1004 #define TQ_TEXTURE_HEIGHT 19 #define TQ_TEXTURE_FILENAME &amp;quot;font.data-uint8-1004x19&amp;quot; // DEPENDENCY: This texture file.  /*  Copyright 2022, Elie Goldman Smith   This program is FREE SOFTWARE: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation, either ver...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// text-quads.h&lt;br /&gt;
// Functions for drawing text in OpenGL, using textured quads.&lt;br /&gt;
#define TQ_TEXTURE_WIDTH 1004&lt;br /&gt;
#define TQ_TEXTURE_HEIGHT 19&lt;br /&gt;
#define TQ_TEXTURE_FILENAME &amp;quot;font.data-uint8-1004x19&amp;quot; // DEPENDENCY: This texture file.&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 Copyright 2022, Elie Goldman Smith&lt;br /&gt;
&lt;br /&gt;
 This program is FREE SOFTWARE: you can redistribute it and/or modify&lt;br /&gt;
 it under the terms of the GNU General Public License as published by&lt;br /&gt;
 the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
 (at your option) any later version.&lt;br /&gt;
&lt;br /&gt;
 This program is distributed in the hope that it will be useful,&lt;br /&gt;
 but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
 GNU General Public License for more details.&lt;br /&gt;
&lt;br /&gt;
 You should have received a copy of the GNU General Public License&lt;br /&gt;
 along with this program.  If not, see &amp;lt;https://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
typedef struct { float x, y, tx, ty;                 } TQ_Vertex;  // XXX: maybe use 16-bit snorm instead of 32-bit float?&lt;br /&gt;
typedef struct { TQ_Vertex *v; int n; int isComplete;} TQ_Drawable;// XXX: in future versions, isComplete might get renamed to 'flags'&lt;br /&gt;
TQ_Vertex _tq_alphabet[1024]; // 256 quads (one for every char value)&lt;br /&gt;
GLuint    _tq_texture;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tq_init() {&lt;br /&gt;
 // load font bitmap&lt;br /&gt;
 size_t SIZE = TQ_TEXTURE_WIDTH*TQ_TEXTURE_HEIGHT;&lt;br /&gt;
 unsigned char *bitmap = malloc(SIZE);&lt;br /&gt;
 if (!bitmap) return; // TODO: handle error better&lt;br /&gt;
 FILE *f = fopen(TQ_TEXTURE_FILENAME,&amp;quot;r&amp;quot;);&lt;br /&gt;
 if (!f) { perror(TQ_TEXTURE_FILENAME); return; } // TODO: handle error better&lt;br /&gt;
 int n = fread(bitmap, 1, SIZE, f);&lt;br /&gt;
 if (n != SIZE) { printf(&amp;quot;read %d chars\n&amp;quot;, n); fclose(f); return; } // TODO: handle error better&lt;br /&gt;
 fclose(f);&lt;br /&gt;
&lt;br /&gt;
 // create font texture&lt;br /&gt;
 glGenTextures(1, &amp;amp;_tq_texture);&lt;br /&gt;
 glEnable(GL_TEXTURE_2D);&lt;br /&gt;
 glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
 glBindTexture(GL_TEXTURE_2D, _tq_texture);&lt;br /&gt;
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, TQ_TEXTURE_WIDTH, TQ_TEXTURE_HEIGHT-1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, &amp;amp;bitmap[TQ_TEXTURE_WIDTH]); // we skip first row of bitmap because that's the indicator for where each character is.  XXX: maybe use a smaller internalformat? we really only need 4-bit monochrome&lt;br /&gt;
 glGenerateMipmap(GL_TEXTURE_2D); // XXX: maybe get rid of mipmaps idk&lt;br /&gt;
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);&lt;br /&gt;
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);&lt;br /&gt;
&lt;br /&gt;
 // create the alphabet&lt;br /&gt;
 memset(_tq_alphabet, 0, 1024*sizeof(TQ_Vertex));&lt;br /&gt;
 int c = 32; // bitmapped font starts at char 32 (space character)&lt;br /&gt;
 int lasti = 0;&lt;br /&gt;
 for (int i = 0; i&amp;lt;=TQ_TEXTURE_WIDTH; i++) {&lt;br /&gt;
  if (bitmap[i]||i==TQ_TEXTURE_WIDTH) {&lt;br /&gt;
   float x = (float)(i-lasti)/TQ_TEXTURE_HEIGHT;&lt;br /&gt;
   float tx =         (i-0.5f)/TQ_TEXTURE_WIDTH;&lt;br /&gt;
   float lasttx = (lasti+0.5f)/TQ_TEXTURE_WIDTH;&lt;br /&gt;
   lasti = i;&lt;br /&gt;
   _tq_alphabet[c*4  ].x = x;&lt;br /&gt;
   _tq_alphabet[c*4  ].y = -1.f;&lt;br /&gt;
   _tq_alphabet[c*4  ].tx= tx;&lt;br /&gt;
   _tq_alphabet[c*4  ].ty= 1;&lt;br /&gt;
   _tq_alphabet[c*4+1].x = x;&lt;br /&gt;
   _tq_alphabet[c*4+1].y = 0.f;&lt;br /&gt;
   _tq_alphabet[c*4+1].tx= tx;&lt;br /&gt;
   _tq_alphabet[c*4+1].ty= 0;&lt;br /&gt;
   _tq_alphabet[c*4+2].x = 0;&lt;br /&gt;
   _tq_alphabet[c*4+2].y = 0.f;&lt;br /&gt;
   _tq_alphabet[c*4+2].tx= lasttx;&lt;br /&gt;
   _tq_alphabet[c*4+2].ty= 0;&lt;br /&gt;
   _tq_alphabet[c*4+3].x = 0;&lt;br /&gt;
   _tq_alphabet[c*4+3].y = -1.f;&lt;br /&gt;
   _tq_alphabet[c*4+3].tx= lasttx;&lt;br /&gt;
   _tq_alphabet[c*4+3].ty= 1;&lt;br /&gt;
   c++;&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 free(bitmap);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tq_mode() {&lt;br /&gt;
 glEnable(GL_TEXTURE_2D);&lt;br /&gt;
 glActiveTexture(GL_TEXTURE0);&lt;br /&gt;
 glBindTexture(GL_TEXTURE_2D, _tq_texture);&lt;br /&gt;
 glEnable(GL_BLEND);&lt;br /&gt;
 glBlendFunc(GL_ONE, GL_ONE);&lt;br /&gt;
 glEnableClientState(GL_VERTEX_ARRAY);&lt;br /&gt;
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tq_draw(TQ_Drawable td) {&lt;br /&gt;
 glVertexPointer  (2, GL_FLOAT, sizeof(TQ_Vertex), &amp;amp;td.v[0].x);&lt;br /&gt;
 glTexCoordPointer(2, GL_FLOAT, sizeof(TQ_Vertex), &amp;amp;td.v[0].tx);&lt;br /&gt;
 glDrawArrays(GL_QUADS, 0, td.n);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
TQ_Drawable tq_centered_fitted(const char *str, float width, float height) { // Nominal font size is 1. Actual font size may vary slightly to fit.&lt;br /&gt;
 TQ_Drawable td; td.n=0; td.v=NULL; td.isComplete=0;&lt;br /&gt;
 if (!str   )return td; // null string&lt;br /&gt;
 if (!str[0])return td; // blank string&lt;br /&gt;
 td.v = malloc((strlen(str)+3+1) * 4 * sizeof(TQ_Vertex));&lt;br /&gt;
 if (!td.v  )return td; // malloc error&lt;br /&gt;
 const float SPACING = 0.05f;&lt;br /&gt;
 const char *p = str;&lt;br /&gt;
 float       x=0, y=0;&lt;br /&gt;
 const char *ls = p; // line start&lt;br /&gt;
 const char *le = p; // line end&lt;br /&gt;
 float       lw = 0; // line width&lt;br /&gt;
 float       widest=0;// widest line&lt;br /&gt;
 while (*p &amp;amp;&amp;amp; y &amp;gt; -height+0.99f) {&lt;br /&gt;
  // determine where the next line should end...&lt;br /&gt;
  lw = x = 0;&lt;br /&gt;
  while (1) {&lt;br /&gt;
   if (*p=='\0'||*p=='\n'){ le=p; lw=x; break; }&lt;br /&gt;
   if (isspace(*p))       { le=p; lw=x;        }&lt;br /&gt;
   x += _tq_alphabet[*(unsigned char*)p * 4].x + SPACING;&lt;br /&gt;
   if (x &amp;gt;= width &amp;amp;&amp;amp; lw&amp;gt;0)  {       break; }&lt;br /&gt;
   if (*p=='-' || *p==','){ le=p; lw=x;        }&lt;br /&gt;
   p++;&lt;br /&gt;
  } lw -= SPACING;&lt;br /&gt;
  // generate quads of that line...&lt;br /&gt;
  if (lw &amp;lt;= width) { // usual case&lt;br /&gt;
   x = -0.5f * lw;&lt;br /&gt;
   if (widest&amp;lt;lw) widest=lw;&lt;br /&gt;
   for (p=ls; p&amp;lt;=le; p++) {&lt;br /&gt;
    int base = *(unsigned char*)p * 4;&lt;br /&gt;
    if (*p != ' ') { // skipping spaces is an optimization&lt;br /&gt;
     for (int i=0;i&amp;lt;4;i++) {&lt;br /&gt;
      td.v[td.n] = _tq_alphabet[base+i];&lt;br /&gt;
      td.v[td.n].x += x;&lt;br /&gt;
      td.v[td.n].y += y;&lt;br /&gt;
      td.n++;&lt;br /&gt;
     }&lt;br /&gt;
    } x += _tq_alphabet[base].x + SPACING;&lt;br /&gt;
   } y -= 1.f;&lt;br /&gt;
  }&lt;br /&gt;
  else { // case where line is one word and too wide: shrink&lt;br /&gt;
   x = -0.5f * width;&lt;br /&gt;
   widest = width;&lt;br /&gt;
   float scale = width/lw;&lt;br /&gt;
   float spacing = SPACING*scale;&lt;br /&gt;
   for (p=ls; p&amp;lt;=le; p++) {&lt;br /&gt;
    int base = *(unsigned char*)p * 4;&lt;br /&gt;
    if (*p != ' ') {&lt;br /&gt;
     for (int i=0;i&amp;lt;4;i++) {&lt;br /&gt;
      td.v[td.n] = _tq_alphabet[base+i];&lt;br /&gt;
      td.v[td.n].x *= scale;&lt;br /&gt;
      td.v[td.n].x += x;&lt;br /&gt;
      td.v[td.n].y *= scale;&lt;br /&gt;
      td.v[td.n].y += y;&lt;br /&gt;
      td.n++;&lt;br /&gt;
     }&lt;br /&gt;
    } x += _tq_alphabet[base].x*scale + spacing;&lt;br /&gt;
   } y -= scale;&lt;br /&gt;
  }&lt;br /&gt;
  if (*le == '\0') { td.isComplete = 1; break; }&lt;br /&gt;
  ls = p = ++le;&lt;br /&gt;
 }&lt;br /&gt;
 // expand text if small&lt;br /&gt;
 if (widest &amp;lt; width &amp;amp;&amp;amp; y &amp;gt; -height) {&lt;br /&gt;
  float sx = width/widest;&lt;br /&gt;
  float sy = -height/y;&lt;br /&gt;
  float scale = sx&amp;lt;sy?sx:sy;&lt;br /&gt;
  for (int i=0; i&amp;lt;td.n; i++) {&lt;br /&gt;
   td.v[i].x *= scale;&lt;br /&gt;
   td.v[i].y *= scale;&lt;br /&gt;
  } y *= scale;&lt;br /&gt;
 }&lt;br /&gt;
 // add ellipsis if text didn't all fit&lt;br /&gt;
 if (*le) {&lt;br /&gt;
  int base = 4 * (unsigned char)'.';&lt;br /&gt;
  for (int h=0;h&amp;lt;3;h++) {&lt;br /&gt;
   x = 0.5f*lw + h * (_tq_alphabet[base].x + 0.02f);&lt;br /&gt;
   for (int i=0;i&amp;lt;4;i++) {&lt;br /&gt;
    td.v[td.n] = _tq_alphabet[base+i];&lt;br /&gt;
    td.v[td.n].x += x;&lt;br /&gt;
    td.v[td.n].y += y + 1.f;&lt;br /&gt;
    td.n++;&lt;br /&gt;
   }&lt;br /&gt;
  }&lt;br /&gt;
 }&lt;br /&gt;
 // center vertically&lt;br /&gt;
 y *= 0.5f; for (int i=0; i&amp;lt;td.n; i++) td.v[i].y -= y;&lt;br /&gt;
 // done&lt;br /&gt;
 return td;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tq_delete(TQ_Drawable *td) {&lt;br /&gt;
 free(td-&amp;gt;v); td-&amp;gt;v = NULL;&lt;br /&gt;
 td-&amp;gt;n = 0; td-&amp;gt;isComplete = 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
void tq_done() {&lt;br /&gt;
 glDeleteTextures(1, &amp;amp;_tq_texture);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Elie</name></author>
	</entry>
</feed>