<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>error in _getpixel?</title>
		<link>http://www.allegro.cc/forums/view/587886</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 06 Oct 2006 16:13:09 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello,<br />I have a program that loops through a bitmap and extracts smaller bitmaps, e.g. 16x16 pixels - it&#39;s a tile extraction program. It then adds these to a list, but first checks the bitmap doesn&#39;t already exist in the list. The code to check if the bitmaps are the same (they are always the same depth) is :</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> IsBitmapSame<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> Checking,<a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> Current<span class="k2">)</span>
<span class="k2">{</span>
<span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>y<span class="k3">&lt;</span>Current-&gt;h<span class="k2">;</span>y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>Current-&gt;w<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
  <span class="k2">{</span>
                <span class="k1">if</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/_getpixel" target="_blank"><span class="a">_getpixel</span></a><span class="k2">(</span>Current,x,y<span class="k2">)</span><span class="k3">!</span><span class="k3">=</span><a href="http://www.allegro.cc/manual/_getpixel" target="_blank"><span class="a">_getpixel</span></a><span class="k2">(</span>Checking,x,y<span class="k2">)</span><span class="k2">)</span>
    <span class="k2">{</span>
      <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k2">}</span>
  <span class="k2">}</span>
<span class="k2">}</span>
<span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

For an average bitmap which would have a few hundred tiled bitmaps within it works 99% of the time, however on certain extracted bitmaps it is returning a match on the very first bitmap in the list despite the bitmaps being completely different. If I change either of the above _getpixel to getpixel it works a treat, so it appears _getpixel is doing something when _getpixel is ran twice in succession? This was tested only on windows.</p><p>From analysis (well, somebody elses) it seems to be getting it wrong for bitmaps where oly the last 3 pixels on a line differ. Though this could be a red herring., but it&#39;s definitely something to do with the bitmap data.</p><p>Attached is a bitmap showing it. It is a cut down portion of a larger map. As you can see the version using getpixel finds all three tiles, but the version running _getpixel seems to match the first half of the circle with the first all blue tile. The larger image below shows a flag made up of 4 white parts, the bottom left tile is actually just 1 white pixel, but this is also skipped and the tile becomes the first all blue one again - hence why the comment above regarding the 3 pixels. </p><p>Tracing the code through for the two bitmaps passed in, for the ones that fail, it seems to be getting the same colour back for both images, despite their being different!</p><p>The code below is a snippet showing how the two bitmaps are generated:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>std::vector<span class="k3">&lt;</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">&gt;</span> BitmapList<span class="k2">;</span>    <span class="c">//array of unique bitmaps</span></td></tr><tr><td class="number">2</td><td>std::vector<span class="k3">&lt;</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>const_iterator BitmapListIterator<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td>&#160;</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> Current<span class="k3">=</span>NULL<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> Checking<span class="k3">=</span>NULL<span class="k2">;</span></td></tr><tr><td class="number">7</td><td><span class="k1">int</span> same<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td><span class="k1">int</span> Unique,duplicate<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td><span class="k1">int</span> innercount<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">int</span> outercount<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="c">//loop all rows in the bitmap</span></td></tr><tr><td class="number">13</td><td><span class="c">//calcheight is the size of the large bitmap, currenttilesize is the tile size</span></td></tr><tr><td class="number">14</td><td>in pixels, e.g. <span class="n">16</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>y<span class="k3">&lt;</span>CalcHeight<span class="k3">/</span>CurrentTileSize<span class="k2">;</span>y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>  <span class="c">//loop through all the bitmaps from start to end</span></td></tr><tr><td class="number">19</td><td>  <span class="c">//loop all columns in each row</span></td></tr><tr><td class="number">20</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>CalcWidth<span class="k3">/</span>CurrentTileSize<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><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>    Current<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>CurrentTileSize,CurrentTileSize<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>    <span class="c">//loop through what we've got - blit to a temp bitmap</span></td></tr><tr><td class="number">24</td><td>just to make it easy</td></tr><tr><td class="number">25</td><td>    <span class="c">//loadedfile is the big bitmap we are mapping</span></td></tr><tr><td class="number">26</td><td>  </td></tr><tr><td class="number">27</td><td><a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>loadedfile,Current,x<span class="k3">*</span>CurrentTileSize<span class="k3">+</span>ProgramDetails.xoffset,y<span class="k3">*</span>Curre</td></tr><tr><td class="number">28</td><td>ntTileSize<span class="k3">+</span>ProgramDetails.yoffset,<span class="n">0</span>,<span class="n">0</span>,CurrentTileSize,CurrentTileSize<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>    innercount<span class="k3">=</span><span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">30</td><td>    same<span class="k3">=</span><span class="k1">false</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="c">//check if the bitmap has already been stored</span></td></tr><tr><td class="number">33</td><td>  </td></tr><tr><td class="number">34</td><td><span class="k1">for</span><span class="k2">(</span>BitmapListIterator<span class="k3">=</span>BitmapList.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>BitmapListIterator<span class="k3">!</span><span class="k3">=</span>BitmapList</td></tr><tr><td class="number">35</td><td>.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>BitmapListIterator<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">36</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">37</td><td>      <span class="c">//loop through all bitmaps from start upto the</span></td></tr><tr><td class="number">38</td><td>current outer loop</td></tr><tr><td class="number">39</td><td>      same<span class="k3">=</span>IsBitmapSame<span class="k2">(</span><span class="k3">*</span>BitmapListIterator,Current<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>      <span class="k1">if</span><span class="k2">(</span>same<span class="k2">)</span> </td></tr><tr><td class="number">41</td><td>        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>&#160;</td></tr><tr><td class="number">43</td><td>      innercount<span class="k3">+</span><span class="k3">+</span><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>    <span class="c">//tile does not exist, add it</span></td></tr><tr><td class="number">46</td><td>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>same<span class="k2">)</span> </td></tr><tr><td class="number">47</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">48</td><td>      BitmapList.push_back<span class="k2">(</span>Current<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      Unique<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">51</td><td>    <span class="k1">else</span></td></tr><tr><td class="number">52</td><td>      duplicate<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">55</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 05 Oct 2006 20:07:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>According to the documentation, getpixel_ is for 8-bit bitmaps only, so my guess would be, not all your bitmaps are 8 bit. Is there any reason you want to use getpixel_ instead of getpixel?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 05 Oct 2006 20:20:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I thought _getpixel was a wrapper that called _getpixel8, _getpixel16, _getpixel32?</p><p>On testing, _getpixel was about 30% faster than get pixel.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 05 Oct 2006 20:22:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>No, there is no _getpixel8 from what I see, and the only difference to getpixel would be that it&#39;s missing the color depth and clipping checks.</p><p>If you need fast bitmap comparison, something like this might work, since memcmp is quite likely optimized by the compiler a lot (works for memory bitmaps only though):
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> is_same<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>b1, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>b2<span class="k2">)</span>
<span class="k2">{</span>
    <span class="k1">if</span> <span class="k2">(</span><span class="k1">not</span> <a href="http://www.allegro.cc/manual/is_memory_bitmap" target="_blank"><span class="a">is_memory_bitmap</span></a><span class="k2">(</span>b1<span class="k2">)</span> <span class="k1">or</span> <span class="k1">not</span> <a href="http://www.allegro.cc/manual/is_memory_bitmap" target="_blank"><span class="a">is_memory_bitmap</span></a><span class="k2">(</span>b2<span class="k2">)</span><span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k1">int</span> d1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>b1<span class="k2">)</span><span class="k2">;</span>
    <span class="k1">int</span> d2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bitmap_color_depth" target="_blank"><span class="a">bitmap_color_depth</span></a><span class="k2">(</span>b2<span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span> <span class="k2">(</span>d1 <span class="k3">!</span><span class="k3">=</span> d2<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k1">int</span> len1 <span class="k3">=</span> b1-&gt;w <span class="k3">*</span> b1-&gt;h <span class="k3">*</span> <span class="k2">(</span><span class="k2">(</span>d1 <span class="k3">+</span> <span class="n">7</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">8</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">int</span> len2 <span class="k3">=</span> b2-&gt;w <span class="k3">*</span> b2-&gt;h <span class="k3">*</span> <span class="k2">(</span><span class="k2">(</span>d2 <span class="k3">+</span> <span class="n">7</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">8</span><span class="k2">)</span><span class="k2">;</span>
    <span class="k1">if</span> <span class="k2">(</span>len1 <span class="k3">!</span><span class="k3">=</span> len2<span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_565.html" target="_blank">memcmp</a><span class="k2">(</span>b1-&gt;dat, b2-&gt;dat, len1<span class="k2">)</span><span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 05 Oct 2006 20:33:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ll try it now, keep listening <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>btw, I&#39;ve just tried it again but altered the code so that instead of creating a new bitmap to check against the existing ones, it passes in the large bitmap with the startx/y instead. Doing this using _getpixel returns all bitmaps being the same as the first tile, but using getpixel works again. So there is definitely something wrong with _getpixel.</p><p>[edit]On testing an image with 22000 8x8 pixel tiles it took 45 seconds using getpixel, 35 using _getpixel and 40 using your new code. </p><p>I know we&#39;re digressing from the original problem, but I think the bottleneck is the way I create a new bitmap for comparison every time, so instead I use the above approach using the large bitmap passing in offsets, however I had to use getpixel because as mentioned _getpixel doesn&#39;t work so it took 45 seconds as well.</p><p>Could your code be improved by using a checksum perchance?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 05 Oct 2006 20:36:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I&#39;ve just tried it again but altered the code so that instead of creating a new bitmap to check against the existing ones, it passes in the large bitmap with the startx/y instead. Doing this using _getpixel returns all bitmaps being the same as the first tile, but using getpixel works again.
</p></div></div><p>
I don&#39;t have a clue what that means. Can you illustrate what you&#39;re trying to do with some example code?</p><p>Anyway, this is the implementation of _getpixel:
</p><div class="source-code snippet"><div class="inner"><pre>AL_INLINE<span class="k2">(</span><span class="k1">int</span>, <a href="http://www.allegro.cc/manual/_getpixel" target="_blank"><span class="a">_getpixel</span></a>, <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <span class="k1">int</span> x, <span class="k1">int</span> y<span class="k2">)</span>,
<span class="k2">{</span>
   uintptr_t addr<span class="k2">;</span>
   <span class="k1">int</span> c<span class="k2">;</span>

   bmp_select<span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>
   addr <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bmp_read_line" target="_blank"><span class="a">bmp_read_line</span></a><span class="k2">(</span>bmp, y<span class="k2">)</span><span class="k2">;</span>
   c <span class="k3">=</span> bmp_read8<span class="k2">(</span>addr<span class="k3">+</span>x<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/bmp_unwrite_line" target="_blank"><span class="a">bmp_unwrite_line</span></a><span class="k2">(</span>bmp<span class="k2">)</span><span class="k2">;</span>

   <span class="k1">return</span> c<span class="k2">;</span>
<span class="k2">}</span><span class="k2">)</span>
</pre></div></div><p>


getpixel is a bit more involved, but reads
</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="c">/* _linear_getpixel:</span></td></tr><tr><td class="number">2</td><td><span class="c"> *  Reads a pixel from a linear bitmap.</span></td></tr><tr><td class="number">3</td><td><span class="c"> */</span></td></tr><tr><td class="number">4</td><td><span class="k1">int</span> FUNC_LINEAR_GETPIXEL<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>src, <span class="k1">int</span> sx, <span class="k1">int</span> sy<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/ASSERT" target="_blank"><span class="a">ASSERT</span></a><span class="k2">(</span>src<span class="k2">)</span><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">if</span> <span class="k2">(</span><span class="k2">(</span>sx <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>sx <span class="k3">&gt;</span><span class="k3">=</span> src-&gt;w<span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>sy <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">|</span><span class="k3">|</span> <span class="k2">(</span>sy <span class="k3">&gt;</span><span class="k3">=</span> src-&gt;h<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>   <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>      PIXEL_PTR s <span class="k3">=</span> OFFSET_PIXEL_PTR<span class="k2">(</span><a href="http://www.allegro.cc/manual/bmp_read_line" target="_blank"><span class="a">bmp_read_line</span></a><span class="k2">(</span>src, sy<span class="k2">)</span>, sx<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>      <span class="k1">unsigned</span> <span class="k1">long</span> c<span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>      bmp_select<span class="k2">(</span>src<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      c <span class="k3">=</span> GET_PIXEL<span class="k2">(</span>s<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>      <a href="http://www.allegro.cc/manual/bmp_unwrite_line" target="_blank"><span class="a">bmp_unwrite_line</span></a><span class="k2">(</span>src<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>      <span class="k1">return</span> c<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="k2">}</span></td></tr></tbody></table></div></div><p>
where, for 8 bit bitmaps, </p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define GET_PIXEL(p)           bmp_read8((uintptr_t) (p))</span>
<span class="p">#define OFFSET_PIXEL_PTR(p,x)  ((PIXEL_PTR) (p) + (x))</span>
</pre></div></div><p>
So it looks pretty much the same to me...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Thu, 05 Oct 2006 20:53:14 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>[EDIT]Ok, I&#39;ve just taken in what elias said and evert mentioned. I was just blind to it, and I blame the fecking allegro file naming system <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>I thought, like all other bpp specific functions, e.g. getcolor, _getpixel would call the relevant one, e.g. _getpixel16, _getpixel32, etc. I guess this goes back to 1986 when allegro was only 8bpp. Bring on allegro 4.3 <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I don&#39;t have a clue what that means. Can you illustrate what you&#39;re trying to do with some example code?
</p></div></div><p>

Sure. I modified my check program to be as follows:
</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">bool</span> IsBitmapSame2<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> Checking,<a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> source,<span class="k1">int</span> sourcex, <span class="k1">int</span> sourcey<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> p1, p2<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">for</span><span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>y<span class="k3">&lt;</span>Checking-&gt;h<span class="k2">;</span>y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>Checking-&gt;w<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">8</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">9</td><td>      p1<span class="k3">=</span><a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>Checking,x,y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td>      p2<span class="k3">=</span><a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>source,x<span class="k3">+</span>sourcex,y<span class="k3">+</span>sourcey<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>      <span class="k1">if</span><span class="k2">(</span>p1<span class="k3">!</span><span class="k3">=</span>p2<span class="k2">)</span></td></tr><tr><td class="number">12</td><td>      <span class="k2">{</span></td></tr><tr><td class="number">13</td><td>        <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>      <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>  <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="c">//the same</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">return</span> <span class="k1">true</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>

Using the example of the graphics mentioned: Checking is a 8x8 bitmap created by blitting a portion of &#39;source&#39;, i.e. we have a list of 8x8 unique bitmaps taken as tiles from &#39;source&#39; and passing in new locations within &#39;source&#39; using the sourcex/sourcey. The code above works fine and correctly identifies unique/duplicates. If I change getpixel to _getpixel it thinks it is a match for the first bitmap in the list, </p><p>The code for this is:
</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">for</span><span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>y<span class="k3">&lt;</span>CalcHeight<span class="k3">/</span>CurrentTileSize<span class="k2">;</span>y<span class="k3">+</span><span class="k3">+</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="c">//loop all columns in each row</span></td></tr><tr><td class="number">4</td><td>  <span class="c">//CurrentTileSize is 8 in our case, and CalcWidth/CalcHeight is the size of loadedfile</span></td></tr><tr><td class="number">5</td><td>  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>CalcWidth<span class="k3">/</span>CurrentTileSize<span class="k2">;</span>x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">7</td><td>    same<span class="k3">=</span><span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td>    <span class="k1">for</span><span class="k2">(</span>BitmapListIterator<span class="k3">=</span>BitmapList.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>BitmapListIterator<span class="k3">!</span><span class="k3">=</span>BitmapList.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>BitmapListIterator<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>      same<span class="k3">=</span>IsBitmapSame2<span class="k2">(</span><span class="k3">*</span>BitmapListIterator,loadedfile,x<span class="k3">*</span>CurrentTileSize<span class="k3">+</span>ProgramDetails.xoffset,y<span class="k3">*</span>CurrentTileSize<span class="k3">+</span>ProgramDetails.yoffset<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>same<span class="k2">)</span> </td></tr><tr><td class="number">13</td><td>        <span class="k1">break</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">15</td><td>    <span class="c">//tile does not exist, add it</span></td></tr><tr><td class="number">16</td><td>    <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>same<span class="k2">)</span> </td></tr><tr><td class="number">17</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">18</td><td>      Current<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>CurrentTileSize,CurrentTileSize<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      <span class="c">//loop through what we've got - blit to a temp bitmap just to make it easy</span></td></tr><tr><td class="number">20</td><td>      <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>loadedfile,Current,x<span class="k3">*</span>CurrentTileSize<span class="k3">+</span>ProgramDetails.xoffset,y<span class="k3">*</span>CurrentTileSize<span class="k3">+</span>ProgramDetails.yoffset,<span class="n">0</span>,<span class="n">0</span>,CurrentTileSize,CurrentTileSize<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>      BitmapList.push_back<span class="k2">(</span>Current<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>      Unique<span class="k3">+</span><span class="k3">+</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="k1">else</span></td></tr><tr><td class="number">26</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">27</td><td>      duplicate<span class="k3">+</span><span class="k3">+</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>&#160;</td></tr><tr><td class="number">30</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">31</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 05 Oct 2006 21:04:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Ok, I&#39;ve just taken in what elias said and evert mentioned. I was just blind to it
</p></div></div><p>
Ok, so I take it that if you call the one for the proper colour depth, it does work properly?</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I thought, like all other bpp specific functions, e.g. getcolor, _getpixel would call the relevant one
</p></div></div><p>
Morale: if a function returns unexpected results, re-read TFM first. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>I agree that it would be more consistent to rename _getpixel to _getpixel8 and alias _getpixel to _getpixel8 though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Thu, 05 Oct 2006 23:29:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks all, this bug is now fixed. I also modified my code with some optimisations mentioned here and elsewhere by friends, on a map that used to take 5 minutes (90,000 tiles, 420 unique bitmaps) to process it now takes about 30 seconds. I also added an option to bypass creation of single bitmaps per tile (there is a sheet file option) and it knocks this down further to 3 seconds <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>I&#39;ll post an update later, if anyone&#39;s interested.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
re-read TFM first.
</p></div></div><p>
<a href="http://www.allegro.cc/manual/api/drawing-primitives/_getpixel">http://www.allegro.cc/manual/api/drawing-primitives/_getpixel</a></p><p>I did, and it was very useful <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Fri, 06 Oct 2006 13:27:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s not the official manual though. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Fri, 06 Oct 2006 14:08:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Indeed, looks like a bug in the a.cc manual.</p><p>The official documentation is at <a href="http://alleg.sf.net">http://alleg.sf.net</a> - simply type &quot;getpixel&quot; into the search box.</p><p>I wonder what happened to Matthew&#39;s plans to move the official documentation for 4.3 to allegro.cc, and also make it user editable. Guess it&#39;s not the best route after all, and we&#39;ll have to discuss how to handle 4.3 documentation again at some point..
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 06 Oct 2006 14:51:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I personally don&#39;t see a problem with keeping the documentation bundled with Allegro, as it is now. I think that&#39;s a good thing, actually.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Evert)</author>
		<pubDate>Fri, 06 Oct 2006 14:56:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Neil:</p><p>Would it help if you did something like this?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">bool</span> IsBitmapSame<span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> Checking,<a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span> Current<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>y<span class="k3">&lt;</span>Current-&gt;h<span class="k2">;</span>y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
  <span class="k2">{</span>
    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> x<span class="k3">=</span><span class="n">0</span><span class="k2">;</span>x<span class="k3">&lt;</span>Current-&gt;w<span class="k2">;</span>x <span class="k3">+</span><span class="k3">=</span> <span class="n">4</span><span class="k2">)</span>
    <span class="k2">{</span>
     <span class="k1">if</span> <span class="k2">(</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">long</span> <span class="k3">*</span><span class="k2">)</span>checking-&gt;line<span class="k2">[</span>y<span class="k2">]</span><span class="k2">)</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k3">!</span><span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">long</span> <span class="k3">*</span><span class="k2">)</span>current-&gt;line<span class="k2">[</span>y<span class="k2">]</span><span class="k2">)</span><span class="k2">[</span>x<span class="k2">]</span> <span class="k2">)</span> <span class="k1">return</span> <span class="k1">false</span><span class="k2">;</span>
    <span class="k2">}</span>
  <span class="k2">}</span>

  <span class="k1">return</span> <span class="k1">true</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
This would have to use memory bitmaps that have a width multiple of 4, but it would check 4 8-bit pixels at once.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Fri, 06 Oct 2006 15:43:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Rich, thanks. I&#39;ve now tried all the permutations of speeding up the pixel check and what actually comes out best is to check the depth and use _getpixel, _getpixel16, _getpixel32. The reason why it is faster is that for the above optimised bitmap&lt;&gt;bitmap test requires two bitmaps, however creating each one from the large bitmap for comparison is time consuming and so what I now do in code is check the existing tile list of bitmaps with an area of the large map and only create bitmaps when they are unique.</p><p>As mentioned above, this took Dan Dare down to 3 seconds from 5 minutes.</p><p>I&#39;ve also added two more features that I&#39;ll upload tonight.</p><p>1. Different sized width/height for tiles, e.g. 32x24. It&#39;s also useful for generating screens, e.g. 256x192. Mario world1-1 looks rather splendid <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>2. Added ability to generate the sheet file as a power of 2, this, apparently will make it work properly with OpenGL.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Fri, 06 Oct 2006 16:09:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Well, if you can use the above code, but checking directly against the tile list of bitmaps then that should be pretty fast.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Fri, 06 Oct 2006 16:13:09 +0000</pubDate>
	</item>
</rss>
