<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>openlayer HLS colourspace</title>
		<link>http://www.allegro.cc/forums/view/568871</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 26 Feb 2006 22:08:02 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>openlayer feature request:
</p><div class="source-code snippet"><div class="inner"><pre>Hlsa<span class="k2">(</span> <span class="k1">float</span> hue, <span class="k1">float</span> lightness, <span class="k1">float</span> saturation, <span class="k1">float</span> alpha <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="c">//returns an Rgba object or 32-bit packed pixel ???</span>
   <span class="c">//therefore can be used anywhere Rgba(,,,) is used. :)</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (fuzinavl)</author>
		<pubDate>Thu, 23 Feb 2006 23:37:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><a href="http://www.allegro.cc/manual/hsv_to_rgb" target="_blank"><span class="a">hsv_to_rgb</span></a></span><br />Click. You can use this function to convert HSV-&gt;RGB and then makecol or proper OpenLayer function to convert it to OpenLeyar color. It should work (unless you need exactly HSL and HSV isn&#39;t enough). <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Thu, 23 Feb 2006 23:56:29 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, just give me the equations and I&#39;ll implement it <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /></p><p>That might be useful, but it requires a named constructor as the parameter types are the same as with the RGBA constructor.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Fri, 24 Feb 2006 02:14:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Well, just give me the equations and I&#39;ll implement it
</p></div></div><p>
Here you go:</p><p><a href="http://www.easyrgb.com/math.php">http://www.easyrgb.com/math.php</a></p><p>I haven&#39;t read that page at all, but from memory all the ordinary colour conversions are just linear transforms so you could abstract it with a 3x3 matrix for every colour space conversion. Unless you want also to provide support for both linear and exponential scales, but that doesn&#39;t seem to be part of the request!</p><p>EDIT: completely off topic, but while you&#39;re here and because I&#39;ve just been messing around on an OpenGL thingy myself - does OpenLayer prefer GL_ARB_texture_non_power_of_two to GL_ARB/EXT/NV_texture_rectangle where both are available?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Fri, 24 Feb 2006 02:29:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
I haven&#39;t read that page at all, but from memory all the ordinary colour conversions are just linear transforms so you could abstract it with a 3x3 matrix for every colour space conversion.
</p></div></div><p>
This is not the case for HSV and HSL, as H is in fact an angle (0 is red, 0.33 is green, 0.67 is blue and 1 is red again).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Fri, 24 Feb 2006 03:00:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
does OpenLayer prefer GL_ARB_texture_non_power_of_two to GL_ARB/EXT/NV_texture_rectangle where both are available?
</p></div></div><p>
Well, OpenLayer doesn&#39;t support the *_texture_rectangle extensions yet. But since the GL_ARB_texture_non_power_of_two extension doesn&#39;t require using an another texture target it sounds better... especially as no code has to be changed in order to support it. Performance wise I don&#39;t know.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Fri, 24 Feb 2006 03:42:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is an implementation of RGB &lt;-&gt; HLS colourspace conversion code. This particular implementation uses the same scale of units as Allegro&#39;s RGB &lt;-&gt; HSV functions. This is to maintain consistency with Allegro&#39;s functions, but this could be speeded up by making it accept a hue in the range 0..6 instead of 0..360</p><p>hls_to_rgb:</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">#include &lt;math.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;float.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="c">/* hls_to_rgb:</span></td></tr><tr><td class="number">7</td><td><span class="c"> *  Converts from HLS colorspace to RGB values.</span></td></tr><tr><td class="number">8</td><td><span class="c"> *  Taken From Foley &amp; VanDam Fig. 13.37 with a few modifications.</span></td></tr><tr><td class="number">9</td><td><span class="c"> */</span></td></tr><tr><td class="number">10</td><td>&#160;</td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="c">/* The function proper */</span></td></tr><tr><td class="number">13</td><td><span class="k1">void</span> hls_to_rgb <span class="k2">(</span><span class="k1">float</span> h, <span class="k1">float</span> l, <span class="k1">float</span> s, <span class="k1">int</span> <span class="k3">*</span>r, <span class="k1">int</span> <span class="k3">*</span>g, <span class="k1">int</span> <span class="k3">*</span>b<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="k1">float</span> m1, m2<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>   l<span class="k3">*</span><span class="k3">=</span><span class="n">255</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>   <span class="k1">if</span> <span class="k2">(</span>s <span class="k3">&lt;</span> FLT_EPSILON<span class="k2">)</span> <span class="k2">{</span>   <span class="c">/* greyscale */</span></td></tr><tr><td class="number">20</td><td>      <span class="k3">*</span>r <span class="k3">=</span> <span class="k3">*</span>g <span class="k3">=</span> <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>l<span class="k3">+</span><span class="n">0</span>.<span class="n">5f</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>   <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">22</td><td>      <span class="c">/* Work out min and max of the r,g,b sliders */</span></td></tr><tr><td class="number">23</td><td>      m2 <span class="k3">=</span> <span class="k2">(</span>l<span class="k3">&lt;</span><span class="k3">=</span><span class="n">127</span>.<span class="n">5f</span><span class="k2">)</span> ? <span class="k2">(</span>l<span class="k3">+</span><span class="k2">(</span>l<span class="k3">*</span>s<span class="k2">)</span><span class="k2">)</span> <span class="k2">:</span> <span class="k2">(</span>l<span class="k3">+</span><span class="k2">(</span>s<span class="k3">*</span><span class="n">255</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span>l<span class="k3">*</span>s<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>   <span class="c">/* Max RGB value */</span></td></tr><tr><td class="number">24</td><td>      m1 <span class="k3">=</span> l<span class="k3">+</span>l <span class="k3">-</span> m2<span class="k2">;</span>  <span class="c">/* Min RGB value */</span></td></tr><tr><td class="number">25</td><td>    <span class="c">/* l is average of m1 and m2. */</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>      <span class="c">// ex m2 = (l&lt;=0.5f) ? (l+(l*s)) : (l+s - (l*s));</span></td></tr><tr><td class="number">28</td><td>      <span class="c">// ex m1 = 2.0f * l - m2;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>&#160;</td></tr><tr><td class="number">31</td><td>      <span class="c">// m2 = l + (l*s);</span></td></tr><tr><td class="number">32</td><td>      <span class="c">// m1 = l - (l*s);</span></td></tr><tr><td class="number">33</td><td>    <span class="c">// m2-m1 = l + (l*s) - l + (l*s) = 2*(l*s)</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td>&#160;</td></tr><tr><td class="number">36</td><td>      <span class="c">// m2 = l+s - (l*s);</span></td></tr><tr><td class="number">37</td><td>      <span class="c">// m1 = l-s + (l*s);</span></td></tr><tr><td class="number">38</td><td>    <span class="c">// m2-m1 = l+s - (l*s) - l+s - (l*s) = 2*s - 2*(l*s) = 2*(s-l*s)</span></td></tr><tr><td class="number">39</td><td>&#160;</td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>&#160;</td></tr><tr><td class="number">42</td><td>      h <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>h, <span class="n">360</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k3">/</span> <span class="n">60</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>      <span class="k1">if</span> <span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">44</td><td>         h <span class="k3">+</span><span class="k3">=</span> <span class="n">6</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">46</td><td>&#160;</td></tr><tr><td class="number">47</td><td>&#160;</td></tr><tr><td class="number">48</td><td>      m1<span class="k3">+</span><span class="k3">=</span><span class="n">0</span>.<span class="n">5f</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      m2<span class="k3">+</span><span class="k3">=</span><span class="n">0</span>.<span class="n">5f</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>&#160;</td></tr><tr><td class="number">51</td><td>&#160;</td></tr><tr><td class="number">52</td><td>      <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">3</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">53</td><td>         <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">54</td><td>            <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">55</td><td>               <span class="c">/* 0&lt;=h&lt;1 */</span></td></tr><tr><td class="number">56</td><td>               <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">57</td><td>               <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span>h<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>               <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">60</td><td>      <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>               <span class="c">/* 1&lt;=h&lt;2 */</span></td></tr><tr><td class="number">62</td><td>               <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="n">2</span>.<span class="n">0f</span><span class="k3">-</span>h<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>               <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">64</td><td>               <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">65</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">66</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">67</td><td>         <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>            <span class="c">/* 2&lt;=h&lt;3 */</span></td></tr><tr><td class="number">69</td><td>            <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">70</td><td>            <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">71</td><td>            <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>h-2.0f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">73</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">74</td><td>      <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>         <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">5</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">76</td><td>            <span class="k1">if</span><span class="k2">(</span>h <span class="k3">&lt;</span> <span class="n">4</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">77</td><td>               <span class="c">/* 3&lt;=h&lt;4 */</span></td></tr><tr><td class="number">78</td><td>               <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">79</td><td>               <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="n">4</span>.<span class="n">0f</span><span class="k3">-</span>h<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>               <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">81</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">82</td><td>            <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">83</td><td>               <span class="c">/* 4&lt;=h&lt;5 */</span></td></tr><tr><td class="number">84</td><td>               <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span>h-4.0f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">85</td><td>               <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">86</td><td>               <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">87</td><td>            <span class="k2">}</span></td></tr><tr><td class="number">88</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">89</td><td>         <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">90</td><td>            <span class="c">/* 5&lt;=h&lt;6 */</span></td></tr><tr><td class="number">91</td><td>            <span class="k3">*</span>r <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m2<span class="k2">;</span></td></tr><tr><td class="number">92</td><td>            <span class="k3">*</span>g <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>m1<span class="k2">;</span></td></tr><tr><td class="number">93</td><td>            <span class="k3">*</span>b <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>m1<span class="k3">+</span><span class="k2">(</span>m2-m1<span class="k2">)</span><span class="k3">*</span><span class="k2">(</span><span class="n">6</span>.<span class="n">0f</span><span class="k3">-</span>h<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">94</td><td>         <span class="k2">}</span></td></tr><tr><td class="number">95</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">96</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">97</td><td>&#160;</td></tr><tr><td class="number">98</td><td>&#160;</td></tr><tr><td class="number">99</td><td><span class="k2">}</span>   <span class="c">/* End of hls_to_rgb */</span></td></tr></tbody></table></div></div><p>


rgb_to_hls:</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">#include &lt;math.h&gt;</span></td></tr><tr><td class="number">3</td><td><span class="p">#include &lt;float.h&gt;</span></td></tr><tr><td class="number">4</td><td>&#160;</td></tr><tr><td class="number">5</td><td><span class="c">/* rgb_to_hls:</span></td></tr><tr><td class="number">6</td><td><span class="c"> *  Converts an RGB value into the HLS colorspace.</span></td></tr><tr><td class="number">7</td><td><span class="c"> *  Taken From Foley &amp; VanDam Fig. 13.36 with a few modifications.</span></td></tr><tr><td class="number">8</td><td><span class="c"> */</span></td></tr><tr><td class="number">9</td><td><span class="k1">void</span> rgb_to_hls<span class="k2">(</span><span class="k1">int</span> r, <span class="k1">int</span> g, <span class="k1">int</span> b, <span class="k1">float</span> <span class="k3">*</span>h, <span class="k1">float</span> <span class="k3">*</span>l, <span class="k1">float</span> <span class="k3">*</span>s<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>   <span class="k1">float</span> min, max, delta, rc, gc, bc<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>   rc <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>r <span class="k3">/</span> <span class="n">255</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>   gc <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>g <span class="k3">/</span> <span class="n">255</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>   bc <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>b <span class="k3">/</span> <span class="n">255</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>&#160;</td></tr><tr><td class="number">17</td><td>   max <span class="k3">=</span> MAX<span class="k2">(</span>rc, MAX<span class="k2">(</span>gc, bc<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>   min <span class="k3">=</span> MIN<span class="k2">(</span>rc, MIN<span class="k2">(</span>gc, bc<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>   <span class="k3">*</span>l <span class="k3">=</span> <span class="k2">(</span>max<span class="k3">+</span>min<span class="k2">)</span><span class="k3">/</span><span class="n">2</span>.<span class="n">0f</span><span class="k2">;</span>   <span class="c">/* L is the average of maximum and minimum r,g,b */</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>   delta <span class="k3">=</span> max <span class="k3">-</span> min<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>   <span class="c">// note: if using ints, will not need this epsilon thing.</span></td></tr><tr><td class="number">25</td><td>   <span class="c">// we could do the divide by 255 AFTER we work out Delta.</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td>   <span class="k1">if</span> <span class="k2">(</span>delta<span class="k3">&lt;</span>FLT_EPSILON<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">28</td><td>      <span class="c">/* Somewhere along the centre axis of the double-hex-cone (s==0) */</span></td></tr><tr><td class="number">29</td><td>      <span class="k3">*</span>s <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>        <span class="c">/* color has no saturation */</span></td></tr><tr><td class="number">30</td><td>      <span class="k3">*</span>h <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>        <span class="c">/* color has no hue */</span></td></tr><tr><td class="number">31</td><td>&#160;</td></tr><tr><td class="number">32</td><td>   <span class="k2">}</span> <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">33</td><td>&#160;</td></tr><tr><td class="number">34</td><td>      <span class="c">/* Calculate Saturation */</span></td></tr><tr><td class="number">35</td><td>      <span class="k3">*</span>s <span class="k3">=</span> <span class="k2">(</span><span class="k3">*</span>l<span class="k3">&lt;</span><span class="k3">=</span><span class="n">0</span>.<span class="n">5f</span><span class="k2">)</span> ? <span class="k2">(</span>delta<span class="k3">/</span><span class="k2">(</span>max<span class="k3">+</span>min<span class="k2">)</span><span class="k2">)</span> <span class="k2">:</span> <span class="k2">(</span>delta<span class="k3">/</span><span class="k2">(</span><span class="n">2</span>.<span class="n">0f</span><span class="k3">-</span><span class="k2">(</span>max<span class="k3">+</span>min<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">36</td><td>&#160;</td></tr><tr><td class="number">37</td><td>&#160;</td></tr><tr><td class="number">38</td><td>      <span class="c">/* Calculate Hue */</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">if</span> <span class="k2">(</span>rc <span class="k3">=</span><span class="k3">=</span> max<span class="k2">)</span></td></tr><tr><td class="number">40</td><td>         <span class="k3">*</span>h <span class="k3">=</span> <span class="k2">(</span>gc-bc<span class="k2">)</span> <span class="k3">/</span> delta<span class="k2">;</span>  <span class="c">/* Resulting color between yellow &amp; magenta */</span></td></tr><tr><td class="number">41</td><td>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>gc <span class="k3">=</span><span class="k3">=</span> max<span class="k2">)</span></td></tr><tr><td class="number">42</td><td>         <span class="k3">*</span>h <span class="k3">=</span> <span class="n">2</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="k2">(</span>bc-rc<span class="k2">)</span> <span class="k3">/</span> delta<span class="k2">;</span>  <span class="c">/* Resulting color between cyan &amp; yellow */</span></td></tr><tr><td class="number">43</td><td>      <span class="k1">else</span> <span class="c">/* if (bc == max) */</span></td></tr><tr><td class="number">44</td><td>         <span class="k3">*</span>h <span class="k3">=</span> <span class="n">4</span>.<span class="n">0f</span> <span class="k3">+</span> <span class="k2">(</span>rc-gc<span class="k2">)</span> <span class="k3">/</span> delta<span class="k2">;</span>  <span class="c">/* Resulting color between magenta &amp; cyan */</span></td></tr><tr><td class="number">45</td><td>&#160;</td></tr><tr><td class="number">46</td><td>      <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>h <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">)</span></td></tr><tr><td class="number">47</td><td>         <span class="k3">*</span>h <span class="k3">+</span><span class="k3">=</span> <span class="n">6</span>.<span class="n">0f</span><span class="k2">;</span>   <span class="c">/* Make sure hue is non-negative */</span></td></tr><tr><td class="number">48</td><td>&#160;</td></tr><tr><td class="number">49</td><td>      <span class="k3">*</span>h <span class="k3">*</span><span class="k3">=</span> <span class="n">60</span>.<span class="n">0f</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>&#160;</td></tr><tr><td class="number">52</td><td><span class="k2">}</span>   <span class="c">/* End of rgb_to_hls */</span></td></tr></tbody></table></div></div><p>

If you want to convert a float value from 0..1 to an int value from 0..0xff, then use the following macro</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define ap01FTO0255INT(fl) ((int)(fl * 255.0f + 0.5f))</span>
</pre></div></div><p>

For converting a foat value from 0..360 to an int value from 0..0x600, use this:</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#define ap0360FTO01536INT(fl) ((int)(fl * 1536.0f / 360.0f + 0.5f))  /* 0x600 = 1536 */</span>
</pre></div></div><p>
Note that because Hue is a cyclic paramater, the range of conversion is 0..0x600 rather than 0..0x5FF . However, due to the nature of the input values (the nature being that they are only 8-bit RGB values), no likely set of inputs to rgb_to_hls() (or for that matter, rgb_to_hsv()) is going to yield a value greater than 0x5FF. The hue wheel is divided into six segments, and each segment can produce 256 discrete values with 8-bit RGB colour. This means that ((256*6)-1) / (256*6) * 360 = 359.765625 (which is the maximum value of H that the function can yield for 8-bit RGB values), and plugging in 359.765625 to the macro above gives 1535.5, which when converted to a hexadecimal int, is rounded down to 0x5FF</p><p>I have implemented much faster versions of RGB &lt;-&gt; HLS and RGB &lt;-&gt; HSV, that takes the saturation and value as chars, and the hue as a short (no floats for the paramaters, but it still uses floats internally). This code can be found in the sourcecode of my <a href="http://www.allegro.cc/depot/ChromaPlas/">ChromaPlas screensaver</a> which also demonstrates a nice effect and shows the difference between HSV and HLS.</p><p>For further reading, see:<br /><a href="http://en.wikipedia.org/wiki/HSV_color_space">http://en.wikipedia.org/wiki/HSV_color_space</a><br /><a href="http://en.wikipedia.org/wiki/HSL_color_space">http://en.wikipedia.org/wiki/HSL_color_space</a></p><p>AE.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Andrei Ellman)</author>
		<pubDate>Fri, 24 Feb 2006 04:26:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Woah there!<br />I&#39;m not looking for a whole new object to maintain, Just a nice little one-way conversion utility-function.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span> Hsva<span class="k2">(</span> <span class="k1">float</span> hue, <span class="k1">float</span> saturation, <span class="k1">float</span> value, <span class="k1">float</span> alpha <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">int</span> r,g,b <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/hsv_to_rgb" target="_blank"><span class="a">hsv_to_rgb</span></a><span class="k2">(</span>hue, saturation, value, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b<span class="k2">)</span><span class="k2">;</span>

   <span class="k1">return</span> Rgba<span class="k2">(</span> r, g, b, <span class="k1">int</span><span class="k2">(</span>alpha<span class="k2">)</span> <span class="k3">*</span> <span class="n">255</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">//I'm rusty with c++! Does this return an int?</span>
<span class="k2">}</span>

<span class="k1">int</span> Hlsa<span class="k2">(</span> <span class="k1">float</span> hue, <span class="k1">float</span> lightness, <span class="k1">float</span> saturation, <span class="k1">float</span> alpha <span class="k3">=</span> <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span>
<span class="k2">{</span>
   <span class="k1">return</span> Hsva<span class="k2">(</span> hue, saturation, lightness <span class="k3">*</span> <span class="n">0</span>.<span class="n">5f</span>, alpha<span class="k2">)</span><span class="k2">;</span> <span class="c">//wrong wrong wrong wrong wrong!</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (fuzinavl)</author>
		<pubDate>Sat, 25 Feb 2006 04:43:59 +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;m rusty with c++! Does this return an int?
</p></div></div><p>
It&#39;s a constructor call which creates a new Rgba object. So the return value should be Rgba.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sat, 25 Feb 2006 05:47:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>yay <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /></p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>Rgba Hsva<span class="k2">(</span> <span class="k1">float</span> hue, <span class="k1">float</span> saturation, <span class="k1">float</span> value, <span class="k1">float</span> alpha <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span>                     <span class="c">//  h 0..6   s 0..1   v 0..1</span></td></tr><tr><td class="number">3</td><td>   <span class="k1">int</span> r,g,b <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>   <a href="http://www.allegro.cc/manual/hsv_to_rgb" target="_blank"><span class="a">hsv_to_rgb</span></a><span class="k2">(</span>hue<span class="k3">*</span><span class="n">60</span>.<span class="n">0f</span>, saturation, value, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td>   <span class="k1">return</span> Rgba<span class="k2">(</span> r, g, b, <span class="k1">int</span><span class="k2">(</span>alpha<span class="k2">)</span> <span class="k3">*</span> <span class="n">255</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td><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="c">//Rgba Hsla( float hue, float saturation, float lightness, float alpha = 1.0f){}</span></td></tr><tr><td class="number">10</td><td><span class="c">//not implemented</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>Setup::SetupScreen<span class="k2">(</span> <span class="n">800</span>,<span class="n">600</span>, WINDOWED <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td><span class="k1">while</span><span class="k2">(</span> <span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span> <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>  Canvas::Fill<span class="k2">(</span> Hsva<span class="k2">(</span><span class="k1">float</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a><span class="k2">)</span> <span class="k3">*</span> <span class="n">6</span>.<span class="n">0f</span> <span class="k3">/</span> <span class="n">800</span>.<span class="n">0f</span>, <span class="k1">float</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a><span class="k2">)</span><span class="k3">/</span><span class="n">600</span>.<span class="n">0f</span> , <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  ol::Ellipse<span class="k2">(</span><a href="http://www.allegro.cc/manual/mouse_x" target="_blank"><span class="a">mouse_x</span></a>,<a href="http://www.allegro.cc/manual/mouse_y" target="_blank"><span class="a">mouse_y</span></a>,<span class="n">10</span>,<span class="n">10</span><span class="k2">)</span>.Draw<span class="k2">(</span>Rgba::WHITE<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>  Canvas::Refresh<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  <a href="http://www.allegro.cc/manual/rest" target="_blank"><span class="a">rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</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><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> works!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (fuzinavl)</author>
		<pubDate>Sun, 26 Feb 2006 10:35:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
int(alpha) * 255
</p></div></div><p>
I guess you mean:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">int</span><span class="k2">(</span>alpha <span class="k3">*</span> <span class="n">255</span><span class="k2">)</span>
</pre></div></div><p>
Or otherwise the alpha would be rounded either to one or zero.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sun, 26 Feb 2006 18:02:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks all!  <br /><b>Attached</b> is the hue utility 1.0. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (fuzinavl)</author>
		<pubDate>Sun, 26 Feb 2006 22:08:02 +0000</pubDate>
	</item>
</rss>
