1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
<!-- 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: packed_pixel.hpp Source File</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="navpath"><a class="el" href="g_i_l_0076.html">boost</a> » <a class="el" href="g_i_l_0079.html">gil</a>
</div>
<div class="contents">
<h1>packed_pixel.hpp</h1><a href="g_i_l_0240.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
<a name="l00002"></a>00002 <span class="comment"> Copyright 2005-2007 Adobe Systems Incorporated</span>
<a name="l00003"></a>00003 <span class="comment"> </span>
<a name="l00004"></a>00004 <span class="comment"> Use, modification and distribution are subject to the Boost Software License,</span>
<a name="l00005"></a>00005 <span class="comment"> Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at</span>
<a name="l00006"></a>00006 <span class="comment"> http://www.boost.org/LICENSE_1_0.txt).</span>
<a name="l00007"></a>00007 <span class="comment"></span>
<a name="l00008"></a>00008 <span class="comment"> See http://opensource.adobe.com/gil for most recent version including documentation.</span>
<a name="l00009"></a>00009 <span class="comment">*/</span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="comment">/*************************************************************************************************/</span>
<a name="l00012"></a>00012
<a name="l00013"></a>00013 <span class="preprocessor">#ifndef GIL_PACKED_PIXEL_H</span>
<a name="l00014"></a>00014 <span class="preprocessor"></span><span class="preprocessor">#define GIL_PACKED_PIXEL_H</span>
<a name="l00015"></a>00015 <span class="preprocessor"></span>
<a name="l00024"></a>00024
<a name="l00025"></a>00025 <span class="preprocessor">#include <functional></span>
<a name="l00026"></a>00026 <span class="preprocessor">#include <boost/utility/enable_if.hpp></span>
<a name="l00027"></a>00027 <span class="preprocessor">#include <boost/mpl/bool.hpp></span>
<a name="l00028"></a>00028 <span class="preprocessor">#include <boost/mpl/front.hpp></span>
<a name="l00029"></a>00029 <span class="preprocessor">#include "<a class="code" href="g_i_l_0094.html" title="GIL configuration file.">gil_config.hpp</a>"</span>
<a name="l00030"></a>00030 <span class="preprocessor">#include "<a class="code" href="pixel_8hpp.html" title="pixel class and related utilities">pixel.hpp</a>"</span>
<a name="l00031"></a>00031
<a name="l00032"></a>00032 <span class="keyword">namespace </span>boost { <span class="keyword">namespace </span>gil {
<a name="l00033"></a>00033
<a name="l00037"></a>00037
<a name="l00056"></a>00056
<a name="l00057"></a>00057
<a name="l00058"></a>00058
<a name="l00059"></a>00059 <span class="keyword">template</span> <<span class="keyword">typename</span> BitField, <span class="comment">// A type that holds the bits of the pixel. Typically an integral type, like boost::uint16_t</span>
<a name="l00060"></a>00060 <span class="keyword">typename</span> ChannelRefVec, <span class="comment">// An MPL vector whose elements are packed channels. They must be constructible from BitField. GIL uses packed_channel_reference</span>
<a name="l00061"></a>00061 <span class="keyword">typename</span> Layout> <span class="comment">// Layout defining the color space and ordering of the channels. Example value: rgb_layout_t</span>
<a name="l00062"></a><a class="code" href="g_i_l_0595.html">00062</a> <span class="keyword">struct </span><a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a> {
<a name="l00063"></a>00063 BitField _bitfield;
<a name="l00064"></a>00064
<a name="l00065"></a>00065 <span class="keyword">typedef</span> Layout layout_t;
<a name="l00066"></a>00066 <span class="keyword">typedef</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">value_type</a>;
<a name="l00067"></a>00067 <span class="keyword">typedef</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">value_type</a>& <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">reference</a>;
<a name="l00068"></a>00068 <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">value_type</a>& <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">const_reference</a>;
<a name="l00069"></a>00069
<a name="l00070"></a>00070 BOOST_STATIC_CONSTANT(<span class="keywordtype">bool</span>, is_mutable = <a class="code" href="g_i_l_0429.html" title="Traits for channels. Contains the following members:.">channel_traits</a><<span class="keyword">typename</span> mpl::front<ChannelRefVec>::type>::is_mutable);
<a name="l00071"></a>00071
<a name="l00072"></a>00072 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(){}
<a name="l00073"></a>00073 <span class="keyword">explicit</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keyword">const</span> BitField& bitfield) : _bitfield(bitfield) {}
<a name="l00074"></a>00074
<a name="l00075"></a>00075 <span class="comment">// Construct from another compatible pixel type</span>
<a name="l00076"></a>00076 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keyword">const</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>& p) : _bitfield(p.<a class="code" href="g_i_l_0595.html#be60dad4ae2eb0daf0d399e66fc2c11a">_bitfield</a>) {}
<a name="l00077"></a>00077 <span class="keyword">template</span> <<span class="keyword">typename</span> P> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keyword">const</span> P& p, <span class="keyword">typename</span> enable_if_c<is_pixel<P>::value>::type* d=0) { check_compatible<P>(); static_copy(p,*<span class="keyword">this</span>); }
<a name="l00078"></a>00078 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keywordtype">int</span> chan0, <span class="keywordtype">int</span> chan1) : _bitfield(0) {
<a name="l00079"></a>00079 BOOST_STATIC_ASSERT((<a class="code" href="g_i_l_0581.html" title="Returns the number of channels of a pixel-based GIL construct.">num_channels<packed_pixel>::value</a>==2));
<a name="l00080"></a>00080 at_c<0>(*this)=chan0; at_c<1>(*this)=chan1;
<a name="l00081"></a>00081 }
<a name="l00082"></a>00082 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keywordtype">int</span> chan0, <span class="keywordtype">int</span> chan1, <span class="keywordtype">int</span> chan2) : _bitfield(0) {
<a name="l00083"></a>00083 BOOST_STATIC_ASSERT((<a class="code" href="g_i_l_0581.html" title="Returns the number of channels of a pixel-based GIL construct.">num_channels<packed_pixel>::value</a>==3));
<a name="l00084"></a>00084 at_c<0>(*this)=chan0; at_c<1>(*this)=chan1; at_c<2>(*this)=chan2;
<a name="l00085"></a>00085 }
<a name="l00086"></a>00086 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keywordtype">int</span> chan0, <span class="keywordtype">int</span> chan1, <span class="keywordtype">int</span> chan2, <span class="keywordtype">int</span> chan3) : _bitfield(0) {
<a name="l00087"></a>00087 BOOST_STATIC_ASSERT((<a class="code" href="g_i_l_0581.html" title="Returns the number of channels of a pixel-based GIL construct.">num_channels<packed_pixel>::value</a>==4));
<a name="l00088"></a>00088 at_c<0>(*this)=chan0; at_c<1>(*this)=chan1; at_c<2>(*this)=chan2; at_c<3>(*this)=chan3;
<a name="l00089"></a>00089 }
<a name="l00090"></a>00090 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>(<span class="keywordtype">int</span> chan0, <span class="keywordtype">int</span> chan1, <span class="keywordtype">int</span> chan2, <span class="keywordtype">int</span> chan3, <span class="keywordtype">int</span> chan4) : _bitfield(0) {
<a name="l00091"></a>00091 BOOST_STATIC_ASSERT((<a class="code" href="g_i_l_0581.html" title="Returns the number of channels of a pixel-based GIL construct.">num_channels<packed_pixel>::value</a>==5));
<a name="l00092"></a>00092 at_c<0>(*this)=chan0; at_c<1>(*this)=chan1; at_c<2>(*this)=chan2; at_c<3>(*this)=chan3; at_c<4>(*this)=chan4;
<a name="l00093"></a>00093 }
<a name="l00094"></a>00094
<a name="l00095"></a>00095 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>& operator=(<span class="keyword">const</span> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>& p) { _bitfield=p.<a class="code" href="g_i_l_0595.html#be60dad4ae2eb0daf0d399e66fc2c11a">_bitfield</a>; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
<a name="l00096"></a>00096
<a name="l00097"></a>00097 <span class="keyword">template</span> <<span class="keyword">typename</span> P> <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>& operator=(<span class="keyword">const</span> P& p) { assign(p, mpl::bool_<is_pixel<P>::value>()); <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
<a name="l00098"></a>00098 <span class="keyword">template</span> <<span class="keyword">typename</span> P> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> P& p)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> equal(p, mpl::bool_<is_pixel<P>::value>()); }
<a name="l00099"></a>00099
<a name="l00100"></a>00100 <span class="keyword">template</span> <<span class="keyword">typename</span> P> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> P& p)<span class="keyword"> const </span>{ <span class="keywordflow">return</span> !(*<span class="keyword">this</span>==p); }
<a name="l00101"></a>00101
<a name="l00102"></a>00102 <span class="keyword">private</span>:
<a name="l00103"></a>00103 <span class="keyword">template</span> <<span class="keyword">typename</span> Pixel> <span class="keyword">static</span> <span class="keywordtype">void</span> check_compatible() { gil_function_requires<PixelsCompatibleConcept<Pixel,packed_pixel> >(); }
<a name="l00104"></a>00104 <span class="keyword">template</span> <<span class="keyword">typename</span> Pixel> <span class="keywordtype">void</span> assign(<span class="keyword">const</span> Pixel& p, mpl::true_) { check_compatible<Pixel>(); static_copy(p,*<span class="keyword">this</span>); }
<a name="l00105"></a>00105 <span class="keyword">template</span> <<span class="keyword">typename</span> Pixel> <span class="keywordtype">bool</span> equal(<span class="keyword">const</span> Pixel& p, mpl::true_)<span class="keyword"> const </span>{ check_compatible<Pixel>(); <span class="keywordflow">return</span> static_equal(*<span class="keyword">this</span>,p); }
<a name="l00106"></a>00106
<a name="l00107"></a>00107 <span class="comment">// Support for assignment/equality comparison of a channel with a grayscale pixel</span>
<a name="l00108"></a>00108 <span class="keyword">static</span> <span class="keywordtype">void</span> check_gray() { BOOST_STATIC_ASSERT((is_same<typename Layout::color_space_t, gray_t>::value)); }
<a name="l00109"></a>00109 <span class="keyword">template</span> <<span class="keyword">typename</span> Channel> <span class="keywordtype">void</span> assign(<span class="keyword">const</span> Channel& chan, mpl::false_) { check_gray(); at_c<0>(*this)=chan; }
<a name="l00110"></a>00110 <span class="keyword">template</span> <<span class="keyword">typename</span> Channel> <span class="keywordtype">bool</span> equal (<span class="keyword">const</span> Channel& chan, mpl::false_)<span class="keyword"> const </span>{ check_gray(); <span class="keywordflow">return</span> at_c<0>(*this)==chan; }
<a name="l00111"></a>00111 <span class="keyword">public</span>:
<a name="l00112"></a>00112 <a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a>& operator= (<span class="keywordtype">int</span> chan) { check_gray(); at_c<0>(*this)=chan; <span class="keywordflow">return</span> *<span class="keyword">this</span>; }
<a name="l00113"></a>00113 <span class="keywordtype">bool</span> operator==(<span class="keywordtype">int</span> chan)<span class="keyword"> const </span>{ check_gray(); <span class="keywordflow">return</span> at_c<0>(*this)==chan; }
<a name="l00114"></a>00114 };
<a name="l00115"></a>00115
<a name="l00117"></a>00117 <span class="comment">// ColorBasedConcept</span>
<a name="l00119"></a>00119 <span class="comment"></span>
<a name="l00120"></a>00120 <span class="keyword">template</span> <<span class="keyword">typename</span> BitField, <span class="keyword">typename</span> ChannelRefVec, <span class="keyword">typename</span> Layout, <span class="keywordtype">int</span> K>
<a name="l00121"></a>00121 <span class="keyword">struct </span>kth_element_type<<a class="code" href="g_i_l_0595.html" title="Heterogeneous pixel value whose channel references can be constructed from the pixel...">packed_pixel</a><BitField,ChannelRefVec,Layout>,K> : <span class="keyword">public</span> mpl::at_c<ChannelRefVec,K> {};
<a name="l00122"></a>00122
<a name="l00123"></a>00123 <span class="keyword">template</span> <<span class="keyword">typename</span> BitField, <span class="keyword">typename</span> ChannelRefVec, <span class="keyword">typename</span> Layout, <span class="keywordtype">int</span> K>
<a name="l00124"></a>00124 <span class="keyword">struct </span>kth_element_reference_type<packed_pixel<BitField,ChannelRefVec,Layout>,K> : <span class="keyword">public</span> mpl::at_c<ChannelRefVec,K> {};
<a name="l00125"></a>00125
<a name="l00126"></a>00126 <span class="keyword">template</span> <<span class="keyword">typename</span> BitField, <span class="keyword">typename</span> ChannelRefVec, <span class="keyword">typename</span> Layout, <span class="keywordtype">int</span> K>
<a name="l00127"></a>00127 <span class="keyword">struct </span>kth_element_const_reference_type<packed_pixel<BitField,ChannelRefVec,Layout>,K> {
<a name="l00128"></a>00128 <span class="keyword">typedef</span> <span class="keyword">typename</span> channel_traits<typename mpl::at_c<ChannelRefVec,K>::type>::const_reference type;
<a name="l00129"></a>00129 };
<a name="l00130"></a>00130
<a name="l00131"></a>00131 <span class="keyword">template</span> <<span class="keywordtype">int</span> K, <span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> L> <span class="keyword">inline</span>
<a name="l00132"></a>00132 <span class="keyword">typename</span> kth_element_reference_type<packed_pixel<P,C,L>, K>::type
<a name="l00133"></a>00133 at_c(packed_pixel<P,C,L>& p) {
<a name="l00134"></a>00134 <span class="keywordflow">return</span> <span class="keyword">typename</span> kth_element_reference_type<packed_pixel<P,C,L>, K>::type(&p._bitfield);
<a name="l00135"></a>00135 }
<a name="l00136"></a>00136
<a name="l00137"></a>00137 <span class="keyword">template</span> <<span class="keywordtype">int</span> K, <span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> L> <span class="keyword">inline</span>
<a name="l00138"></a>00138 <span class="keyword">typename</span> kth_element_const_reference_type<packed_pixel<P,C,L>, K>::type
<a name="l00139"></a>00139 at_c(<span class="keyword">const</span> packed_pixel<P,C,L>& p) {
<a name="l00140"></a>00140 <span class="keywordflow">return</span> <span class="keyword">typename</span> kth_element_const_reference_type<packed_pixel<P,C,L>, K>::type(&p._bitfield);
<a name="l00141"></a>00141 }
<a name="l00142"></a>00142
<a name="l00144"></a>00144 <span class="comment">// PixelConcept</span>
<a name="l00146"></a>00146 <span class="comment"></span>
<a name="l00147"></a>00147 <span class="comment">// Metafunction predicate that flags packed_pixel as a model of PixelConcept. Required by PixelConcept</span>
<a name="l00148"></a>00148 <span class="keyword">template</span> <<span class="keyword">typename</span> BitField, <span class="keyword">typename</span> ChannelRefVec, <span class="keyword">typename</span> Layout>
<a name="l00149"></a>00149 <span class="keyword">struct </span>is_pixel<packed_pixel<BitField,ChannelRefVec,Layout> > : <span class="keyword">public</span> mpl::true_{};
<a name="l00150"></a>00150
<a name="l00152"></a>00152 <span class="comment">// PixelBasedConcept</span>
<a name="l00154"></a>00154 <span class="comment"></span>
<a name="l00155"></a>00155 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> Layout>
<a name="l00156"></a>00156 <span class="keyword">struct </span>color_space_type<packed_pixel<P,C,Layout> > {
<a name="l00157"></a>00157 <span class="keyword">typedef</span> <span class="keyword">typename</span> Layout::color_space_t type;
<a name="l00158"></a>00158 };
<a name="l00159"></a>00159
<a name="l00160"></a>00160 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> Layout>
<a name="l00161"></a>00161 <span class="keyword">struct </span>channel_mapping_type<packed_pixel<P,C,Layout> > {
<a name="l00162"></a>00162 <span class="keyword">typedef</span> <span class="keyword">typename</span> Layout::channel_mapping_t type;
<a name="l00163"></a>00163 };
<a name="l00164"></a>00164
<a name="l00165"></a>00165 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> Layout>
<a name="l00166"></a>00166 <span class="keyword">struct </span>is_planar<packed_pixel<P,C,Layout> > : mpl::false_ {};
<a name="l00167"></a>00167
<a name="l00168"></a>00168
<a name="l00174"></a>00174
<a name="l00179"></a>00179
<a name="l00180"></a>00180 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> L>
<a name="l00181"></a>00181 <span class="keyword">struct </span>iterator_is_mutable<packed_pixel<P,C,L>*> : <span class="keyword">public</span> mpl::bool_<packed_pixel<P,C,L>::is_mutable> {};
<a name="l00182"></a>00182 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> L>
<a name="l00183"></a>00183 <span class="keyword">struct </span>iterator_is_mutable<const packed_pixel<P,C,L>*> : <span class="keyword">public</span> mpl::false_ {};
<a name="l00184"></a>00184
<a name="l00185"></a>00185
<a name="l00186"></a>00186
<a name="l00187"></a>00187 } } <span class="comment">// namespace boost::gil</span>
<a name="l00188"></a>00188
<a name="l00189"></a>00189 <span class="keyword">namespace </span>boost {
<a name="l00190"></a>00190 <span class="keyword">template</span> <<span class="keyword">typename</span> P, <span class="keyword">typename</span> C, <span class="keyword">typename</span> L>
<a name="l00191"></a>00191 <span class="keyword">struct </span>has_trivial_constructor<gil::packed_pixel<P,C,L> > : <span class="keyword">public</span> has_trivial_constructor<P> {};
<a name="l00192"></a>00192 }
<a name="l00193"></a>00193 <span class="preprocessor">#endif</span>
</pre></div></div>
<hr size="1"><address style="text-align: right;"><small>Generated on Sat May 2 13:50:14 2009 for Generic Image Library by
<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>
|