<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>dirty rectangles</title>
		<link>http://www.allegro.cc/forums/view/585764</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Mon, 05 Jun 2006 15:47:41 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m using dirty rectangles from the Allegro Demo Game in my next project which is a Pong game. I&#39;ve changed it a bit because I&#39;ll use a background bitmap. Here you have the function I&#39;m using to clean the background:</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">void</span> mjCleanDirtyRectangle <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">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> c<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  DIRTY_LIST swap<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>Active <span class="k3">=</span> mjActiveVideoPage <span class="k2">(</span><span class="k2">)</span><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="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>Active<span class="k2">)</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/acquire_bitmap" target="_blank"><span class="a">acquire_bitmap</span></a> <span class="k2">(</span>Active<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="c">/* clear everything drawn during the previous update */</span></td></tr><tr><td class="number">9</td><td>  <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> dirty.count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><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><span class="k2">(</span>dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.w <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.h <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</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/putpixel" target="_blank"><span class="a">putpixel</span></a> <span class="k2">(</span>Active, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y, </td></tr><tr><td class="number">12</td><td>    <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a> <span class="k2">(</span>bmp, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y<span class="k2">)</span><span class="k2">)</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>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a> <span class="k2">(</span>bmp, Active,</td></tr><tr><td class="number">16</td><td>      dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">17</td><td>      dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">18</td><td>      dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x <span class="k3">+</span> dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.w <span class="k3">-</span> <span class="n">1</span>,</td></tr><tr><td class="number">19</td><td>      dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y <span class="k3">+</span> dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.h <span class="k3">-</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">21</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">22</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>Active<span class="k2">)</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/release_bitmap" target="_blank"><span class="a">release_bitmap</span></a> <span class="k2">(</span>Active<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td><span class="c">/* swap lists, so the just cleared rects automatically are in this update */</span></td></tr><tr><td class="number">24</td><td>  swap <span class="k3">=</span> old_dirty<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  old_dirty <span class="k3">=</span> dirty<span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  dirty <span class="k3">=</span> swap<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  dirty.count <span class="k3">=</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></tbody></table></div></div><p>

And next is the screen update function:</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">void</span> mjUpdateDirtyRectangle <span class="k2">(</span><span class="k1">void</span><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> c<span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>Visual <span class="k3">=</span> mjVisualVideoPage <span class="k2">(</span><span class="k2">)</span>, <span class="k3">*</span>Active <span class="k3">=</span> mjActiveVideoPage <span class="k2">(</span><span class="k2">)</span><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="c">/* for dirty rectangle animation, only copy the areas that changed */</span></td></tr><tr><td class="number">7</td><td>  <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> dirty.count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td>    add_to_list <span class="k2">(</span><span class="k3">&amp;</span>old_dirty, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">9</td><td>     dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.w, dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="c">/* sorting the objects really cuts down on bank switching */</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>gfx_driver-&gt;linear<span class="k2">)</span></td></tr><tr><td class="number">12</td><td>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_635.html" target="_blank">qsort</a> <span class="k2">(</span>old_dirty.rect, old_dirty.count, <span class="k1">sizeof</span><span class="k2">(</span>DIRTY_RECT<span class="k2">)</span>,</td></tr><tr><td class="number">13</td><td>     rect_cmp<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <a href="http://www.allegro.cc/manual/acquire_bitmap" target="_blank"><span class="a">acquire_bitmap</span></a> <span class="k2">(</span>Visual<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <span class="k1">for</span> <span class="k2">(</span>c <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> c <span class="k3">&lt;</span> old_dirty.count<span class="k2">;</span> c<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">16</td><td>    <span class="k1">if</span> <span class="k2">(</span><span class="k2">(</span>old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.w <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.h <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</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/putpixel" target="_blank"><span class="a">putpixel</span></a> <span class="k2">(</span>Visual, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">18</td><td>    <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a> <span class="k2">(</span>Active, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a> <span class="k2">(</span>Active, Visual, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">22</td><td>      old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.x, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.y,</td></tr><tr><td class="number">23</td><td>      old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.w, old_dirty.rect<span class="k2">[</span>c<span class="k2">]</span>.h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>    <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/release_bitmap" target="_blank"><span class="a">release_bitmap</span></a> <span class="k2">(</span>Visual<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

The problem I have is that the ball does dirty the screen when it bounces. If I change the blit by a rectfill in &quot;mjCleanDirtyRectangle&quot; then the ball doesn&#39;t dirty the screen when it bounces. Is something wrong in my code?</p><p>I&#39;m using GNU/Linux (Debian) and I&#39;m not tested it in Windows.</p><p>[edit] I&#39;ve discovered that the ball only does dirty the screen when it bounces at &quot;0&quot; coordinate (that is, the border of screen). If it bounces inside the screen it doesn&#39;t dirty it. So, there&#39;s no problem at all. May be Matt or other moderator would delete this thread if it isn&#39;t a bug of Allegro or the Demo Game...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Niunio)</author>
		<pubDate>Mon, 05 Jun 2006 15:47:41 +0000</pubDate>
	</item>
</rss>
