<!-- Copyright 2008 Lubomir Bourdev and Hailin Jin

     Distributed under the Boost Software License, Version 1.0.
     (See accompanying file LICENSE_1_0.txt or copy at
     http://www.boost.org/LICENSE_1_0.txt)
  -->

<!--
    Copyright 2005-2007 Adobe Systems Incorporated
    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
    or a copy at http://stlab.adobe.com/licenses.html)

    Some files are held under additional license.
    Please see "http://stlab.adobe.com/licenses.html" for more information.
-->

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

<head>
    <TITLE>Generic Image Library: color_element_type, color_element_reference_type, color_element_const_reference_type, get_color, contains_color</TITLE>
    <META HTTP-EQUIV="content-type" CONTENT="text/html;charset=ISO-8859-1"/>
    <LINK TYPE="text/css" REL="stylesheet" HREF="adobe_source.css"/>
</head>
<body>
<table border="0" cellspacing="0" cellpadding="0" style='width: 100%; margin: 0; padding: 0'><tr>
<td width="100%" valign="top" style='padding-left: 10px; padding-right: 10px; padding-bottom: 10px'>
<div class="qindex"><a class="qindex" href="index.html">Modules</a> 
                  | <a class="qindex" href="classes.html">Alphabetical List</a> 
                  | <a class="qindex" href="annotated.html">Class List</a> 
                  | <a class="qindex" href="dirs.html">Directories</a> 
                  | <a class="qindex" href="files.html">File List</a> 
                  | <a class="qindex" href="../index.html">GIL Home Page</a> 
</div>
<!-- End Header -->
<!-- Generated by Doxygen 1.5.6 -->
<div class="contents">
<h1>color_element_type, color_element_reference_type, color_element_const_reference_type, get_color, contains_color<br>
<small>
[<a class="el" href="g_i_l_0105.html">Algorithms and Utility Functions</a>]</small>
</h1><hr><a name="_details"></a><h2>Detailed Description</h2>
Support for accessing the elements of a color base by color name. 
<p>
get_color: Named channel accessors<p>
Example: A function that takes a generic <a class="el" href="g_i_l_0599.html" title="Represents a pixel value (a container of channels). Models: HomogeneousColorBaseValueConcept...">pixel</a> containing a red channel and sets it to 100%:<p>
<div class="fragment"><pre class="fragment"><span class="keyword">template</span> &lt;<span class="keyword">typename</span> Pixel&gt;
<span class="keywordtype">void</span> set_red_to_max(Pixel&amp; pixel) {
    boost::function_requires&lt;MutablePixelConcept&lt;Pixel&gt; &gt;();
    BOOST_STATIC_ASSERT((contains_color&lt;Pixel, red_t&gt;::value));

    <span class="keyword">typedef</span> <span class="keyword">typename</span> color_element_type&lt;Pixel, red_t&gt;::type red_channel_t;
    <a class="code" href="g_i_l_0106.html#gab1205781ba628ca806c47a51f40f5f6" title="Mutable accessor to the element associated with a given color name.">get_color</a>(pixel, red_t()) = channel_traits&lt;red_channel_t&gt;::max_value(); 
}
</pre></div> 
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Classes</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="g_i_l_0447.html">contains_color</a></td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">A predicate metafunction determining whether a given color base contains a given color.  <a href="g_i_l_0447.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="g_i_l_0444.html">color_element_type</a></td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Specifies the type of the element associated with a given color tag.  <a href="g_i_l_0444.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="g_i_l_0442.html">color_element_reference_type</a></td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Specifies the return type of the mutable element accessor by color name, get_color(color_base, Color());.  <a href="g_i_l_0442.html#_details">More...</a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="g_i_l_0440.html">color_element_const_reference_type</a></td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Specifies the return type of the constant element accessor by color name, get_color(color_base, Color());.  <a href="g_i_l_0440.html#_details">More...</a><br></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="gab1205781ba628ca806c47a51f40f5f6"></a><!-- doxytag: member="ColorBaseAlgorithmColor::get_color" ref="gab1205781ba628ca806c47a51f40f5f6" args="(ColorBase &amp;cb, Color=Color())" -->
template&lt;typename ColorBase, typename Color&gt; </td></tr>
<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">color_element_reference_type<br>
&lt; ColorBase, Color &gt;::type&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="g_i_l_0106.html#gab1205781ba628ca806c47a51f40f5f6">get_color</a> (ColorBase &amp;cb, Color=Color())</td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Mutable accessor to the element associated with a given color name. <br></td></tr>
<tr><td class="memTemplParams" nowrap colspan="2"><a class="anchor" name="g4b9fe0ec8239047ac50842800de872b9"></a><!-- doxytag: member="ColorBaseAlgorithmColor::get_color" ref="g4b9fe0ec8239047ac50842800de872b9" args="(const ColorBase &amp;cb, Color=Color())" -->
template&lt;typename ColorBase, typename Color&gt; </td></tr>
<tr><td class="memTemplItemLeft" nowrap align="right" valign="top">color_element_const_reference_type<br>
&lt; ColorBase, Color &gt;::type&nbsp;</td><td class="memTemplItemRight" valign="bottom"><a class="el" href="g_i_l_0106.html#g4b9fe0ec8239047ac50842800de872b9">get_color</a> (const ColorBase &amp;cb, Color=Color())</td></tr>

<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Constant accessor to the element associated with a given color name. <br></td></tr>
</table>
</div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sat May 2 13:50:17 2009 for Generic Image Library by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.6 </small></address>
</body>
</html>
