<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Check if the mouse is over irregular shapes</title>
		<link>http://www.allegro.cc/forums/view/608905</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 26 Nov 2011 08:25:42 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m trying to fancy up my ui in one of my programs and wanted to use other shapes than just squares and rectangles. But I&#39;m having problems with the code crashing. Does this look like a good way to do it?</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> Framework_SelectableButton::RegisterIrregularShape<span class="k2">(</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    IrregularShape <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  4</span>    vector<span class="k3">&lt;</span>vector<span class="k3">&lt;</span>ALLEGRO_COLOR&gt;&gt; Pixels<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>UpImage<span class="k2">)</span>, vector<span class="k3">&lt;</span>ALLEGRO_COLOR&gt;<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>UpImage, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READONLY<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  8</span>    <span class="k2">{</span>
<span class="number">  9</span>        <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 10</span>        <span class="k2">{</span>
<span class="number"> 11</span>            Pixels<span class="k2">[</span>i<span class="k2">]</span><span class="k2">[</span>j<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>UpImage, i, j<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>        <span class="k2">}</span>
<span class="number"> 13</span>    <span class="k2">}</span>
<span class="number"> 14</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    ImagePixels <span class="k3">=</span> Pixels<span class="k2">;</span>
<span class="number"> 17</span><span class="k2">}</span>
</div></div><p>

</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="k1">void</span> Framework_SelectableButton::IsMouseOver<span class="k2">(</span><span class="k1">int</span> MouseX, <span class="k1">int</span> MouseY<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>    <span class="k1">if</span><span class="k2">(</span>IrregularShape <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span>
<span class="number">  4</span>    <span class="k2">{</span>
<span class="number">  5</span>        <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>MouseX <span class="k3">&gt;</span><span class="k3">=</span> x1<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseX <span class="k3">&lt;</span><span class="k3">=</span> x2<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseY <span class="k3">&gt;</span><span class="k3">=</span> y1<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseY <span class="k3">&lt;</span><span class="k3">=</span> y2<span class="k2">)</span><span class="k2">)</span>
<span class="number">  6</span>        <span class="k2">{</span>
<span class="number">  7</span>            Over <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  8</span>        <span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span>        <span class="k1">else</span>
<span class="number"> 11</span>        <span class="k2">{</span>
<span class="number"> 12</span>            Over <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 13</span>        <span class="k2">}</span>
<span class="number"> 14</span>    <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>IrregularShape <span class="k3">=</span><span class="k3">=</span> <span class="k1">true</span><span class="k2">)</span>
<span class="number"> 17</span>    <span class="k2">{</span>
<span class="number"> 18</span>        <span class="k1">if</span><span class="k2">(</span><span class="k2">(</span>MouseX <span class="k3">&gt;</span><span class="k3">=</span> x1<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseX <span class="k3">&lt;</span><span class="k3">=</span> x2<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseY <span class="k3">&gt;</span><span class="k3">=</span> y1<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k2">(</span>MouseY <span class="k3">&lt;</span><span class="k3">=</span> y2<span class="k2">)</span><span class="k2">)</span> <span class="c">//check if the mouse is over the image at all</span>
<span class="number"> 19</span>        <span class="k2">{</span>
<span class="number"> 20</span>            <span class="k1">unsigned</span> <span class="k1">char</span> r, g, b, alpha<span class="k2">;</span>
<span class="number"> 21</span>            <a href="http://www.allegro.cc/manual/al_unmap_rgba"><span class="a">al_unmap_rgba</span></a><span class="k2">(</span>ImagePixels<span class="k2">[</span>MouseX-x1<span class="k2">]</span><span class="k2">[</span>MouseY-y1<span class="k2">]</span>, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b, <span class="k3">&amp;</span>alpha<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>            <span class="k1">if</span><span class="k2">(</span>alpha <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 24</span>            <span class="k2">{</span>
<span class="number"> 25</span>                Over <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 26</span>            <span class="k2">}</span>
<span class="number"> 27</span>
<span class="number"> 28</span>            <span class="k1">else</span> <span class="c">// if the pixel that the mouse is over isnt completly transparent then over is true</span>
<span class="number"> 29</span>            <span class="k2">{</span>
<span class="number"> 30</span>                Over <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 31</span>            <span class="k2">}</span>
<span class="number"> 32</span>        <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>        <span class="k1">else</span>
<span class="number"> 35</span>        <span class="k2">{</span>
<span class="number"> 36</span>            Over <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 37</span>        <span class="k2">}</span>
<span class="number"> 38</span>    <span class="k2">}</span>
<span class="number"> 39</span><span class="k2">}</span>
</div></div><p>

Heres </p><p>EDIT: I&#39;ve attached what one of the images look like. Its pretty much looks like a quarter part of an o.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (shadyvillian)</author>
		<pubDate>Fri, 25 Nov 2011 06:49:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It seems to me that the active area for a mouse is still rectangular even if the widget is oval or whatever.  It&#39;d be rather hard to notice this unless your OCD or something.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 25 Nov 2011 06:52:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It probably crashes because:
</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> i<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> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
        <span class="k2">{</span>
            Pixels<span class="k2">[</span>i<span class="k2">]</span><span class="k2">[</span>j<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>UpImage, i, j<span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
    <span class="k2">}</span>
</pre></div></div><p>
should probably be:
</p><div class="source-code snippet"><div class="inner"><pre>    <span class="k1">for</span><span class="k2">(</span><span class="k1">int</span> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> j<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> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>UpImage<span class="k2">)</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
        <span class="k2">{</span>
            Pixels<span class="k2">[</span>i<span class="k2">]</span><span class="k2">[</span>j<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>UpImage, i, j<span class="k2">)</span><span class="k2">;</span>
        <span class="k2">}</span>
    <span class="k2">}</span>
</pre></div></div><p>

But really, why store every pixel?</p><p>Just translate the mouse so that it is relative to the bitmap eg: if bitmap is at 50,50 subtract 50,50 from mouse position.<br />Then do bounds check on your mouse so mouseX &gt;= 0 &amp;&amp; mouseX &lt; width ... same for height. Then just make 1 call to al_get_pixel(mouseX,mouseY).</p><p>But if you want to do it your way, remember c++ is row major so [width][height]
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 25 Nov 2011 07:44:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah thats what I figured was causing the crash. I just wanted to store all the pixels because I thought that if the mouse is moved alot over the image that all the al_get_pixel calls would cause lag.</p><p>EDIT: The code seems to work fine. Its pixel perfect precision. But after I click on one button and then click on another on it crashes on <span class="source-code"><a href="http://www.allegro.cc/manual/al_unmap_rgba"><span class="a">al_unmap_rgba</span></a><span class="k2">(</span>ImagePixels<span class="k2">[</span>x<span class="k2">]</span><span class="k2">[</span>y<span class="k2">]</span>, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b, <span class="k3">&amp;</span>alpha<span class="k2">)</span><span class="k2">;</span></span></p><p>EDIT2: Changing the code to this stops the crashes
</p><div class="source-code snippet"><div class="inner"><pre>            <span class="k1">unsigned</span> <span class="k1">char</span> r, g, b, alpha<span class="k2">;</span>
            <a href="http://www.allegro.cc/manual/al_unmap_rgba"><span class="a">al_unmap_rgba</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>UpImage, MouseX-x1, MouseY-y1<span class="k2">)</span>, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b, <span class="k3">&amp;</span>alpha<span class="k2">)</span><span class="k2">;</span>
            Over <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>

            <span class="k1">if</span><span class="k2">(</span>alpha <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> <span class="c">// if the pixel that the mouse is over is completly transparent then over is false</span>
            <span class="k2">{</span>
                Over <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
            <span class="k2">}</span>
</pre></div></div><p>

Will locking the bitmap in this situation increase performance?(between the unmap_rgba)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (shadyvillian)</author>
		<pubDate>Fri, 25 Nov 2011 07:52:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I don&#39;t think so. I think the cost of locking it so often would outweigh the performance boost.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sat, 26 Nov 2011 05:15:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Locking would probably help unless you&#39;re only doing a few pixels. Just make sure to only lock the region you need if it&#39;s not the whole bitmap. Sorry, I didn&#39;t really read your code so I don&#39;t know what&#39;s best for you, just that locking helps if you&#39;re accessing more than a few pixels and they&#39;re all adjacent.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sat, 26 Nov 2011 06:34:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well al_get_pixel is called everytime an allegro_event_mouse_axes event occurs and the mouse is over the bitmap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (shadyvillian)</author>
		<pubDate>Sat, 26 Nov 2011 08:20:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If it&#39;s just called once then it doesn&#39;t matter if you lock the bitmap.</p><p>The way it works is, al_get_pixel will lock a 1x1 pixel region of the bitmap for you if the bitmap isn&#39;t locked already. Then it will unlock it.</p><p>If it is already locked, it just reads from the lock data and doesn&#39;t unlock the bitmap. If you get a pixel outside of the locked region it will return 0s for the pixel data.</p><p>So for 1 pixel the behaviour is identical. For more than 1 pixel you can avoid locking operatings in al_get_pixel by locking yourself which will be faster, because locking is slow.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sat, 26 Nov 2011 08:25:42 +0000</pubDate>
	</item>
</rss>
