<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Transparency and translucency together</title>
		<link>http://www.allegro.cc/forums/view/590622</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 21 Mar 2007 08:06:48 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First off, my apologies for bothering you folk with what may well be a ridiculously simple problem. I&#39;m sure there&#39;s an obvious solution that I just keep overlooking, but I can&#39;t for the life of me see it.</p><p>Alright, so I have a sprite(&#39;A&#39;), which has a pure magenta (transparency) background. I want to draw another image (&#39;B&#39;) over it translucently, in such a way as to only draw over the non-transparent pixels in A, whilst leaving the transparent pixels their current colour. </p><p>I can&#39;t think of a clearer way to word that, so perhaps an example would be better.</p><p><a href="http://img293.imageshack.us/img293/8356/examplewh7.png">http://img293.imageshack.us/img293/8356/examplewh7.png</a><br />(please excuse the atrocious placeholder graphics, they&#39;re just for example&#39;s sake)</p><p>A is the original sprite, B the image I want to draw over it. When I use draw_trans_sprite to do this, I get C as a result, whilst the result I want is labelled D.</p><p>If anyone can please tell me how I can get that result, short of writing my own blitting function, I&#39;d be grateful.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nathan Holts)</author>
		<pubDate>Tue, 20 Mar 2007 09:28:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My guess is your solution is in </p><p><a href="http://www.allegro.cc/manual/api/transparency-and-patterned-drawing/drawing_mode">drawing_mode</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Tue, 20 Mar 2007 09:35:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>drawing_mode won&#39;t help. I think you&#39;ll need your own blitting function.<br />e.g (untested)</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td>  bitmap <span class="k3">*</span> bmp_a, <span class="k3">*</span> bmp_b, <span class="k3">*</span> bmp_d<span class="k2">;</span>  <span class="c">//all same size. OK if *bmp_d==*bmp_a or *bmp_d==*bmp_b; </span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> d_alpha <span class="k3">=</span> <span class="n">0</span> to <span class="n">255</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">int</span> color_a,color_b<span class="k2">;</span> <span class="c">//temp vars used to store pixel colors</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>  <span class="k1">for</span> <span class="k2">(</span>y<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> y<span class="k3">&lt;</span>bmp_d-&gt;height<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">7</td><td>    <span class="k1">for</span> <span class="k2">(</span>x<span class="k3">=</span><span class="n">0</span> <span class="k2">;</span>x<span class="k3">&lt;</span> bmp_d-&gt;width<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="k1">if</span> <span class="k2">(</span><span class="k2">(</span>color_a <span class="k3">=</span> <a href="http://www.allegro.cc/manual/_getpixel" target="_blank"><span class="a">_getpixel</span></a><span class="k2">(</span>bmp_a,x,y<span class="k2">)</span><span class="k2">)</span><span class="k3">!</span><span class="k3">=</span><a href="http://www.allegro.cc/manual/bitmap_mask_color" target="_blank"><span class="a">bitmap_mask_color</span></a><span class="k2">(</span>bmp_a<span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>      color_b <span class="k3">=</span> <a href="http://www.allegro.cc/manual/_getpixel" target="_blank"><span class="a">_getpixel</span></a><span class="k2">(</span>bmp_b, x, y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>      r <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/getr" target="_blank"><span class="a">getr</span></a><span class="k2">(</span>color_a<span class="k2">)</span> <span class="k3">*</span> d_alpha <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getr" target="_blank"><span class="a">getr</span></a><span class="k2">(</span>color_b<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> d_alpha<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span><span class="n">255</span><span class="k2">;</span>  </td></tr><tr><td class="number">13</td><td>      g <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/getg" target="_blank"><span class="a">getg</span></a><span class="k2">(</span>color_a<span class="k2">)</span> <span class="k3">*</span> d_alpha <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getg" target="_blank"><span class="a">getg</span></a><span class="k2">(</span>color_b<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> d_alpha<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span><span class="n">255</span><span class="k2">;</span>  </td></tr><tr><td class="number">14</td><td>      b <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/getb" target="_blank"><span class="a">getb</span></a><span class="k2">(</span>color_a<span class="k2">)</span> <span class="k3">*</span> d_alpha <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getb" target="_blank"><span class="a">getb</span></a><span class="k2">(</span>color_b<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> d_alpha<span class="k2">)</span><span class="k2">)</span> <span class="k3">/</span><span class="n">255</span><span class="k2">;</span>  </td></tr><tr><td class="number">15</td><td> </td></tr><tr><td class="number">16</td><td>      <a href="http://www.allegro.cc/manual/_putpixel" target="_blank"><span class="a">_putpixel</span></a><span class="k2">(</span>bmp_d, x, y, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span>r,g,b<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">17</td><td>    <span class="k2">}</span> <span class="k1">else</span> <a href="http://www.allegro.cc/manual/_putpixel" target="_blank"><span class="a">_putpixel</span></a><span class="k2">(</span>bmp_d, x, y, color_a<span class="k2">)</span><span class="k2">;</span> <span class="c">//saves need to pre-clear bmp_d; </span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matt Smith)</author>
		<pubDate>Tue, 20 Mar 2007 10:19:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Or create a mask of image A (making all none-magenta colours transparent), resulting in B, combine it with C to create D, and use that on A to produce E?</p><p><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/d/f/df1e5a3600bda90e0db5222ce651c36d.png" alt="591633" width="205" height="91" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HardTranceFan)</author>
		<pubDate>Tue, 20 Mar 2007 10:40:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One Wing: Thanks but I&#39;d already tried this one (asuming you&#39;re thinking the same way I am), it seems it wont work with sprites taller than 64 pixels (mine are 80).</p><p>Matt Smith: That&#39;s what I was afraid of... My main concern with a custom blit function being one of speed.</p><p>HardTranceFan: This is what I was originally thinking, but am stuck on combining B and C. I can&#39;t figure out how to make the white transparent instead of magenta, or is there another way to do this? (again, my apologies if this is really simple, I&#39;ve checked the documentation and couldn&#39;t see anything, but then again I&#39;m not sure exactly what I&#39;m looking for)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nathan Holts)</author>
		<pubDate>Tue, 20 Mar 2007 11:00:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Surprisingly, a custom blit function written like that isn&#39;t too slow.  It can be optimised somewhat (usually at the expense of having seperate versions for each color depth) but this is basically what all allegro&#39;s blit functions do anyway. As it is, it is roughly half the speed of the best possible software solution.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matt Smith)</author>
		<pubDate>Tue, 20 Mar 2007 11:13:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A custom blit function is overkill.  Heres one idea:
</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">unsigned</span> <span class="k1">long</span> reverseTransBlender24<span class="k2">(</span><span class="k1">int</span> x, <span class="k1">int</span> y, <span class="k1">int</span> n<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">unsigned</span> <span class="k1">long</span> ret <span class="k3">=</span> y<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>y <span class="k3">!</span><span class="k3">=</span> <a href="http://www.allegro.cc/manual/makecol24" target="_blank"><span class="a">makecol24</span></a><span class="k2">(</span><span class="n">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span></td></tr><tr><td class="number">6</td><td>        ret <span class="k3">=</span> <a href="http://www.allegro.cc/manual/makecol24" target="_blank"><span class="a">makecol24</span></a><span class="k2">(</span></td></tr><tr><td class="number">7</td><td>            <a href="http://www.allegro.cc/manual/getr24" target="_blank"><span class="a">getr24</span></a><span class="k2">(</span>x<span class="k2">)</span> <span class="k3">*</span> n <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getr24" target="_blank"><span class="a">getr24</span></a><span class="k2">(</span>y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> n<span class="k2">)</span>,</td></tr><tr><td class="number">8</td><td>            <a href="http://www.allegro.cc/manual/getg24" target="_blank"><span class="a">getg24</span></a><span class="k2">(</span>x<span class="k2">)</span> <span class="k3">*</span> n <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getg24" target="_blank"><span class="a">getg24</span></a><span class="k2">(</span>y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> n<span class="k2">)</span>,</td></tr><tr><td class="number">9</td><td>            <a href="http://www.allegro.cc/manual/getb24" target="_blank"><span class="a">getb24</span></a><span class="k2">(</span>x<span class="k2">)</span> <span class="k3">*</span> n <span class="k3">+</span> <a href="http://www.allegro.cc/manual/getb24" target="_blank"><span class="a">getb24</span></a><span class="k2">(</span>y<span class="k2">)</span> <span class="k3">*</span> <span class="k2">(</span><span class="n">255</span> <span class="k3">-</span> n<span class="k2">)</span><span class="k2">)</span><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">return</span> ret<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>&#160;</td></tr><tr><td class="number">14</td><td>...</td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>theGuy, <span class="k3">*</span>thePattern<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><a href="http://www.allegro.cc/manual/set_blender_mode" target="_blank"><span class="a">set_blender_mode</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, reverseTransBlender24, <span class="n">255</span>, <span class="n">255</span>, <span class="n">255</span>, <span class="n">127</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><a href="http://www.allegro.cc/manual/draw_trans_sprite" target="_blank"><span class="a">draw_trans_sprite</span></a><span class="k2">(</span>theGuy, thePattern, <span class="n">0</span>, <span class="n">0</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/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>theGuy, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</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 (ImLeftFooted)</author>
		<pubDate>Tue, 20 Mar 2007 11:54:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>HardTranceFan&#39;s got the right idea, but there&#39;s a simpler method than his, and it takes advantage of Allegro&#39;s ability to blit 8-bit images onto images of a higher bit depth.</p><p>You will end up with four bitmaps. All of which should be truecolour, except B, which should be 8-bit:</p><p>A: Base, Masked Image<br />B: Mask for A<br />C: Transparent Image<br />D: Final Bitmap</p><p>Image B should have the transparent area of A set to a palleted magic pink and the non-transparent area set to colour index 0.</p><p>Then, all you do:</p><p>Step 1: Blit C to D.<br />Step 2: Blit A translucently to D.<br />Step 3: Use draw_sprite() to blit B to D.</p><p>Done! (NOTE: You can also swap A and C between steps 1 and 2. It depends on how you want to control the translucency.)</p><p>--- Kris Asick (Gemini)<br />--- <a href="http://www.pixelships.com">http://www.pixelships.com</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Tue, 20 Mar 2007 18:56:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Dustin Dettmer: I couldn&#39;t get the code you supplied to work, even after tinkering for a while, but it did point me in the right direction. I wouldn&#39;t have even thought of a custom blender (alright, I didn&#39;t even know they existed, I&#39;ve been learning this stuff as it comes up), but I&#39;ve now managed to get one working that does what I needed it to. Many thanks for your help.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Nathan Holts)</author>
		<pubDate>Wed, 21 Mar 2007 06:41:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>AASTR2 will happily do that sort of thing.  It&#39;s reasonably fast if you disable the anti-aliasing part.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Wed, 21 Mar 2007 06:47:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Nathan said:</div><div class="quote"><p>

... but I&#39;ve now managed to get one working that does what I needed it to. Many thanks for your help.
</p></div></div><p>
Awesome <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Wed, 21 Mar 2007 08:06:48 +0000</pubDate>
	</item>
</rss>
