<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>TTF reinitialization bug after al_shutdown_allegro</title>
		<link>http://www.allegro.cc/forums/view/618183</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 13 Jul 2020 03:07:57 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When re-initializing the TTF addon after <span class="source-code">al_shutdown_allegro</span>, it will not be properly initialized unless a call to <span class="source-code">al_uninstall_ttf_addon</span> is provided <i>after</i> <span class="source-code">al_shutdown_allegro</span>.</p><p>Here&#39;s a minimal program with two commented lines of code that will show the different results:</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">  5</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  6</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  7</span>
<span class="number">  8</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  9</span><span class="k2">{</span>
<span class="number"> 10</span>   std::string full_font_path <span class="k3">=</span> <span class="s">"/Users/markoates/Repos/allegro_flare/bin/data/fonts/DroidSans.ttf"</span><span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span>   <span class="c">// ----</span>
<span class="number"> 13</span>
<span class="number"> 14</span>   <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>   <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>   <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_font"><span class="a">al_load_font</span></a><span class="k2">(</span>full_font_path.c_str<span class="k2">(</span><span class="k2">)</span>, <span class="n">20</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span>   <span class="k1">int</span> first_load_width <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_text_width"><span class="a">al_get_text_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a>, <span class="s">"W"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>   <span class="c">//al_shutdown_ttf_addon(); // &lt;-- this results in a segfault</span>
<span class="number"> 23</span>   <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>   <span class="c">//al_shutdown_ttf_addon(); // &lt;-- this is required for al_init_ttf_addon() to be re-initialized below, otherwise</span>
<span class="number"> 25</span>                              <span class="c">//     the subsequent al_get_text_width will return 0</span>
<span class="number"> 26</span>
<span class="number"> 27</span>   <span class="c">// ----</span>
<span class="number"> 28</span>
<span class="number"> 29</span>   <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</span>   <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>   <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>
<span class="number"> 33</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span>second_font <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_font"><span class="a">al_load_font</span></a><span class="k2">(</span>full_font_path.c_str<span class="k2">(</span><span class="k2">)</span>, <span class="n">20</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>
<span class="number"> 35</span>   <span class="k1">int</span> second_load_width <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_text_width"><span class="a">al_get_text_width</span></a><span class="k2">(</span>second_font, <span class="s">"W"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 36</span>
<span class="number"> 37</span>   <a href="http://www.allegro.cc/manual/al_uninstall_system"><span class="a">al_uninstall_system</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 38</span>
<span class="number"> 39</span>   <span class="c">// ----</span>
<span class="number"> 40</span>
<span class="number"> 41</span>   <span class="k1">if</span> <span class="k2">(</span>first_load_width <span class="k3">=</span><span class="k3">=</span> second_load_width<span class="k2">)</span>
<span class="number"> 42</span>      std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"PASS ("</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> first_load_width <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" != "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> second_load_width <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">")"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 43</span>   <span class="k1">else</span>
<span class="number"> 44</span>      std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">"FAIL ("</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> first_load_width <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">" != "</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> second_load_width <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="s">")"</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 45</span>
<span class="number"> 46</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 47</span><span class="k2">}</span>
</div></div><p>

Didn&#39;t have time to go into causes, but it appeared as a flakey test during several test runs.</p><p>So question is, should <span class="source-code">al_shutdown_allegro</span> also shutdown and uninstall all the addons?  That&#39;s my expectation.  If it&#39;s not, which ones would I need to shutdown in order to ensure a clean slate?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Mon, 13 Jul 2020 00:54:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I think that&#39;s a bug, for example if you compare the font addon:</p><p><a href="https://github.com/liballeg/allegro5/blob/master/addons/font/font.c#L381">https://github.com/liballeg/allegro5/blob/master/addons/font/font.c#L381</a></p><p>It registers a shutdown function to uninstall itself. The ttf addon forgets to do the same:</p><p><a href="https://github.com/liballeg/allegro5/blob/master/addons/ttf/ttf.c#L1104">https://github.com/liballeg/allegro5/blob/master/addons/ttf/ttf.c#L1104</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Mon, 13 Jul 2020 03:07:57 +0000</pubDate>
	</item>
</rss>
