<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>convert pixel formats</title>
		<link>http://www.allegro.cc/forums/view/606139</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 21 Jan 2011 13:57:09 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>basically, I&#39;m trying to figure out how to finish (do it correctly) this function :
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">inline</span> <span class="k1">uint32_t</span> make_argb_8888<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> <span class="k3">&amp;</span>col<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">unsigned</span> <span class="k1">char</span> r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="n">255</span> <span class="k3">*</span> col.r<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">unsigned</span> <span class="k1">char</span> g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="n">255</span> <span class="k3">*</span> col.g<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">unsigned</span> <span class="k1">char</span> b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="n">255</span> <span class="k3">*</span> col.b<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">unsigned</span> <span class="k1">char</span> a <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><span class="n">255</span> <span class="k3">*</span> col.a<span class="k2">)</span><span class="k2">;</span>

  <span class="c">// uh....</span>
<span class="k2">}</span>
</pre></div></div><p>

Something makes me think I should do<br /><span class="source-code"><span class="k1">return</span> <span class="k2">(</span><span class="n">0x00ff0000</span> <span class="k3">*</span> r<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="n">0x0000ff00</span> <span class="k3">*</span> g<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="n">0x000000ff</span> <span class="k3">*</span> b<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span><span class="n">0xff000000</span> <span class="k3">*</span> a<span class="k2">)</span><span class="k2">;</span></span><br />and that&#39;s my best guess, but I don&#39;t know why.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 21 Jan 2011 11:02:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><span class="k2">(</span>a <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">24</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>r <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>g <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">|</span> b</span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Fri, 21 Jan 2011 11:07:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you had these four chars as a struct in a union with an int, you could skip the addition and multiplication in the return value by using the address offsets as a &quot;multiplication&quot; substitute..  IIRC that&#39;s the way A4 did it.</p><p>You might look into SSE if you don&#39;t care about portability.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 21 Jan 2011 11:09:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fantastic!  Thanks Matthew.</p><p>My result:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">unsigned</span> <span class="k1">char</span> r, g, b, a<span class="k2">;</span>

<span class="k1">inline</span> <span class="k1">uint32_t</span> make_argb_8888<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> <span class="k3">&amp;</span>col<span class="k2">)</span>
<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>col, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b, <span class="k3">&amp;</span>a<span class="k2">)</span><span class="k2">;</span>
  <span class="k1">return</span> <span class="k2">(</span>a <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">24</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>r <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>g <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">|</span> b<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Would I get any real benefits using a union?  It seems like it would just involve more shuffling and processor time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 21 Jan 2011 11:16:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I tried timing them with clock(), but they seemed to run about equal.  I didn&#39;t check that the logic is correct, but as long as I don&#39;t overrun arrays the times should be about what the &quot;right&quot; way would take.</p><p>click paperclip to get the test proglet.</p><p>[EDIT]</p><p>I had a brain fart blowing out the cache, naturally they&#39;d be the same, but no matter what I do they run about equal (or at least bounce around as to which is faster).  See t_v2.c in paperclip.</p><p>In short, Matthew&#39;s version would be better for conciseness.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 21 Jan 2011 11:56:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should declare r, g, b, and a inside the function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Fri, 21 Jan 2011 12:15:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I thought I did <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />  Unless you mean the global arrays of floats and ints, simulating buffers in memory.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 21 Jan 2011 12:18:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>I thought I did <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /></p></div></div><p>He&#39;s talkin to me.</p><p>Wouldn&#39;t that slow down the function?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 21 Jan 2011 12:21:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The idea of locals on the stack being faster is due to the cache line already being loaded due to saving the return address.  I&#39;m not sure how an inlined function would work though, maybe I should check.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 21 Jan 2011 12:34:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It should speed it up.</p><p>Stuff inside a function goes into the cache, which is faster to play with than regular memory.</p><p>Also a smart compiler could turn them into registers -- which would be even faster.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Fri, 21 Jan 2011 12:35:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><a href="http://www.allegro.cc/forums/thread/606140">K, I did some benchmarks on the pixel routines.</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 21 Jan 2011 13:57:09 +0000</pubDate>
	</item>
</rss>
