<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Image processing and transparency</title>
		<link>http://www.allegro.cc/forums/view/591116</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 22 Apr 2007 09:47:14 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve been having problems when working with transparency when doing image processing...</p><p>The game consists of two boards (one for now).  A board is a grid of 6x12 pieces, but 8x14 for padding.  The pieces are connected when neighboring like pieces.  The drawing process is done for each piece, on a temporary bitmap.  Then it is mask_blitted onto the video.  All BMP versions of the images are in 256 colors, I am also running the game in 32bit color.</p><p>1. Here is my game, no image processing: <a href="http://zyklus.acaro.org/host/puyo/debug00.jpg">http://zyklus.acaro.org/host/puyo/debug00.jpg</a> (boring)<br />2. This is the image map, and its mask: <a href="http://zyklus.acaro.org/host/puyo/debug05.jpg">http://zyklus.acaro.org/host/puyo/debug05.jpg</a><br />The mask is green for a reason, it will be inverted later.<br />3. This is the board, showing neighbors: <a href="http://zyklus.acaro.org/host/puyo/debug01.jpg">http://zyklus.acaro.org/host/puyo/debug01.jpg</a><br />4. Result of multiplying 1 with 3: <a href="http://zyklus.acaro.org/host/puyo/debug02.jpg">http://zyklus.acaro.org/host/puyo/debug02.jpg</a> (better, but need to fix that black area to be transparent)<br />5. This is the mask I want to use: <a href="http://zyklus.acaro.org/host/puyo/debug03.jpg">http://zyklus.acaro.org/host/puyo/debug03.jpg</a> (why is the magenta yellow?)<br />6. Invert 5 and mask_blit onto 4:<br /><a href="http://zyklus.acaro.org/host/puyo/debug04.jpg">http://zyklus.acaro.org/host/puyo/debug04.jpg</a></p><p>I get the mask that I want, but it destroys everything else X|<br />Any ideas?</p><p>EDIT:  here is some code:</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><span class="p">#define TILE_GET_CONNECTORS(x)  (((x)&amp;(15&lt;&lt;8))&gt;&gt;8)</span></td></tr><tr><td class="number">3</td><td>&#160;</td></tr><tr><td class="number">4</td><td><span class="k1">struct</span> v2 <span class="k2">{</span> <span class="k1">float</span> x, y<span class="k2">;</span> <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k1">typedef</span> <span class="k1">unsigned</span> <span class="k1">int</span> word<span class="k2">;</span></td></tr><tr><td class="number">6</td><td><span class="k1">typedef</span> <span class="k1">unsigned</span> <span class="k1">char</span> byte<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td>.</td></tr><tr><td class="number">9</td><td>.</td></tr><tr><td class="number">10</td><td>.</td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="k1">void</span> CBoard::DrawBlockProc<span class="k2">(</span> v2 <span class="k3">&amp;</span>v, word tile <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>  <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp <span class="k3">=</span> g_pGame-&gt;GetGfx<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>GetRamPage<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td> <span class="c">// RamPage is a temporary ram bitmap for post-image processing... blitted onto video later.</span></td></tr><tr><td class="number">16</td><td>  byte n <span class="k3">=</span> <span class="n">0</span>, color <span class="k3">=</span> tile <span class="k3">&amp;</span> <span class="n">0xFF</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="c">// Draw the base:</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">if</span> <span class="k2">(</span> color <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k2">)</span> <span class="c">// Empty space here, nothing to do</span></td></tr><tr><td class="number">20</td><td>    <span class="k1">return</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">if</span> <span class="k2">(</span> <span class="k2">(</span><span class="k3">-</span><span class="k3">-</span>color<span class="k2">)</span> <span class="k3">&gt;</span><span class="k3">=</span> m_iNumberOfTileImages <span class="k2">)</span> <span class="c">// If color is 1, it indexes tile_bitmap 0</span></td></tr><tr><td class="number">22</td><td>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span> m_pBmpTemp, <span class="n">0</span>, <span class="n">0</span>, m_iBlocksz, m_iBlocksz, <a href="http://www.allegro.cc/manual/makecol" target="_blank"><span class="a">makecol</span></a><span class="k2">(</span> <span class="n">64</span>, <span class="n">64</span>, <span class="n">64</span> <span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">24</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">25</td><td>    n <span class="k3">=</span> TILE_GET_CONNECTORS<span class="k2">(</span>tile<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>    <a href="http://www.allegro.cc/manual/drawing_mode" target="_blank"><span class="a">drawing_mode</span></a><span class="k2">(</span> DRAW_MODE_COPY_PATTERN, m_pBmpTileImgs<span class="k2">[</span>color<span class="k2">]</span>, <span class="k3">-</span>v.x, <span class="k3">-</span>v.y <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>    <a href="http://www.allegro.cc/manual/rectfill" target="_blank"><span class="a">rectfill</span></a><span class="k2">(</span> m_pBmpTemp, <span class="n">0</span>, <span class="n">0</span>, m_iBlocksz, m_iBlocksz, <span class="k3">-</span><span class="n">1</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>    <a href="http://www.allegro.cc/manual/drawing_mode" target="_blank"><span class="a">drawing_mode</span></a><span class="k2">(</span> DRAW_MODE_SOLID, NULL, <span class="n">0</span>, <span class="n">0</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>  <span class="c">// Multiply imagemap:</span></td></tr><tr><td class="number">32</td><td>  <a href="http://www.allegro.cc/manual/set_multiply_blender" target="_blank"><span class="a">set_multiply_blender</span></a><span class="k2">(</span> <span class="n">0</span>, <span class="n">0</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">33</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> m_pBmpTemp, m_pBmpTileMap<span class="k2">[</span>n<span class="k2">]</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">34</td><td>  </td></tr><tr><td class="number">35</td><td>  <span class="c">// Draw mask: </span></td></tr><tr><td class="number">36</td><td>  <a href="http://www.allegro.cc/manual/set_invert_blender" target="_blank"><span class="a">set_invert_blender</span></a><span class="k2">(</span> <span class="n">0</span>, <span class="n">0</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">37</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> m_pBmpTemp, m_pBmpTileMask<span class="k2">[</span>n<span class="k2">]</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">38</td><td>  </td></tr><tr><td class="number">39</td><td>  <span class="c">// Blit onto "video":</span></td></tr><tr><td class="number">40</td><td>  <a href="http://www.allegro.cc/manual/solid_mode" target="_blank"><span class="a">solid_mode</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>  <a href="http://www.allegro.cc/manual/masked_blit" target="_blank"><span class="a">masked_blit</span></a><span class="k2">(</span> m_pBmpTemp, bmp, <span class="n">0</span>, <span class="n">0</span>, v.x, v.y, m_iBlocksz, m_iBlocksz <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (zyklus_)</author>
		<pubDate>Sat, 21 Apr 2007 23:45:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I get the mask that I want, but it destroys everything else X|<br />Any ideas?
</p></div></div><p>
Try playing around with the last parameter of set_invert_blender(). 128 would be a good value to try.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Sun, 22 Apr 2007 08:52:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve already tried that, and here&#39;s how it looked:</p><p><a href="http://zyklus.acaro.org/host/puyo/debug06.jpg">http://zyklus.acaro.org/host/puyo/debug06.jpg</a></p><p>What I don&#39;t understand is why, when I try to draw a masked bitmap with <tt>draw_sprite</tt>, the magenta changes into yellow</p><p>Is there any way I can tell a specific bitmap to ignore or change it&#39;s transparency color?</p><p>EDIT:</p><p>Ah, nvm; problem solved.  It was a discreet problem and a slight programming error.<br />Apparently, when the mask was loaded into the bitmap, it ignored pixels with the mask color; I expected it to load the whole thing XD.  Well, just a simple <tt>rectfill( ... makecol( 255, 0, 255 );</tt> fixed the problem.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (zyklus_)</author>
		<pubDate>Sun, 22 Apr 2007 09:47:14 +0000</pubDate>
	</item>
</rss>
