<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>draw_sprite and system bitmap subbitmap failure code and images</title>
		<link>http://www.allegro.cc/forums/view/558528</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 16 Jan 2006 04:26:21 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,<br />two faults:<br />1. draw_sprite failure to find correct place<br />2. system_bitmap with subbitmaps crashes when you destroy the subbitmaps</p><p>From testing I&#39;ve found that when you draw_sprite a subbitmap of a video or system bitmap onto a different system or video bitmap, it doubles the x/y and you end up with the wrong portion showing (this is following from my thread trying to explain things).Also, I&#39;ve found through testing that if you have a subbitmap of a system bitmap when you try to destroy the subbitmaps you get a crash. Video and memory bitmaps are ok.</p><p>Attached is a sample piece of code and some windows exe&#39;s to show how subbitmaps onto video or system bitmaps don&#39;t work, and how system bitmaps that have subbitmaps crash the system.</p><p>As you can see from the images, &#39;original.jpg&#39; is how it works fine with memory bitmaps, but when you use video/system bitmaps you get it wrong, as in &#39;doublingerror.jpg&#39;. sheet.bmp is the source bitmap.</p><p>If you look closely you can see what is happening is it is doubling the x and y position when you blit a video/memory subbitmap onto a system/video bitmap.</p><p>1. if you compile as is, it will work.<br />2. if you uncomment the line: //#define nonmemorybitmap you will get the error<br />3. if you change the line 41 to system bitmap you get the crash.</p><p>masked blit is fine. The problem, I believe, is the bit of code in the windows acceleration source file for draw_sprite that tries to determine the correct place.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Mon, 09 Jan 2006 21:05:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Should crash is really crashing:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure&gt;gdb shouldcrash.exe</td></tr><tr><td class="number">2</td><td>GNU gdb <span class="n">5</span>.<span class="n">2</span>.<span class="n">1</span></td></tr><tr><td class="number">3</td><td>Copyright <span class="n">2002</span> Free Software Foundation, Inc.</td></tr><tr><td class="number">4</td><td>GDB is <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> software, covered by the GNU General Public License, <span class="k1">and</span> you are</td></tr><tr><td class="number">5</td><td>welcome to change it <span class="k1">and</span><span class="k3">/</span><span class="k1">or</span> distribute copies of it under certain conditions.</td></tr><tr><td class="number">6</td><td>Type <span class="s">"show copying"</span> to see the conditions.</td></tr><tr><td class="number">7</td><td>There is absolutely no warranty <span class="k1">for</span> GDB.  Type <span class="s">"show warranty"</span> <span class="k1">for</span> details.</td></tr><tr><td class="number">8</td><td>This GDB was configured as <span class="s">"i686-pc-mingw32"</span>...<span class="k2">(</span>no debugging symbols found<span class="k2">)</span>...</td></tr><tr><td class="number">9</td><td><span class="k2">(</span>gdb<span class="k2">)</span> run</td></tr><tr><td class="number">10</td><td>Starting program: C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure<span class="k3">/</span>shouldcrash.exe</td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>Program received <a href="http://www.delorie.com/djgpp/doc/libc/libc_724.html" target="_blank">signal</a> SIGSEGV, Segmentation fault.</td></tr><tr><td class="number">14</td><td><span class="n">0x67a4bdea</span> in gfx_directx_destroy_surface <span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td><span class="k2">(</span>gdb<span class="k2">)</span> bt</td></tr><tr><td class="number">16</td><td><span class="p">#0  0x67a4bdea in gfx_directx_destroy_surface ()</span></td></tr><tr><td class="number">17</td><td><span class="p">#1  0x00000000 in ?? ()</span></td></tr></tbody></table></div></div><p>

Should fail isn&#39;t:
</p><div class="source-code snippet"><div class="inner"><pre>C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure&gt;gdb shouldfail.exe
GNU gdb <span class="n">5</span>.<span class="n">2</span>.<span class="n">1</span>
Copyright <span class="n">2002</span> Free Software Foundation, Inc.
GDB is <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> software, covered by the GNU General Public License, <span class="k1">and</span> you are
welcome to change it <span class="k1">and</span><span class="k3">/</span><span class="k1">or</span> distribute copies of it under certain conditions.
Type <span class="s">"show copying"</span> to see the conditions.
There is absolutely no warranty <span class="k1">for</span> GDB.  Type <span class="s">"show warranty"</span> <span class="k1">for</span> details.
This GDB was configured as <span class="s">"i686-pc-mingw32"</span>...<span class="k2">(</span>no debugging symbols found<span class="k2">)</span>...
<span class="k2">(</span>gdb<span class="k2">)</span> run
Starting program: C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure<span class="k3">/</span>shouldfail.exe

Program exited normally.
</pre></div></div><p>

Should work is working:
</p><div class="source-code snippet"><div class="inner"><pre>C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure&gt;gdb shouldwork.exe
GNU gdb <span class="n">5</span>.<span class="n">2</span>.<span class="n">1</span>
Copyright <span class="n">2002</span> Free Software Foundation, Inc.
GDB is <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a> software, covered by the GNU General Public License, <span class="k1">and</span> you are
welcome to change it <span class="k1">and</span><span class="k3">/</span><span class="k1">or</span> distribute copies of it under certain conditions.
Type <span class="s">"show copying"</span> to see the conditions.
There is absolutely no warranty <span class="k1">for</span> GDB.  Type <span class="s">"show warranty"</span> <span class="k1">for</span> details.
This GDB was configured as <span class="s">"i686-pc-mingw32"</span>...<span class="k2">(</span>no debugging symbols found<span class="k2">)</span>...
<span class="k2">(</span>gdb<span class="k2">)</span> run
Starting program: C:\Documents <span class="k1">and</span> Settings\Gull\Bureau\failure<span class="k3">/</span>shouldwork.exe

Program exited normally.
</pre></div></div><p>


ALSO:<br />I first try with dev-cpp, -Wall -g with no optimisation:<br />The code given works fine when compiled on my computer.<br />No matter if i comment or not the #define nonmemorybitmap</p><p>Conclusion: it should be a problem with your compiler,compiling flags,level of optimisation.<br />It&#39;s perhaps a MSVC issue. </p><p>I&#39;m sorry that i cannot help you more, it&#39;s working fine with me. attached are the 2 compiled from my pc.</p><p>I let you test and post to see if it is different.</p><p>LAST EDIT BEFORE LEAVING WORK:</p><p>I test with all optimisation, no optimisation, ... all i compile with dev-cpp &amp; gcc 3.4.2 &amp; allegro 4.0.2 is working fine. MSVC issue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Mon, 09 Jan 2006 22:07:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><pre>$ g++ main.cpp `allegro-config --libs --static`
main.cpp:9: error: `main&#39; must return `int&#39;
main.cpp: In function `int main(...)&#39;:
main.cpp:84: error: return-statement with no value, in function declared with a 
   non-void return type</pre><p>Fixed those.</p><p>I&#39;m on Linux, and everything worked fine.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Mon, 09 Jan 2006 22:19:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[edit]I&#39;ve now had two other people that I know compile my code (not msvc) as I said and the same bug happens.[/edit]</p><p>GullraDriel: Firstly, the crash shouldn&#39;t be happing so that is a bug, secondly I am compiling with DevC++ and MSVC and both versions show the odd images (when I say fail I mean show the wrong images). I&#39;ve had others test my devcpp exe and it fails again for them. I&#39;ve also tried your &#39;workingbutshouldcrash&#39; and while it doesn&#39;t crash (are you sure you enabled the system bitmap at line 41?) it does show the incorrect images - all image pairs should be the same. Did you not see this?</p><p>CGamesPlay, linux, the code I think is wrong is in the windows area so no surprises there.</p><p>Have you seen my jpegs? Is there any explanation?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 03:38:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve found the genuine and demonstrable Allegro bug! As Neil Walker observes (elsewhere), ddraw_draw_sprite looks like this:
</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="k1">static</span> <span class="k1">void</span> ddraw_draw_sprite<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, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span> sprite, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   <span class="k1">int</span> sx, sy, w, h<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_video_bitmap" target="_blank"><span class="a">is_video_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/is_system_bitmap" target="_blank"><span class="a">is_system_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>      sx <span class="k3">=</span> sprite-&gt;x_ofs<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>      sy <span class="k3">=</span> sprite-&gt;y_ofs<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      w <span class="k3">=</span> sprite-&gt;w<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>      h <span class="k3">=</span> sprite-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>      <span class="k1">if</span> <span class="k2">(</span>bmp-&gt;clip<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>   <span class="k1">if</span> <span class="k2">(</span>x <span class="k3">&lt;</span> bmp-&gt;cl<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>      sx <span class="k3">+</span><span class="k3">=</span> bmp-&gt;cl <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      w <span class="k3">-</span><span class="k3">=</span> bmp-&gt;cl <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      x <span class="k3">=</span> bmp-&gt;cl<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>   <span class="k1">if</span> <span class="k2">(</span>y <span class="k3">&lt;</span> bmp-&gt;ct<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>      sy <span class="k3">+</span><span class="k3">=</span> bmp-&gt;ct <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>      h <span class="k3">-</span><span class="k3">=</span> bmp-&gt;ct <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>      y <span class="k3">=</span> bmp-&gt;ct<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>   <span class="k1">if</span> <span class="k2">(</span>x <span class="k3">+</span> w <span class="k3">&gt;</span> bmp-&gt;cr<span class="k2">)</span></td></tr><tr><td class="number">25</td><td>      w <span class="k3">=</span> bmp-&gt;cr <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</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="k2">)</span></td></tr><tr><td class="number">28</td><td>      <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>   <span class="k1">if</span> <span class="k2">(</span>y <span class="k3">+</span> h <span class="k3">&gt;</span> bmp-&gt;cb<span class="k2">)</span></td></tr><tr><td class="number">31</td><td>      h <span class="k3">=</span> bmp-&gt;cb <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>   <span class="k1">if</span> <span class="k2">(</span>h <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">34</td><td>      <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>      ddraw_masked_blit<span class="k2">(</span>sprite, bmp, sx, sy, x, y, w, h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>   <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>      <span class="c">/* have to use the original software version */</span></td></tr><tr><td class="number">41</td><td>      _orig_draw_sprite<span class="k2">(</span>bmp, sprite, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">43</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

The problem relates to [x/y]_ofs, which seem to be used to hold the top left corner of the area of a bitmap that is actually in use. With ordinary bitmaps they are both set to 0. With sub bitmaps they are set somewhere else in order to only display a window within the source bitmap. The Allegro 2.x days of just fiddling with -&gt;line pointers are obviously long behind.</p><p>The problem is that both ddraw_draw_sprite and ddraw_masked_blit apply the sub bitmap constraints. I believe (but cannot test, as still in OS X) that the following should fix the problem:</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="k1">static</span> <span class="k1">void</span> ddraw_draw_sprite<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, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span> sprite, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   <span class="k1">int</span> sx, sy, w, h<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_video_bitmap" target="_blank"><span class="a">is_video_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/is_system_bitmap" target="_blank"><span class="a">is_system_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>      sx <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>      sy <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      w <span class="k3">=</span> sprite-&gt;w<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>      h <span class="k3">=</span> sprite-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>      <span class="k1">if</span> <span class="k2">(</span>bmp-&gt;clip<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>   <span class="k1">if</span> <span class="k2">(</span>x <span class="k3">&lt;</span> bmp-&gt;cl<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>      sx <span class="k3">+</span><span class="k3">=</span> bmp-&gt;cl <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      w <span class="k3">-</span><span class="k3">=</span> bmp-&gt;cl <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      x <span class="k3">=</span> bmp-&gt;cl<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>   <span class="k1">if</span> <span class="k2">(</span>y <span class="k3">&lt;</span> bmp-&gt;ct<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">19</td><td>      sy <span class="k3">+</span><span class="k3">=</span> bmp-&gt;ct <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>      h <span class="k3">-</span><span class="k3">=</span> bmp-&gt;ct <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>      y <span class="k3">=</span> bmp-&gt;ct<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>   <span class="k1">if</span> <span class="k2">(</span>x <span class="k3">+</span> w <span class="k3">&gt;</span> bmp-&gt;cr<span class="k2">)</span></td></tr><tr><td class="number">25</td><td>      w <span class="k3">=</span> bmp-&gt;cr <span class="k3">-</span> x<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</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="k2">)</span></td></tr><tr><td class="number">28</td><td>      <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>   <span class="k1">if</span> <span class="k2">(</span>y <span class="k3">+</span> h <span class="k3">&gt;</span> bmp-&gt;cb<span class="k2">)</span></td></tr><tr><td class="number">31</td><td>      h <span class="k3">=</span> bmp-&gt;cb <span class="k3">-</span> y<span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>   <span class="k1">if</span> <span class="k2">(</span>h <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span></td></tr><tr><td class="number">34</td><td>      <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>      ddraw_masked_blit<span class="k2">(</span>sprite, bmp, sx, sy, x, y, w, h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>   <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>      <span class="c">/* have to use the original software version */</span></td></tr><tr><td class="number">41</td><td>      _orig_draw_sprite<span class="k2">(</span>bmp, sprite, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">43</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
Note the only change, near the top:
</p><div class="source-code snippet"><div class="inner"><pre>      sx <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
      sy <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
</pre></div></div><p>
Which relate to lines 155 and 156 of src/win/wddaccel.c of the Allegro source.</p><p>Please could someone test this theory?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Tue, 10 Jan 2006 04:36:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Someone should find the link to Matthew&#39;s patch generator..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 10 Jan 2006 04:45:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Found it: <a href="http://www.allegro.cc/dev/make-diff.php">http://www.allegro.cc/dev/make-diff.php</a>. The diff, as shown below, is attached. Should this patch make the grade, please acknowledge both Neil Walker &amp; myself in the authors file as I only got to ddraw_draw_sprite following a message by him on the Retrospec mailing list.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
--- src/win/wddaccel.c	Thu Oct 27 19:57:01 2005 UTC<br />+++ src/win/wddaccel.c	Mon Jan 09 22:55:04 2006 UTC<br />@@ -152,8 +152,8 @@ static void ddraw_draw_sprite(BITMAP * b<br />    int sx, sy, w, h;<br /> <br />    if (is_video_bitmap(sprite) || is_system_bitmap(sprite)) {<br />-      sx = sprite-&gt;x_ofs;<br />-      sy = sprite-&gt;y_ofs;<br />+      sx = 0; /* sprite-&gt;x_ofs &amp; sprite-&gt;y_ofs will be accounted for in ddraw_masked_blit */<br />+      sy = 0;<br />       w = sprite-&gt;w;<br />       h = sprite-&gt;h;<br /> <br />@@ -508,4 +508,3 @@ void gfx_directx_enable_triple_buffering<br />       gfx_capabilities |= GFX_CAN_TRIPLE_BUFFER;<br />    }<br /> }<br />-
</p></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Tue, 10 Jan 2006 04:56:18 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well done Thomas. What you&#39;re saying is x and y offsets are being called both by draw_sprite and masked_blit, thus my &#39;doubling&#39; effect. This makes sense as only draw_sprite was not working.</p><p>So two more questions:</p><p>1. given draw_sprite eventually calls masked_blit for system/video bitmaps at the end of the function why do we need any of the clipping checks in draw_sprite? why not just call masked_blit with the know parameters?</p><p>2. there is still the demonstrative code of system bitmaps crashing when you delete any sub-bitmap of it, which is the second part of my tests.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 04:57:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It&#39;s only two lines :-)  As soon as someone confirms it works I&#39;ll commit it.  I&#39;m sure it&#39;s correct anyway.  Thanks to all involved.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 10 Jan 2006 04:59:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If no one else volunteers, I&#39;ll recompile and see what happens. I have a poorly baby lying beside me, so who knows when I&#39;ll get stopped <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>However, what about my comment regarding the need for all the code in draw_sprite?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 05:01:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
there is still the demonstrative code of system bitmaps crashing when you delete any sub-bitmap of it, which is the second part of my tests.
</p></div></div><p>
Sorry, yes, I&#39;ve found the cause of that but am otherwise lost as I haven&#39;t traced create_sub_bitmap yet.</p><p>destroy_bitmap is at line 1418 of src/graphics.c. It has a special branch for anything that passes is_video_bitmap, which includes sub bitmaps. Specifically, starting on line 1423 of that same file:
</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="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_video_bitmap" target="_blank"><span class="a">is_video_bitmap</span></a><span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>   <span class="c">/* special case for getting rid of video memory bitmaps */</span></td></tr><tr><td class="number">3</td><td>   <a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span><span class="k3">!</span>_dispsw_status<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   prev <span class="k3">=</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>   pos <span class="k3">=</span> vram_bitmap_list<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>   <span class="k1">while</span> <span class="k2">(</span>pos<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>      <span class="k1">if</span> <span class="k2">(</span>pos-&gt;bmp <span class="k3">=</span><span class="k3">=</span> bitmap<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>         <span class="k1">if</span> <span class="k2">(</span>prev<span class="k2">)</span></td></tr><tr><td class="number">11</td><td>      prev-&gt;next_y <span class="k3">=</span> pos-&gt;next_y<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>         <span class="k1">else</span></td></tr><tr><td class="number">13</td><td>      vram_bitmap_list <span class="k3">=</span> pos-&gt;next_y<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td>         <span class="k1">if</span> <span class="k2">(</span>pos-&gt;x <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>      <span class="c">/* the driver is in charge of this object */</span></td></tr><tr><td class="number">17</td><td>      gfx_driver-&gt;destroy_video_bitmap<span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_350.html" target="_blank">free</a><span class="k2">(</span>pos<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>         <span class="k2">}</span></td></tr></tbody></table></div></div><p>

On DirectX, gfx_driver-&gt;destroy_video_bitmap directly deletes the bitmap no questions asked. So the memory for the parent bitmap is destroyed and both it and all sub bitmaps of it become invalid. Obviously an is_sub_bitmap needs to be checked somewhere, but I have no idea whether that is meant to be the responsibility of the platform neutral code or the driver specific.
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
However, what about my comment regarding the need for all the code in draw_sprite?
</p></div></div><p>
I have to admit that I couldn&#39;t see a purpose for it. Perhaps the change to making that function sit on top of masked_blit was a late addition to the code?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Tue, 10 Jan 2006 05:03:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks thomas. Video bitmaps are fine, it is <b>only</b> &#39;system&#39; bitmaps that cause the crash when you destroy a sub-bitmap. Video and memory work fine.</p><p>This code is at line 1466.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 05:09:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmmm. Then I&#39;ve misunderstood the code a little. But line 1471 of src/graphics.c jumps to line 656 of src/win/wddbmp.c, then on to line 299 which is an IDirectDrawSurface2_Release, freeing the memory of the parent bitmap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Tue, 10 Jan 2006 05:14:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thomas, I came to the same conclusion regarding destroy_bitmap().  I think that if a subbitmap is created by platform-specific code, then they should be destroyed by the platform-specific code.  If created by the fallback case (platform neutral) then they should be destroyed by the platform neutral code.  This possibly requires a new BMP_ID_* flag to remember how the subbitmap was created.</p><p>edit: I think the pos&lt;0 prevents the problem with video bitmaps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 10 Jan 2006 05:18:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The code change works, three cheers for Thomas <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>Attached is an executable that used to fail, and now it works. I&#39;ve included the source code, the bitmap, the .lib and the new dll if anyone wants to try or use a new .lib/dll file.</p><p>To see it failing simply rename the .DLL so that the exe will use the original dll and watch it show the wrong graphics!</p><p>btw, before the code is checked in, does someone want to see if all the clipping code is necessary? if you call masked_blit directly it doesn&#39;t do any of that.</p><p>This example code can also be used to see that when you use a SYSTEM bitmap (follow the comments) it crashes when you have subbitmaps and try to delete a sub-bitmap.</p><p>ps, to celebrate I&#39;ve upped my AXL_FRAMS project from 70% to 90% <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 05:50:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Thomas, I came to the same conclusion regarding destroy_bitmap(). I think that if a subbitmap is created by platform-specific code, then they should be destroyed by the platform-specific code. If created by the fallback case (platform neutral) then they should be destroyed by the platform neutral code. This possibly requires a new BMP_ID_* flag to remember how the subbitmap was created.
</p></div></div><p>
Is it not enough to know the type of bitmap and if the vtable includes functions for creating and destroying them? It seems to me that if it does, they are used and if it does not, the platform-neutral code is used. Am I missing something?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The code change works, three cheers for Thomas <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div></div><p>
Hip hip hurray!<br />This must be a problem that has been in Allegro since... well, forever.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
btw, before the code is checked in, does someone want to see if all the clipping code is necessary?
</p></div></div><p>
Doesn&#39;t really matter, since it can be done in succesive commits anyway. In fact, I think fixing the bug and removing redundant code should be done in seperate commits anyway, since you may want to roll back one but not the other if it turns out that the code was not as redundant as you thought it would be. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 10 Jan 2006 14:49:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Is it not enough to know the type of bitmap and if the vtable includes functions for creating and destroying them? It seems to me that if it does, they are used and if it does not, the platform-neutral code is used. Am I missing something?
</p></div></div><p>

Hmm, yes, but a bit ugly.  What do you think of this patch? (untested)<br />All this is a bit theoretical (not the bug Neil pointed out), since no gfx or system drivers have non-null create_sub_bitmap methods anyway.</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> src<span class="k3">/</span>graphics.c      <span class="k2">(</span>revision <span class="n">5698</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> src<span class="k3">/</span>graphics.c      <span class="k2">(</span>local<span class="k2">)</span></td></tr><tr><td class="number">3</td><td>@@ <span class="k3">-</span><span class="n">1430</span>,<span class="n">6</span> <span class="k3">+</span><span class="n">1430</span>,<span class="n">38</span> @@ <span class="k1">void</span> <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_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>    VRAM_BITMAP <span class="k3">*</span>prev, <span class="k3">*</span>pos<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>    <span class="k1">if</span> <span class="k2">(</span>bitmap<span class="k2">)</span> <span class="k2">{</span></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/is_sub_bitmap" target="_blank"><span class="a">is_sub_bitmap</span></a><span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">8</td><td><span class="k3">+</span>        <span class="c">/* the order of these checks must follow that of create_sub_bitmap */</span></td></tr><tr><td class="number">9</td><td><span class="k3">+</span>        <span class="k1">if</span> <span class="k2">(</span>bitmap-&gt;vtable-&gt;create_sub_bitmap<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td><span class="k3">+</span>           <a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>FALSE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k3">+</span>           <span class="c">/* XXX: what do we do here?  GFX_VTABLE has no</span></td></tr><tr><td class="number">12</td><td><span class="c">+              destroy_bitmap method.  I think we should just ``remove'' the</span></td></tr><tr><td class="number">13</td><td><span class="c">+              GFX_VTABLE create_sub_bitmap method.  Nobody uses it at the moment,</span></td></tr><tr><td class="number">14</td><td><span class="c">+              as far as I can tell.</span></td></tr><tr><td class="number">15</td><td><span class="c">+</span></td></tr><tr><td class="number">16</td><td><span class="c">+           ASSERT(bitmap-&gt;vtable-&gt;destroy_bitmap);</span></td></tr><tr><td class="number">17</td><td><span class="c">+           bitmap-&gt;vtable-&gt;destroy_bitmap(bitmap);</span></td></tr><tr><td class="number">18</td><td><span class="c">+            */</span></td></tr><tr><td class="number">19</td><td><span class="k3">+</span>           <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td><span class="k3">+</span>        <span class="k2">}</span></td></tr><tr><td class="number">21</td><td><span class="k3">+</span>        <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>system_driver-&gt;create_sub_bitmap<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">22</td><td><span class="k3">+</span>           <a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>system_driver-&gt;destroy_bitmap<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="k3">+</span>           system_driver-&gt;destroy_bitmap<span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td><span class="k3">+</span>           <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k3">+</span>        <span class="k2">}</span></td></tr><tr><td class="number">26</td><td><span class="k3">+</span>        <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">27</td><td><span class="k3">+</span>           <span class="c">/* system_driver-&gt;create_bitmap is not used to create sub-bitmaps</span></td></tr><tr><td class="number">28</td><td><span class="c">+            * (see create_sub_bitmap), so if system_driver-&gt;create_sub_bitmap</span></td></tr><tr><td class="number">29</td><td><span class="c">+            * is NULL then this sub-bitmap must have been created by graphics.c,</span></td></tr><tr><td class="number">30</td><td><span class="c">+            * so we should NOT try using system_driver-&gt;destroy_bitmap first.</span></td></tr><tr><td class="number">31</td><td><span class="c">+            */</span></td></tr><tr><td class="number">32</td><td><span class="k3">+</span>           <a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>bitmap-&gt;dat <span class="k3">=</span><span class="k3">=</span> NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td><span class="k3">+</span>           _AL_FREE<span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td><span class="k3">+</span>        <span class="k2">}</span></td></tr><tr><td class="number">35</td><td><span class="k3">+</span>        <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td><span class="k3">+</span>      <span class="k2">}</span></td></tr><tr><td class="number">37</td><td><span class="k3">+</span></td></tr><tr><td class="number">38</td><td><span class="k3">+</span>      <span class="c">/* non-subbitmaps */</span></td></tr><tr><td class="number">39</td><td>       <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_video_bitmap" target="_blank"><span class="a">is_video_bitmap</span></a><span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>         <span class="c">/* special case for getting rid of video memory bitmaps */</span></td></tr><tr><td class="number">41</td><td>         <a href="http://www.allegro.cc/manual/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span><span class="k3">!</span>_dispsw_status<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>@@ <span class="k3">-</span><span class="n">1483</span>,<span class="n">7</span> <span class="k3">+</span><span class="n">1515</span>,<span class="n">7</span> @@ <span class="k1">void</span> <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_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">43</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">44</td><td>       <span class="k2">}</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td><span class="k3">-</span>      <span class="c">/* normal memory or sub-bitmap destruction */</span></td></tr><tr><td class="number">47</td><td><span class="k3">+</span>      <span class="c">/* normal memory bitmap destruction */</span></td></tr><tr><td class="number">48</td><td>       <span class="k1">if</span> <span class="k2">(</span>system_driver-&gt;destroy_bitmap<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">49</td><td>         <span class="k1">if</span> <span class="k2">(</span>system_driver-&gt;destroy_bitmap<span class="k2">(</span>bitmap<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">50</td><td>            <span class="k1">return</span><span class="k2">;</span></td></tr></tbody></table></div></div><p>


</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Should this patch make the grade, please acknowledge both Neil Walker &amp; myself in the authors file
</p></div></div><p>

Patch committed, cheers.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Tue, 10 Jan 2006 16:14:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, when draw_sprite decides it is system/video it calls masked_blit. The same masked_blit you can call directly. masked_blit does not do any clipping tests. Therefore either draw_sprite is doing extra work it shouldn&#39;t or masked_blit is not doing the checks it should.</p><p>As for the sub-bitmap fault in windows, here is some minimal code that recreates the crash on any windows system:</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>&#160;</td></tr><tr><td class="number">3</td><td><span class="k1">int</span> main<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">4</td><td><span class="k2">{</span></td></tr><tr><td class="number">5</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> page1<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> sub1<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>  </td></tr><tr><td class="number">8</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">9</td><td>  <a href="http://www.allegro.cc/manual/install_keyboard" target="_blank"><span class="a">install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</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">11</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">12</td><td>  </td></tr><tr><td class="number">13</td><td>  page1<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_system_bitmap" target="_blank"><span class="a">create_system_bitmap</span></a><span class="k2">(</span><span class="n">640</span>,<span class="n">480</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/is_system_bitmap" target="_blank"><span class="a">is_system_bitmap</span></a><span class="k2">(</span>page1<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">15</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>    <a href="http://www.allegro.cc/manual/textout_ex" target="_blank"><span class="a">textout_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"no system bitmap"</span>,<span class="n">0</span>,<span class="n">0</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="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">20</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>    sub1<span class="k3">=</span><a href="http://www.allegro.cc/manual/create_sub_bitmap" target="_blank"><span class="a">create_sub_bitmap</span></a><span class="k2">(</span>page1,<span class="n">100</span>,<span class="n">100</span>,<span class="n">100</span>,<span class="n">100</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>    <a href="http://www.allegro.cc/manual/textout_ex" target="_blank"><span class="a">textout_ex</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>,<a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>,<span class="s">"press any key for a crash"</span>,<span class="n">0</span>,<span class="n">0</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="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <a href="http://www.allegro.cc/manual/readkey" target="_blank"><span class="a">readkey</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>sub1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">26</td><td>  <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>page1<span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">27</td><td>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td><span class="k2">}</span></td></tr><tr><td class="number">29</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>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 16:31:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Well, when draw_sprite decides it is system/video it calls masked_blit. The same masked_blit you can call directly. masked_blit does not do any clipping tests. Therefore either draw_sprite is doing extra work it shouldn&#39;t or masked_blit is not doing the checks it should.
</p></div></div><p>
For a moment I was thinking you were talking about draw_sprite() and masked_blit() in general, but it&#39;s the Windows-specific hardware accelerated implementation, right?<br />In general, you cannot always use masked_blit() where you can use draw_sprite().</p><p>Regarding the tests, they do look a bit redundant (or missing in the case of ddraw_masked_blit). What happens if you remove them altogether? Is clipping still performed as it should? What about maksed_blit? Does that do proper clipping?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 10 Jan 2006 16:45:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was referring to the ddraw code, and as far as I can see masked_blit it does no clipping checks. Similarly as far as &quot;In general, you cannot always use masked_blit() where you can use draw_sprite().&quot; goes, as far as I can see for video/system bitmaps (don&#39;t know about the software _original function) draw_sprite is now just a wrapper for masked_blit.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Tue, 10 Jan 2006 17:16:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Is clipping still performed as it should? What about maksed_blit? Does that do proper clipping?
</p></div></div><p>
Although DirectDraw supersets the Allegro clipping functionality and the DirectDraw driver creates a clipper it appears that there is no DirectDraw version of set_clip[_rect]. So it seems to me that ddraw_masked_blit should clip &quot;incorrectly&quot; based on a reading of the current manual but if it were &quot;correct&quot; then there would be no need for the clipping in ddraw_draw_sprite.</p><p>Can anyone verify that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Tue, 10 Jan 2006 17:24:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
and as far as I can see masked_blit it does no clipping checks.
</p></div></div><p>
Yes, as far as I can see, I agree. However, I&#39;d like to know what the code does in practice and if ddraw_masked_blit() actually works properly now (since it doesn&#39;t seem to do the clipping) and if the tests in ddraw_draw_sprite() are redundant or not. That will have to be tested by someone. Could you test these things?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Similarly as far as &quot;In general, you cannot always use masked_blit() where you can use draw_sprite().&quot; goes, as far as I can see for video/system bitmaps (don&#39;t know about the software _original function) draw_sprite is now just a wrapper for masked_blit.
</p></div></div><p>
In general it certainly isn&#39;t. draw_sprite() can be used to draw 8bpp sprites onto any colourdepth target bitmap, while masked_blit() only works between equal depth bitmaps. Since video bitmaps all have the same depth as the screen anyway, there is no 8-&gt;any special case there and the two should be similar (as they indeed are now in the DX driver). I don&#39;t actually know about system bitmaps (they don&#39;t really exist in *nix), but I think they&#39;re similar to video bitmaps where their colourdepth is concerned.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So it seems to me that ddraw_masked_blit should clip &quot;incorrectly&quot;
</p></div></div><p>
Yes, that was the impression I got.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Tue, 10 Jan 2006 18:20:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What do you want testing exactly, just use masked_blit to draw a bitmap onto another but make the co-ordinates outside the target bitmap?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 11 Jan 2006 00:40:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What do you want testing exactly?
</p></div></div><p>
Use set_clip_rect to reduce the clipping rectangle to only a small portion of the target bitmap, then see whether draw_sprite and/or masked_blit with video/system bitmaps obeys that reduced rectangle. I may get a go on a Windows PC later, so I may have a go myself...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 11 Jan 2006 01:10:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t worry, I&#39;ll test it later as I can easily check all permutations of video/system/memory bitmaps and sub-bitmaps in all resolutions, colour depths and windowed modes with the power of AXL <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 11 Jan 2006 01:22:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
with the power of AXL
</p></div></div><p>
Don&#39;t forget the firepower of Billy!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 11 Jan 2006 02:13:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Double power eh?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Wed, 11 Jan 2006 02:19:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I created a fullscreen bitmap (video/memory/system) and did 		set_clip_rect(page1,50,50,250,300);</p><p>I then did some blit, draw_sprite and masked_blit of both subbitmaps and normal bitmaps over the screen. The only thing to show was the stuff in the clipping rectangle.</p><p>All was well. Hope that helps.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 11 Jan 2006 04:51:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And if you remove teh clipping code from ddraw_draw_sprite()?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Wed, 11 Jan 2006 04:53:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>ok, I added a clipping region to my back buffer (as above) and then modified wdaccel.c to be:</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="k1">static</span> <span class="k1">void</span> ddraw_draw_sprite<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, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span> sprite, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   <span class="k1">int</span> sx, sy, w, h<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/is_video_bitmap" target="_blank"><span class="a">is_video_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/is_system_bitmap" target="_blank"><span class="a">is_system_bitmap</span></a><span class="k2">(</span>sprite<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">6</td><td>      sx <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>      sy <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>      w <span class="k3">=</span> sprite-&gt;w<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>      h <span class="k3">=</span> sprite-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="c">/*</span></td></tr><tr><td class="number">11</td><td><span class="c">      if (bmp-&gt;clip) {</span></td></tr><tr><td class="number">12</td><td><span class="c">   if (x &lt; bmp-&gt;cl) {</span></td></tr><tr><td class="number">13</td><td><span class="c">      sx += bmp-&gt;cl - x;</span></td></tr><tr><td class="number">14</td><td><span class="c">      w -= bmp-&gt;cl - x;</span></td></tr><tr><td class="number">15</td><td><span class="c">      x = bmp-&gt;cl;</span></td></tr><tr><td class="number">16</td><td><span class="c">   }</span></td></tr><tr><td class="number">17</td><td><span class="c"></span></td></tr><tr><td class="number">18</td><td><span class="c">   if (y &lt; bmp-&gt;ct) {</span></td></tr><tr><td class="number">19</td><td><span class="c">      sy += bmp-&gt;ct - y;</span></td></tr><tr><td class="number">20</td><td><span class="c">      h -= bmp-&gt;ct - y;</span></td></tr><tr><td class="number">21</td><td><span class="c">      y = bmp-&gt;ct;</span></td></tr><tr><td class="number">22</td><td><span class="c">   }</span></td></tr><tr><td class="number">23</td><td><span class="c"></span></td></tr><tr><td class="number">24</td><td><span class="c">   if (x + w &gt; bmp-&gt;cr)</span></td></tr><tr><td class="number">25</td><td><span class="c">      w = bmp-&gt;cr - x;</span></td></tr><tr><td class="number">26</td><td><span class="c"></span></td></tr><tr><td class="number">27</td><td><span class="c">   if (w &lt;= 0)</span></td></tr><tr><td class="number">28</td><td><span class="c">      return;</span></td></tr><tr><td class="number">29</td><td><span class="c"></span></td></tr><tr><td class="number">30</td><td><span class="c">   if (y + h &gt; bmp-&gt;cb)</span></td></tr><tr><td class="number">31</td><td><span class="c">      h = bmp-&gt;cb - y;</span></td></tr><tr><td class="number">32</td><td><span class="c"></span></td></tr><tr><td class="number">33</td><td><span class="c">   if (h &lt;= 0)</span></td></tr><tr><td class="number">34</td><td><span class="c">      return;</span></td></tr><tr><td class="number">35</td><td><span class="c">      }</span></td></tr><tr><td class="number">36</td><td><span class="c">*/</span></td></tr><tr><td class="number">37</td><td>      ddraw_masked_blit<span class="k2">(</span>sprite, bmp, sx, sy, x, y, w, h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>   <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>      <span class="c">/* have to use the original software version */</span></td></tr><tr><td class="number">41</td><td>      _orig_draw_sprite<span class="k2">(</span>bmp, sprite, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">43</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
And something quite strange happened. If sprite was a video/system bitmap, i.e. it follows the ddraw_masked_blit route (but no clipping code is now there) and the destination (bmp) was a memory bitmap, it honoured the clip that we set in our code for bmp. All well with the removal of the code then...</p><p>However, if bmp is a system or video bitmap (i.e. we are drawing a system or video bitmap onto a video or system bitmap), then the clipping region is ignored for draw_sprite (masked_blit is still ok).</p><p>So it appears to me that removing the clipping code should be fine, but something odd is going on in the video bitmap code, not related to draw_sprite?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Wed, 11 Jan 2006 06:46:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
What do you think of this patch? (untested)
</p></div></div><p>
Looks ok to me. Did anyone test it?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
So it appears to me that removing the clipping code should be fine, but something odd is going on in the video bitmap code, not related to draw_sprite?
</p></div></div><p>
And if you leave the clipping code in?<br />It stands to reason that it&#39;s there because someone figured it was nescesary, so maybe this is why.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Sat, 14 Jan 2006 18:23:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Possibly it is there for that reason, but when I had a quick look at the masked_blit function it didn&#39;t do any clipping checks. But I guess thinking about it I might have been looking at the wrong function as there are a few different blitting functions for each one (e.g. original, ddraw_, etc).</p><p>I&#39;ll check again tomorrow, unless someone else does it for me beforehand.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Mon, 16 Jan 2006 04:26:21 +0000</pubDate>
	</item>
</rss>
