<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>FBlend missing pixels</title>
		<link>http://www.allegro.cc/forums/view/591046</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 19 Apr 2007 05:03:36 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m using FBlend 0.5 b1 from sourceforge.  When I use fblend_trans, the rightmost few pixels of the source bitmap aren&#39;t drawn.  This happens when I&#39;m in a color depth of 32, and the source bitmap width is not a multiple of 4.  If I change the color depth to 16, or the source bitmap width to a multiple of 4, it works as expected.  The other blend functions don&#39;t seem to have this problem.  The function fblend_rect_trans_32 works as well with any source bitmap.  I&#39;ve traced the problem to the call to fblend_trans_sse_32, but I don&#39;t know assembly so I don&#39;t know where the problem is inside the function.</p><p>Here is a screenshot of the issue and piece of code to duplicate the problem.  The first row is drawn by FBlend, the second by the standard allegro functions.  The first box is 20 pixels wide, and the second is 19.<br /><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/2/3/238952022ac08c2067bc49f2ae7fc71c.png" alt="591948" width="133" height="123" />
</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="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#include &lt;fblend.h&gt;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td><span class="k2">{</span></td></tr><tr><td class="number">6</td><td>  <a href="http://www.allegro.cc/manual/allegro_init" target="_blank"><span class="a">allegro_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  <a href="http://www.allegro.cc/manual/set_color_depth" target="_blank"><span class="a">set_color_depth</span></a><span class="k2">(</span><span class="n">32</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  <a href="http://www.allegro.cc/manual/set_gfx_mode" target="_blank"><span class="a">set_gfx_mode</span></a><span class="k2">(</span>GFX_AUTODETECT_WINDOWED,<span class="n">640</span>,<span class="n">480</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>buffer<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>b1<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><span class="n">20</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>b2<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a><span class="k2">(</span><span class="n">19</span>,<span class="n">19</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>  <a href="http://www.allegro.cc/manual/clear_bitmap" target="_blank"><span class="a">clear_bitmap</span></a><span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>b1,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <a href="http://www.allegro.cc/manual/clear_to_color" target="_blank"><span class="a">clear_to_color</span></a><span class="k2">(</span>b2,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">0</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  <a href="http://www.allegro.cc/manual/rect" target="_blank"><span class="a">rect</span></a><span class="k2">(</span>b1,<span class="n">0</span>,<span class="n">0</span>,<span class="n">19</span>,<span class="n">19</span>,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  <a href="http://www.allegro.cc/manual/rect" target="_blank"><span class="a">rect</span></a><span class="k2">(</span>b2,<span class="n">0</span>,<span class="n">0</span>,<span class="n">18</span>,<span class="n">18</span>,<a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span><span class="n">255</span>,<span class="n">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  fblend_trans<span class="k2">(</span>b1,buffer,<span class="n">20</span>,<span class="n">20</span>,<span class="n">200</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  fblend_trans<span class="k2">(</span>b2,buffer,<span class="n">80</span>,<span class="n">20</span>,<span class="n">200</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>  <a href="http://www.allegro.cc/manual/set_trans_blender" target="_blank"><span class="a">set_trans_blender</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">200</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <a href="http://www.allegro.cc/manual/draw_trans_sprite" target="_blank"><span class="a">draw_trans_sprite</span></a><span class="k2">(</span>buffer,b1,<span class="n">20</span>,<span class="n">80</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  <a href="http://www.allegro.cc/manual/draw_trans_sprite" target="_blank"><span class="a">draw_trans_sprite</span></a><span class="k2">(</span>buffer,b2,<span class="n">80</span>,<span class="n">80</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>  <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer,<a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span>,<a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>,<a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>  <a href="http://www.allegro.cc/manual/allegro_message" target="_blank"><span class="a">allegro_message</span></a><span class="k2">(</span><span class="s">"done"</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>&#160;</td></tr><tr><td class="number">32</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td><span class="k2">}</span></td></tr><tr><td class="number">34</td><td><a href="http://www.allegro.cc/manual/END_OF_MAIN" target="_blank"><span class="a">END_OF_MAIN</span></a><span class="k2">(</span><span class="k2">)</span></td></tr></tbody></table></div></div><p>


I know FBlend is not currently maintained, but it would be nice to know if anyone else has run into this problem, and if you know what needs to be changed in the code to make it work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BlackEye)</author>
		<pubDate>Tue, 17 Apr 2007 05:32:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Copy/paste bug. Try this patch on trans32.s:</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> trans32.s   <span class="n">2002</span><span class="k3">-</span><span class="n">02</span><span class="k3">-</span><span class="n">26</span> <span class="n">17</span><span class="k2">:</span><span class="n">21</span><span class="k2">:</span><span class="n">02</span>.<span class="n">000000000</span> <span class="k3">-</span><span class="n">0600</span></td></tr><tr><td class="number">2</td><td><span class="k3">+</span><span class="k3">+</span><span class="k3">+</span> Copy of trans32.s   <span class="n">2007</span><span class="k3">-</span><span class="n">04</span><span class="k3">-</span><span class="n">16</span> <span class="n">22</span><span class="k2">:</span><span class="n">06</span><span class="k2">:</span><span class="n">03</span>.<span class="n">250000000</span> <span class="k3">-</span><span class="n">0500</span></td></tr><tr><td class="number">3</td><td>@@ <span class="k3">-</span><span class="n">246</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">246</span>,<span class="n">7</span> @@</td></tr><tr><td class="number">4</td><td>                por  %mm4, %mm0<span class="k2">;</span>             <span class="c">/* Recombine components */</span></td></tr><tr><td class="number">5</td><td>                paddb %mm2, %mm0<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k3">-</span>               movq %mm0, %es:-8<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>    <span class="c">/* Write results back */</span></td></tr><tr><td class="number">8</td><td><span class="k3">+</span>               movq %mm0, %es:<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>      <span class="c">/* Write results back */</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>        _align_<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>        trans_sse_32_end:</td></tr><tr><td class="number">12</td><td>@@ <span class="k3">-</span><span class="n">404</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">404</span>,<span class="n">7</span> @@</td></tr><tr><td class="number">13</td><td>                movq %mm1, %mm4<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>                paddb %mm2, %mm5<span class="k2">;</span>           <span class="c">/* %mm5 = first 2 pixels blended */</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k3">-</span>               movq %mm5, %es:-4<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>   <span class="c">/* Write results back */</span></td></tr><tr><td class="number">17</td><td><span class="k3">+</span>               movq %mm5, %es:<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>      <span class="c">/* Write results back */</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>        _align_<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>        trans_sse_32_half_end:</td></tr><tr><td class="number">21</td><td>@@ <span class="k3">-</span><span class="n">640</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">640</span>,<span class="n">7</span> @@</td></tr><tr><td class="number">22</td><td>                por  %mm4, %mm0<span class="k2">;</span>             <span class="c">/* Recombine components */</span></td></tr><tr><td class="number">23</td><td>                paddb %mm2, %mm0<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>&#160;</td></tr><tr><td class="number">25</td><td><span class="k3">-</span>               movq %mm0, %es:-8<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>    <span class="c">/* Write results back */</span></td></tr><tr><td class="number">26</td><td><span class="k3">+</span>               movq %mm0, %es:<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>      <span class="c">/* Write results back */</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td>        _align_<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>        trans_mmx_32_end:</td></tr><tr><td class="number">30</td><td>@@ <span class="k3">-</span><span class="n">795</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">795</span>,<span class="n">7</span> @@</td></tr><tr><td class="number">31</td><td>                movq %mm1, %mm4<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>                paddb %mm2, %mm5<span class="k2">;</span>           <span class="c">/* %mm5 = first 2 pixels blended */</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td><span class="k3">-</span>               movq %mm5, %es:-4<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>   <span class="c">/* Write results back */</span></td></tr><tr><td class="number">35</td><td><span class="k3">+</span>               movq %mm5, %es:<span class="k2">(</span>%edi<span class="k2">)</span><span class="k2">;</span>     <span class="c">/* Write results back */</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>        _align_<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>        trans_mmx_32_half_end:</td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Tue, 17 Apr 2007 08:04:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I got the patch applied.  I cleaned all the intermediate files and rebuilt FBlend and the sample app, but it still has the same issue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BlackEye)</author>
		<pubDate>Wed, 18 Apr 2007 03:20:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just download Fblend <a href="http://www.retrospec.sgn.net/allegro.php">HERE</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul whoknows)</author>
		<pubDate>Wed, 18 Apr 2007 03:28:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I didn&#39;t see a source download for the version on that site.  Anyway, I tried the precompiled one and the same issue is there.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BlackEye)</author>
		<pubDate>Wed, 18 Apr 2007 03:38:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well I can&#39;t explain it. The rest of the code is pretty much the same for 16-bit vs 32-bit.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Wed, 18 Apr 2007 03:48:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I tried your code and I had the same problem!<br />Well, at least is good to know that this only happens under the conditions you listed above, however it would be nice if some assembler-guy can fix it.<br />I am using Fblend a lot, and I did not notice this before!:-[
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul whoknows)</author>
		<pubDate>Wed, 18 Apr 2007 04:23:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well I&#39;m glad someone confirmed the problem.  I thought I was going crazy.  I found that if the source width is a multiple of 4 + 1, it works as well.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BlackEye)</author>
		<pubDate>Wed, 18 Apr 2007 04:37:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Probably the reason nobody noticed this before is because it is generally faster and easier to keep all source bitmaps multiples of 4 wide, wherever possible.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matt Smith)</author>
		<pubDate>Thu, 19 Apr 2007 05:03:36 +0000</pubDate>
	</item>
</rss>
