<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>4.2.1 seems to be fooked with font grabbing</title>
		<link>http://www.allegro.cc/forums/view/589885</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 09 Feb 2007 02:32:17 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,<br />I was in the process of testing 4.2.1 release to see if it fixes the system bitmap problem with sub-bitmaps (<a href="http://allegro.cc/forums/thread/589858/646845#target">http://allegro.cc/forums/thread/589858/646845#target</a>) - and it does, however I&#39;ve now come across quite a major bug.</p><p>Before I get out the debugger and fail to find the fault, just wondered if anyone else has come across this. It is a windows build, btw.</p><p>Basically, when you use grab_font_from_bitmap(f) when the bitmap is not a memory bitmap, (i.e. video or system bitmap) it takes about 15 to 20 seconds to make the call. I have 5 fonts to be grabbed so that&#39;s about two minutes just waiting for a program to start. I guess it&#39;s a locking problem? In 4.2.0 it is immediate (milliseconds) for any bitmap type.</p><p>[edit]tell a lie, with memory bitmaps grab_from_bitmap akes about 2 seconds per bitmap font, so something is definitely up[/edit]</p><p>The bitmap is fine and I can run 4.2.0 on it and all is well.</p><p>I guess the simplest question is, if it&#39;s related specifically to the grab_font code, can anyone do a diff to see what has changed?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Sun, 04 Feb 2007 05:57:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here are the changes in fontbmp.c from 4.2.0 to 4.2.1.  The _AL_MALLOC/_AL_FREE changes are nothing, so the only thing that may make a difference is the first hunk.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> fontbmp.c  <span class="k2">(</span><span class="k3">/</span>mirror<span class="k3">/</span>allegro<span class="k3">/</span>allegro<span class="k3">/</span>tags<span class="k3">/</span>v4-2-0<span class="k3">/</span>src<span class="k3">/</span>fontbmp.c<span class="k2">)</span>  <span class="k2">(</span>revision <span class="n">7758</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k3">+</span><span class="k3">+</span><span class="k3">+</span> fontbmp.c  <span class="k2">(</span><span class="k3">/</span>mirror<span class="k3">/</span>allegro<span class="k3">/</span>allegro<span class="k3">/</span>tags<span class="k3">/</span>v4-2-1<span class="k3">/</span>src<span class="k3">/</span>fontbmp.c<span class="k2">)</span>  <span class="k2">(</span>revision <span class="n">7758</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td>@@ <span class="k3">-</span><span class="n">32</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">32</span>,<span class="n">10</span> @@ <span class="k1">static</span> <span class="k1">void</span> font_find_character<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span></td></tr><tr><td class="number">4</td><td> <span class="k2">{</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">6</td><td> </td></tr><tr><td class="number">7</td><td><span class="k3">-</span>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">8</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">8</td><td><span class="k3">+</span>   <span class="k1">if</span> <span class="k2">(</span>_bitmap_has_alpha<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">9</td><td><span class="k3">+</span>      c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>bmp, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k3">+</span>   <span class="k2">}</span></td></tr><tr><td class="number">11</td><td><span class="k3">+</span>   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">8</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>       c <span class="k3">=</span> <span class="n">255</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">14</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>@@ <span class="k3">-</span><span class="n">85</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">88</span>,<span class="n">7</span> @@ <span class="k1">static</span> <span class="k1">int</span> import_bitmap_font_mono<span class="k2">(</span>BITMA</td></tr><tr><td class="number">16</td><td>       <span class="k1">if</span><span class="k2">(</span>w <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">|</span><span class="k3">|</span> h <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">17</td><td>    <span class="k1">int</span> j<span class="k2">;</span></td></tr><tr><td class="number">18</td><td> </td></tr><tr><td class="number">19</td><td><span class="k3">-</span>   gl<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k2">)</span> <span class="k3">+</span> <span class="n">8</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k3">+</span>   gl<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k2">)</span> <span class="k3">+</span> <span class="n">8</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>    gl<span class="k3">&lt;</span>i&gt;-&gt;w <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    gl<span class="k3">&lt;</span>i&gt;-&gt;h <span class="k3">=</span> <span class="n">8</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td> </td></tr><tr><td class="number">24</td><td>@@ <span class="k3">-</span><span class="n">94</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">97</span>,<span class="n">7</span> @@ <span class="k1">static</span> <span class="k1">int</span> import_bitmap_font_mono<span class="k2">(</span>BITMA</td></tr><tr><td class="number">25</td><td>       <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">26</td><td>    <span class="k1">int</span> sx <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>w <span class="k3">+</span> <span class="n">7</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">8</span><span class="k2">)</span>, j, k<span class="k2">;</span></td></tr><tr><td class="number">27</td><td> </td></tr><tr><td class="number">28</td><td><span class="k3">-</span>   gl<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k2">)</span> <span class="k3">+</span> sx <span class="k3">*</span> h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k3">+</span>   gl<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k2">)</span> <span class="k3">+</span> sx <span class="k3">*</span> h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    gl<span class="k3">&lt;</span>i&gt;-&gt;w <span class="k3">=</span> w<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>    gl<span class="k3">&lt;</span>i&gt;-&gt;h <span class="k3">=</span> h<span class="k2">;</span></td></tr><tr><td class="number">32</td><td> </td></tr><tr><td class="number">33</td><td>@@ <span class="k3">-</span><span class="n">222</span>,<span class="n">18</span> <span class="k3">+</span><span class="n">225</span>,<span class="n">18</span> @@ <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/grab_font_from_bitmap" target="_blank"><span class="a">grab_font_from_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">)</span></td></tr><tr><td class="number">34</td><td>    import_x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>    import_y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td> </td></tr><tr><td class="number">37</td><td><span class="k3">-</span>   f <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span> <span class="k3">*</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td><span class="k3">+</span>   f <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span> <span class="k3">*</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>    <span class="k1">if</span> <span class="k2">(</span>end <span class="k3">=</span><span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> end <span class="k3">=</span> bitmap_font_count<span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">+</span> begin<span class="k2">;</span></td></tr><tr><td class="number">40</td><td> </td></tr><tr><td class="number">41</td><td>    <span class="k1">if</span> <span class="k2">(</span>bitmap_font_ismono<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">42</td><td><span class="k3">-</span>      FONT_MONO_DATA<span class="k3">*</span> mf <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_MONO_DATA<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td><span class="k3">+</span>      FONT_MONO_DATA<span class="k3">*</span> mf <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_MONO_DATA<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">44</td><td> </td></tr><tr><td class="number">45</td><td><span class="k3">-</span>      mf-&gt;glyphs <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k3">*</span><span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>end <span class="k3">-</span> begin<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td><span class="k3">+</span>      mf-&gt;glyphs <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_GLYPH<span class="k3">*</span><span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>end <span class="k3">-</span> begin<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">47</td><td> </td></tr><tr><td class="number">48</td><td>       <span class="k1">if</span> <span class="k2">(</span> import_bitmap_font_mono<span class="k2">(</span>bmp, mf-&gt;glyphs, end <span class="k3">-</span> begin<span class="k2">)</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">49</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>mf-&gt;glyphs<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>mf<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>mf-&gt;glyphs<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>mf<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">54</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>    f <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">56</td><td>       <span class="k2">}</span></td></tr><tr><td class="number">57</td><td>       <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">58</td><td>@@ <span class="k3">-</span><span class="n">247</span>,<span class="n">13</span> <span class="k3">+</span><span class="n">250</span>,<span class="n">13</span> @@ <a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/grab_font_from_bitmap" target="_blank"><span class="a">grab_font_from_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">)</span></td></tr><tr><td class="number">59</td><td>       <span class="k2">}</span></td></tr><tr><td class="number">60</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">61</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">62</td><td><span class="k3">-</span>      FONT_COLOR_DATA<span class="k3">*</span> cf <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_COLOR_DATA<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td><span class="k3">-</span>      cf-&gt;bitmaps <span class="k3">=</span> _al_malloc<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>end <span class="k3">-</span> begin<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td><span class="k3">+</span>      FONT_COLOR_DATA<span class="k3">*</span> cf <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span>FONT_COLOR_DATA<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td><span class="k3">+</span>      cf-&gt;bitmaps <span class="k3">=</span> _AL_MALLOC<span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span>end <span class="k3">-</span> begin<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td> </td></tr><tr><td class="number">67</td><td>       <span class="k1">if</span><span class="k2">(</span> import_bitmap_font_color<span class="k2">(</span>bmp, cf-&gt;bitmaps, end <span class="k3">-</span> begin<span class="k2">)</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>cf-&gt;bitmaps<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>cf<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">70</td><td><span class="k3">-</span>   <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>cf-&gt;bitmaps<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>cf<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">73</td><td><span class="k3">+</span>   _AL_FREE<span class="k2">(</span>f<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>    f <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">75</td><td>       <span class="k2">}</span></td></tr><tr><td class="number">76</td><td>       <span class="k1">else</span> <span class="k2">{</span></td></tr></tbody></table></div></div><p>

The first section was changed due to this:</p><div class="source-code snippet"><div class="inner"><pre>r5721 <span class="k2">(</span>orig r5674<span class="k2">)</span><span class="k2">:</span>  elias <span class="k3">|</span> <span class="n">2006</span><span class="k3">-</span><span class="n">01</span><span class="k3">-</span><span class="n">19</span> <span class="n">07</span><span class="k2">:</span><span class="n">36</span><span class="k2">:</span><span class="n">55</span> <span class="k3">+</span><span class="n">1100</span>

Patch to add support <span class="k1">for</span> anti-aliased bitmap fonts. It does the following:
<span class="k3">-</span> Allow to <a href="http://www.delorie.com/djgpp/doc/libc/libc_642.html" target="_blank">read</a> in alpha fonts. If alpha values are detected in a <span class="n">32b</span>it <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a> bitmap, the top left pixel is used as mask color instead of yel- Add a <a href="http://www.allegro.cc/manual/make_trans_font" target="_blank"><span class="a">make_trans_font</span></a> function. This simply changes the vtable of the passed color <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a> to one <span class="k1">using</span> <a href="http://www.allegro.cc/manual/draw_trans_sprite" target="_blank"><span class="a">draw_trans_sprite</span></a> <span class="k1">for</span> render_char.
<span class="k3">-</span> Since there were now <span class="n">3</span> locations <span class="k1">using</span> bitmap_has_alpha, made it an internal function.
</pre></div></div><p>

But bitmap_has_alpha is implemented very inefficiently:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k3">-</span><span class="k3">-</span><span class="k3">-</span> mirror<span class="k3">/</span>allegro<span class="k3">/</span>allegro<span class="k3">/</span>branches<span class="k3">/</span><span class="n">4</span>.<span class="n">2</span><span class="k3">/</span>src<span class="k3">/</span>gfx.c       <span class="k2">(</span>revision <span class="n">5720</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k3">+</span><span class="k3">+</span><span class="k3">+</span> mirror<span class="k3">/</span>allegro<span class="k3">/</span>allegro<span class="k3">/</span>branches<span class="k3">/</span><span class="n">4</span>.<span class="n">2</span><span class="k3">/</span>src<span class="k3">/</span>gfx.c       <span class="k2">(</span>revision <span class="n">5721</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td>@@ <span class="k3">-</span><span class="n">163</span>,<span class="n">6</span> <span class="k3">+</span><span class="n">163</span>,<span class="n">29</span> @@ <span class="k1">void</span> <a href="http://www.allegro.cc/manual/clear_bitmap" target="_blank"><span class="a">clear_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bitmap<span class="k2">)</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k3">+</span><span class="c">/* _bitmap_has_alpha:</span></td></tr><tr><td class="number">8</td><td><span class="c">+ *  Checks whether this bitmap has an alpha channel.</span></td></tr><tr><td class="number">9</td><td><span class="c">+ */</span></td></tr><tr><td class="number">10</td><td><span class="k3">+</span><span class="k1">int</span> _bitmap_has_alpha<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">)</span></td></tr><tr><td class="number">11</td><td><span class="k3">+</span><span class="k2">{</span></td></tr><tr><td class="number">12</td><td><span class="k3">+</span>   <span class="k1">int</span> x, y, c<span class="k2">;</span></td></tr><tr><td class="number">13</td><td><span class="k3">+</span></td></tr><tr><td class="number">14</td><td><span class="k3">+</span>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> <span class="n">32</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td><span class="k3">+</span>      <span class="k1">return</span> FALSE<span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k3">+</span></td></tr><tr><td class="number">17</td><td><span class="k3">+</span>   <span class="k1">for</span> <span class="k2">(</span>y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> bmp-&gt;h<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">18</td><td><span class="k3">+</span>      <span class="k1">for</span> <span class="k2">(</span>x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> bmp-&gt;w<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">19</td><td><span class="k3">+</span>        c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>bmp, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k3">+</span>        <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/geta32" target="_blank"><span class="a">geta32</span></a><span class="k2">(</span>c<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">21</td><td><span class="k3">+</span>           <span class="k1">return</span> TRUE<span class="k2">;</span></td></tr><tr><td class="number">22</td><td><span class="k3">+</span>      <span class="k2">}</span></td></tr><tr><td class="number">23</td><td><span class="k3">+</span>   <span class="k2">}</span></td></tr><tr><td class="number">24</td><td><span class="k3">+</span></td></tr><tr><td class="number">25</td><td><span class="k3">+</span>   <span class="k1">return</span> FALSE<span class="k2">;</span></td></tr><tr><td class="number">26</td><td><span class="k3">+</span><span class="k2">}</span></td></tr><tr><td class="number">27</td><td><span class="k3">+</span></td></tr><tr><td class="number">28</td><td><span class="k3">+</span></td></tr><tr><td class="number">29</td><td><span class="k3">+</span></td></tr><tr><td class="number">30</td><td> <span class="c">/* vsync:</span></td></tr><tr><td class="number">31</td><td><span class="c">  *  Waits for a retrace.</span></td></tr><tr><td class="number">32</td><td><span class="c">  */</span></td></tr></tbody></table></div></div><p>

So I guess that&#39;s the problem.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Sun, 04 Feb 2007 06:33:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>and the fix is?</p><p>I&#39;m not at my dev machine at the minute, but to prove it, I&#39;ll redo the bitmaps in 8bpp and see if it does anything. But how can scanning through a bitmap take so long? and why is it using getpixel and not _getpixel? and shouldn&#39;t there be a flag in the functions to turn this new alpha/alias checking off? and why is the get alpha called for 8bpp explicitly then in the get alpha code returned immediately if 8bpp? so many questions <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>btw, pardon my French but those if statements at the top look awefully messy. </p><p>Cheers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Sun, 04 Feb 2007 15:28:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
But how can scanning through a bitmap take so long?
</p></div></div><p>Reading from video bitmaps is VERY VERY slow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 04 Feb 2007 15:35:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>these are system bitmaps as well that take 20 or so seconds. memory bitmaps have also increased from milliseconds to seconds.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Sun, 04 Feb 2007 15:42:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I would assume system bitmaps are just as slow.. I&#39;m not 100% sure though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 04 Feb 2007 15:44:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>if you take a stab at a memory bitmap taking 100ms to scan in 4.2 (it was immediate for me for 5 bitmaps) and in the new one it takes 1200ms (it took about 7 seconds in 4.2.1), then that&#39;s a 12x decrease in speed with the new code, even with memory bitmaps.</p><p>But I think Peter is right and the fault is the way the new code patch works for checking for aliased/alpha. For starters there&#39;s one check looking for 8bpp but the function it calls returns immediately if it is 8bpp, then there&#39;s the use of getpixel.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Sun, 04 Feb 2007 15:54:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is what I&#39;m saying, its reading every single pixel from the bitmap, and checking if theres a non solid alpha value. That reading is comparatively slow with memorybitmaps, but much slower on non memory bitmaps (which you first started talking about).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sun, 04 Feb 2007 16:11:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;m not at my dev machine at the minute, but to prove it, I&#39;ll redo the bitmaps in 8bpp and see if it does anything.
</p></div></div><p>
Or you can use any bitmap that isn&#39;t 32 bpp.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
But how can scanning through a bitmap take so long?
</p></div></div><p>
Because it&#39;s checking the entire bitmap for the presence of an alpha channel for each character you grab from it, that&#39;s why. It breaks out of this as soon as it finds an alpha value, but the worst case is obviously going to be the case where no alpha value is set at all.<br />It shouldn&#39;t be <i>very</i> difficult to provide a fix for this that only does the check once per call of grab_font_from_bitmap(), give me half an hour or so.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
and why is it using getpixel and not _getpixel?
</p></div></div><p>
Because _getpixel() only works on 8 bit memory bitmaps whereas getpixel() works on any type of bitmap in any colour depth?<br />Beside which, you&#39;re not supposed to call grab_font_from_bitmap() in speed-critical code. In other words, the speed difference between getpixel() and _getpixel*() should not be that important.<br />That said, feel free to optimise it and submit a patch (EDIT: see attachment).</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
and shouldn&#39;t there be a flag in the functions to turn this new alpha/alias checking off?
</p></div></div><p>
I don&#39;t think so. That would <i>really</i> make things messy.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
and why is the get alpha called for 8bpp explicitly then in the get alpha code returned immediately if 8bpp?
</p></div></div><p>
It isn&#39;t called for 8bpp. The code checks first if the bitmap has an alpha channel (false for all but 32 bpp, which can have one), then if it&#39;s 8bpp:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">static</span> <span class="k1">void</span> font_find_character<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> <span class="k3">*</span>x, <span class="k1">int</span> <span class="k3">*</span>y, <span class="k1">int</span> <span class="k3">*</span>w, <span class="k1">int</span> <span class="k3">*</span>h<span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span> c<span class="k2">;</span>

   <span class="k1">if</span> <span class="k2">(</span>_bitmap_has_alpha<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
      c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>bmp, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
   <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>bmp<span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="n">8</span><span class="k2">)</span> <span class="k2">{</span>
      c <span class="k3">=</span> <span class="n">255</span><span class="k2">;</span>
   <span class="k2">}</span>
   <span class="k1">else</span> <span class="k2">{</span>
      c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/makecol_depth" target="_blank"><span class="a">makecol_depth</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>bmp<span class="k2">)</span>, <span class="n">255</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
   <span class="k2">}</span>
</pre></div></div><p>

</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
those if statements at the top look awefully messy.
</p></div></div><p>
How would you do this then?</p><p>Now, personal opinion: it makes no sense whatsoever to call grab_font_from_bitmap on a video or system bitmap, precisely because you need to read data back from teh bitmap. This should be obvious, but if you want we can add a sentence to the documentation explaining this.</p><p>EDIT: patch attached.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Sun, 04 Feb 2007 16:24:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Beside which, you&#39;re not supposed to call grab_font_from_bitmap() in speed-critical code.
</p></div></div><p>It&#39;s still a lot slower for memory bitmaps, but liveable I guess.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
it makes no sense whatsoever to call grab_font_from_bitmap on a video or system bitmap
</p></div></div><p>I&#39;ve always treated system bitmaps as if they were memory bitmaps, but faster if available.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
How would you do this then?
</p></div></div><p>My mistake, I didn&#39;t notice the diff - <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
EDIT: patch attached.
</p></div></div><p>Excellent, thanks Evert. The obvious fixes are always the best.  Hopefully it&#39;ll make it to the next version.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Mon, 05 Feb 2007 02:27:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Excellent, thanks Evert.
</p></div></div><p>
Just so there&#39;s no confusion, this means you tested it and it corrects the problem for you, right? I know the code compiles and links fine, but I didn&#39;t have an opportunity to check that it actually works. It should, but it wouldn&#39;t be the first time I write code that &quot;should&quot; work but doesn&#39;t. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Hopefully it&#39;ll make it to the next version.
</p></div></div><p>
I&#39;ll commit it as soon as someone tests it and confirms it works as intended. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Mon, 05 Feb 2007 03:14:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Erm, no. For 4.2.1 I was lazy and just got the pre-built version. If no-one takes you up by the end of today to recompile (I can test it) a new dll, I&#39;ll do it tomorrow, if someone can tell me the diff tool to use (windows).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Mon, 05 Feb 2007 14:56:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
if someone can tell me the diff tool to use (windows)
</p></div></div><p>
WinMerge.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (tobing)</author>
		<pubDate>Mon, 05 Feb 2007 15:52:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Reglar patch should be fine as well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Mon, 05 Feb 2007 16:11:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I use winmerge and oddly just tried to find out how to read in diff files a few minutes ago, but all I could find was an option to create a diff from two files, not open one up.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 06 Feb 2007 05:16:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://gnuwin32.sourceforge.net/packages/patch.htm">http://gnuwin32.sourceforge.net/packages/patch.htm</a></p><p>To apply the patch, when in the allegro dir:</p><p>patch -p0 -i fontbmp.diff</p><p>You can always add --dry-run to see if everything is ok before you actually apply the patch.</p><p>Winmerge, TortoiseSVN and many others can create patches, or you can use the original:</p><p><a href="http://gnuwin32.sourceforge.net/packages/diffutils.htm">http://gnuwin32.sourceforge.net/packages/diffutils.htm</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (torhu)</author>
		<pubDate>Tue, 06 Feb 2007 06:40:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><b>bump</b>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Thu, 08 Feb 2007 12:19:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I haven&#39;t forgotten, I&#39;ve been ill most of the week.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Fri, 09 Feb 2007 02:32:17 +0000</pubDate>
	</item>
</rss>
