channel.html 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  6. <title>Channel - Boost.GIL documentation</title>
  7. <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
  8. <link rel="stylesheet" href="../_static/style.css" type="text/css" />
  9. <script type="text/javascript">
  10. var DOCUMENTATION_OPTIONS = {
  11. URL_ROOT: '../',
  12. VERSION: '',
  13. COLLAPSE_MODINDEX: false,
  14. FILE_SUFFIX: '.html'
  15. };
  16. </script>
  17. <script type="text/javascript" src="../_static/jquery.js"></script>
  18. <script type="text/javascript" src="../_static/underscore.js"></script>
  19. <script type="text/javascript" src="../_static/doctools.js"></script>
  20. <link rel="index" title="Index" href="../genindex.html" />
  21. <link rel="search" title="Search" href="../search.html" />
  22. <link rel="top" title="Boost.GIL documentation" href="../index.html" />
  23. <link rel="up" title="Design Guide" href="index.html" />
  24. <link rel="next" title="Color Space and Layout" href="color_space.html" />
  25. <link rel="prev" title="Point" href="point.html" />
  26. </head>
  27. <body>
  28. <div class="header">
  29. <table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
  30. "header">
  31. <tr>
  32. <td valign="top" width="300">
  33. <h3><a href="../index.html"><img
  34. alt="C++ Boost" src="../_static/gil.png" border="0"></a></h3>
  35. </td>
  36. <td >
  37. <h1 align="center"><a href="../index.html"></a></h1>
  38. </td>
  39. <td>
  40. <div id="searchbox" style="display: none">
  41. <form class="search" action="../search.html" method="get">
  42. <input type="text" name="q" size="18" />
  43. <input type="submit" value="Search" />
  44. <input type="hidden" name="check_keywords" value="yes" />
  45. <input type="hidden" name="area" value="default" />
  46. </form>
  47. </div>
  48. <script type="text/javascript">$('#searchbox').show(0);</script>
  49. </td>
  50. </tr>
  51. </table>
  52. </div>
  53. <hr/>
  54. <div class="content">
  55. <div class="navbar" style="text-align:right;">
  56. <a class="prev" title="Point" href="point.html"><img src="../_static/prev.png" alt="prev"/></a>
  57. <a class="up" title="Design Guide" href="index.html"><img src="../_static/up.png" alt="up"/></a>
  58. <a class="next" title="Color Space and Layout" href="color_space.html"><img src="../_static/next.png" alt="next"/></a>
  59. </div>
  60. <div class="section" id="channel">
  61. <h1>Channel</h1>
  62. <div class="contents local topic" id="contents">
  63. <ul class="simple">
  64. <li><a class="reference internal" href="#overview" id="id1">Overview</a></li>
  65. <li><a class="reference internal" href="#models" id="id2">Models</a></li>
  66. <li><a class="reference internal" href="#algorithms" id="id3">Algorithms</a></li>
  67. </ul>
  68. </div>
  69. <div class="section" id="overview">
  70. <h2><a class="toc-backref" href="#id1">Overview</a></h2>
  71. <p>A channel indicates the intensity of a color component (for example, the red
  72. channel in an RGB pixel). Typical channel operations are getting, comparing
  73. and setting the channel values. Channels have associated minimum and maximum
  74. value. GIL channels model the following concept:</p>
  75. <div class="highlight-cpp"><div class="highlight"><pre><span class="n">concept</span> <span class="n">ChannelConcept</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">EqualityComparable</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span>
  76. <span class="p">{</span>
  77. <span class="k">typename</span> <span class="n">value_type</span> <span class="o">=</span> <span class="n">T</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::value_type to access it</span>
  78. <span class="n">where</span> <span class="n">ChannelValueConcept</span><span class="o">&lt;</span><span class="n">value_type</span><span class="o">&gt;</span><span class="p">;</span>
  79. <span class="k">typename</span> <span class="n">reference</span> <span class="o">=</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::reference to access it</span>
  80. <span class="k">typename</span> <span class="n">pointer</span> <span class="o">=</span> <span class="n">T</span><span class="o">*</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::pointer to access it</span>
  81. <span class="k">typename</span> <span class="n">const_reference</span> <span class="o">=</span> <span class="k">const</span> <span class="n">T</span><span class="o">&amp;</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::const_reference to access it</span>
  82. <span class="k">typename</span> <span class="n">const_pointer</span> <span class="o">=</span> <span class="k">const</span> <span class="n">T</span><span class="o">*</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::const_pointer to access it</span>
  83. <span class="k">static</span> <span class="k">const</span> <span class="kt">bool</span> <span class="n">is_mutable</span><span class="p">;</span> <span class="c1">// use channel_traits&lt;T&gt;::is_mutable to access it</span>
  84. <span class="k">static</span> <span class="n">T</span> <span class="nf">min_value</span><span class="p">();</span> <span class="c1">// use channel_traits&lt;T&gt;::min_value to access it</span>
  85. <span class="k">static</span> <span class="n">T</span> <span class="nf">max_value</span><span class="p">();</span> <span class="c1">// use channel_traits&lt;T&gt;::min_value to access it</span>
  86. <span class="p">};</span>
  87. <span class="n">concept</span> <span class="n">MutableChannelConcept</span><span class="o">&lt;</span><span class="n">ChannelConcept</span> <span class="n">T</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">Swappable</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">Assignable</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="p">{};</span>
  88. <span class="n">concept</span> <span class="n">ChannelValueConcept</span><span class="o">&lt;</span><span class="n">ChannelConcept</span> <span class="n">T</span><span class="o">&gt;</span> <span class="o">:</span> <span class="n">Regular</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span> <span class="p">{};</span>
  89. </pre></div>
  90. </div>
  91. <p>GIL allows built-in integral and floating point types to be channels.
  92. Therefore the associated types and range information are defined in
  93. <code class="docutils literal"><span class="pre">channel_traits</span></code> with the following default implementation:</p>
  94. <div class="highlight-cpp"><div class="highlight"><pre><span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
  95. <span class="k">struct</span> <span class="n">channel_traits</span>
  96. <span class="p">{</span>
  97. <span class="k">typedef</span> <span class="n">T</span> <span class="n">value_type</span><span class="p">;</span>
  98. <span class="k">typedef</span> <span class="n">T</span><span class="o">&amp;</span> <span class="n">reference</span><span class="p">;</span>
  99. <span class="k">typedef</span> <span class="n">T</span><span class="o">*</span> <span class="n">pointer</span><span class="p">;</span>
  100. <span class="k">typedef</span> <span class="n">T</span><span class="o">&amp;</span> <span class="k">const</span> <span class="n">const_reference</span><span class="p">;</span>
  101. <span class="k">typedef</span> <span class="n">T</span><span class="o">*</span> <span class="k">const</span> <span class="n">const_pointer</span><span class="p">;</span>
  102. <span class="k">static</span> <span class="n">value_type</span> <span class="nf">min_value</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">numeric_limits</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">min</span><span class="p">();</span> <span class="p">}</span>
  103. <span class="k">static</span> <span class="n">value_type</span> <span class="nf">max_value</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">numeric_limits</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;::</span><span class="n">max</span><span class="p">();</span> <span class="p">}</span>
  104. <span class="p">};</span>
  105. </pre></div>
  106. </div>
  107. <p>Two channel types are <em>compatible</em> if they have the same value type:</p>
  108. <div class="highlight-cpp"><div class="highlight"><pre><span class="n">concept</span> <span class="n">ChannelsCompatibleConcept</span><span class="o">&lt;</span><span class="n">ChannelConcept</span> <span class="n">T1</span><span class="p">,</span> <span class="n">ChannelConcept</span> <span class="n">T2</span><span class="o">&gt;</span>
  109. <span class="p">{</span>
  110. <span class="n">where</span> <span class="n">SameType</span><span class="o">&lt;</span><span class="n">T1</span><span class="o">::</span><span class="n">value_type</span><span class="p">,</span> <span class="n">T2</span><span class="o">::</span><span class="n">value_type</span><span class="o">&gt;</span><span class="p">;</span>
  111. <span class="p">};</span>
  112. </pre></div>
  113. </div>
  114. <p>A channel may be <em>convertible</em> to another channel:</p>
  115. <div class="highlight-cpp"><div class="highlight"><pre><span class="k">template</span> <span class="o">&lt;</span><span class="n">ChannelConcept</span> <span class="n">Src</span><span class="p">,</span> <span class="n">ChannelValueConcept</span> <span class="n">Dst</span><span class="o">&gt;</span>
  116. <span class="n">concept</span> <span class="n">ChannelConvertibleConcept</span>
  117. <span class="p">{</span>
  118. <span class="n">Dst</span> <span class="n">channel_convert</span><span class="p">(</span><span class="n">Src</span><span class="p">);</span>
  119. <span class="p">};</span>
  120. </pre></div>
  121. </div>
  122. <p>Note that <code class="docutils literal"><span class="pre">ChannelConcept</span></code> and <code class="docutils literal"><span class="pre">MutableChannelConcept</span></code> do not require a
  123. default constructor. Channels that also support default construction (and thus
  124. are regular types) model <code class="docutils literal"><span class="pre">ChannelValueConcept</span></code>.
  125. To understand the motivation for this distinction, consider a 16-bit RGB pixel
  126. in a &#8220;565&#8221; bit pattern. Its channels correspond to bit ranges. To support such
  127. channels, we need to create a custom proxy class corresponding to a reference
  128. to a sub-byte channel.
  129. Such a proxy reference class models only <code class="docutils literal"><span class="pre">ChannelConcept</span></code>, because, similar
  130. to native C++ references, it may not have a default constructor.</p>
  131. <p>Note also that algorithms may impose additional requirements on channels,
  132. such as support for arithmetic operations.</p>
  133. <div class="admonition seealso">
  134. <p class="first admonition-title">See also</p>
  135. <ul class="last simple">
  136. <li><a class="reference external" href="reference/structboost_1_1gil_1_1_channel_concept.html">ChannelConcept&lt;T&gt;</a></li>
  137. <li><a class="reference external" href="reference/structboost_1_1gil_1_1_channel_value_concept.html">ChannelValueConcept&lt;T&gt;</a></li>
  138. <li><a class="reference external" href="reference/structboost_1_1gil_1_1_mutable_channel_concept.html">MutableChannelConcept&lt;T&gt;</a></li>
  139. <li><a class="reference external" href="reference/structboost_1_1gil_1_1_channels_compatible_concept.html">ChannelsCompatibleConcept&lt;T1,T2&gt;</a></li>
  140. <li><a class="reference external" href="reference/structboost_1_1gil_1_1_channel_convertible_concept.html">ChannelConvertibleConcept&lt;SrcChannel,DstChannel&gt;</a></li>
  141. </ul>
  142. </div>
  143. </div>
  144. <div class="section" id="models">
  145. <h2><a class="toc-backref" href="#id2">Models</a></h2>
  146. <p>All C++11 fundamental integer and float point types are valid channels.</p>
  147. <p>The minimum and maximum values of a channel modeled by a built-in type
  148. correspond to the minimum and maximum physical range of the built-in type, as
  149. specified by its <code class="docutils literal"><span class="pre">std::numeric_limits</span></code>. Sometimes the physical range is not
  150. appropriate. GIL provides <code class="docutils literal"><span class="pre">scoped_channel_value</span></code>, a model for a channel
  151. adapter that allows for specifying a custom range.
  152. We use it to define a <code class="docutils literal"><span class="pre">[0..1]</span></code> floating point channel type as follows:</p>
  153. <div class="highlight-cpp"><div class="highlight"><pre><span class="k">struct</span> <span class="n">float_zero</span> <span class="p">{</span> <span class="k">static</span> <span class="kt">float</span> <span class="n">apply</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="mf">0.0f</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span>
  154. <span class="k">struct</span> <span class="n">float_one</span> <span class="p">{</span> <span class="k">static</span> <span class="kt">float</span> <span class="n">apply</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="mf">1.0f</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span>
  155. <span class="k">typedef</span> <span class="n">scoped_channel_value</span><span class="o">&lt;</span><span class="kt">float</span><span class="p">,</span><span class="n">float_zero</span><span class="p">,</span><span class="n">float_one</span><span class="o">&gt;</span> <span class="n">bits32f</span><span class="p">;</span>
  156. </pre></div>
  157. </div>
  158. <p>GIL also provides models for channels corresponding to ranges of bits:</p>
  159. <div class="highlight-cpp"><div class="highlight"><pre><span class="c1">// Value of a channel defined over NumBits bits. Models ChannelValueConcept</span>
  160. <span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">NumBits</span><span class="o">&gt;</span> <span class="k">class</span> <span class="nc">packed_channel_value</span><span class="p">;</span>
  161. <span class="c1">// Reference to a channel defined over NumBits bits. Models ChannelConcept</span>
  162. <span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">FirstBit</span><span class="p">,</span>
  163. <span class="kt">int</span> <span class="n">NumBits</span><span class="p">,</span> <span class="c1">// Defines the sequence of bits in the data value that contain the channel</span>
  164. <span class="kt">bool</span> <span class="n">Mutable</span><span class="o">&gt;</span> <span class="c1">// true if the reference is mutable</span>
  165. <span class="k">class</span> <span class="nc">packed_channel_reference</span><span class="p">;</span>
  166. <span class="c1">// Reference to a channel defined over NumBits bits. Its FirstBit is a run-time parameter. Models ChannelConcept</span>
  167. <span class="k">template</span> <span class="o">&lt;</span><span class="kt">int</span> <span class="n">NumBits</span><span class="p">,</span> <span class="c1">// Defines the sequence of bits in the data value that contain the channel</span>
  168. <span class="kt">bool</span> <span class="n">Mutable</span><span class="o">&gt;</span> <span class="c1">// true if the reference is mutable</span>
  169. <span class="k">class</span> <span class="nc">packed_dynamic_channel_reference</span><span class="p">;</span>
  170. </pre></div>
  171. </div>
  172. <p>Note that there are two models of a reference proxy which differ based on
  173. whether the offset of the channel range is specified as a template or a
  174. run-time parameter. The first model is faster and more compact while the
  175. second model is more flexible. For example, the second model allows us to
  176. construct an iterator over bit range channels.</p>
  177. </div>
  178. <div class="section" id="algorithms">
  179. <h2><a class="toc-backref" href="#id3">Algorithms</a></h2>
  180. <p>Here is how to construct the three channels of a 16-bit &#8220;565&#8221; pixel and set
  181. them to their maximum value:</p>
  182. <div class="highlight-cpp"><div class="highlight"><pre><span class="k">using</span> <span class="n">channel16_0_5_reference_t</span> <span class="o">=</span> <span class="n">packed_channel_reference</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="nb">true</span><span class="o">&gt;</span><span class="p">;</span>
  183. <span class="k">using</span> <span class="n">channel16_5_6_reference_t</span> <span class="o">=</span> <span class="n">packed_channel_reference</span><span class="o">&lt;</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="nb">true</span><span class="o">&gt;</span><span class="p">;</span>
  184. <span class="k">using</span> <span class="n">channel16_11_5_reference_t</span> <span class="o">=</span> <span class="n">packed_channel_reference</span><span class="o">&lt;</span><span class="mi">11</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="nb">true</span><span class="o">&gt;</span><span class="p">;</span>
  185. <span class="n">std</span><span class="o">::</span><span class="kt">uint16_t</span> <span class="n">data</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
  186. <span class="n">channel16_0_5_reference_t</span> <span class="nf">channel1</span><span class="p">(</span><span class="o">&amp;</span><span class="n">data</span><span class="p">);</span>
  187. <span class="n">channel16_5_6_reference_t</span> <span class="nf">channel2</span><span class="p">(</span><span class="o">&amp;</span><span class="n">data</span><span class="p">);</span>
  188. <span class="n">channel16_11_5_reference_t</span> <span class="nf">channel3</span><span class="p">(</span><span class="o">&amp;</span><span class="n">data</span><span class="p">);</span>
  189. <span class="n">channel1</span> <span class="o">=</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">channel16_0_5_reference_t</span><span class="o">&gt;::</span><span class="n">max_value</span><span class="p">();</span>
  190. <span class="n">channel2</span> <span class="o">=</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">channel16_5_6_reference_t</span><span class="o">&gt;::</span><span class="n">max_value</span><span class="p">();</span>
  191. <span class="n">channel3</span> <span class="o">=</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">channel16_11_5_reference_t</span><span class="o">&gt;::</span><span class="n">max_value</span><span class="p">();</span>
  192. <span class="n">assert</span><span class="p">(</span><span class="n">data</span> <span class="o">==</span> <span class="mi">65535</span><span class="p">);</span>
  193. </pre></div>
  194. </div>
  195. <p>Assignment, equality comparison and copy construction are defined only between
  196. compatible channels:</p>
  197. <div class="highlight-cpp"><div class="highlight"><pre><span class="n">packed_channel_value</span><span class="o">&lt;</span><span class="mi">5</span><span class="o">&gt;</span> <span class="n">channel_6bit</span> <span class="o">=</span> <span class="n">channel1</span><span class="p">;</span>
  198. <span class="n">channel_6bit</span> <span class="o">=</span> <span class="n">channel3</span><span class="p">;</span>
  199. <span class="c1">// compile error: Assignment between incompatible channels</span>
  200. <span class="c1">//channel_6bit = channel2;</span>
  201. </pre></div>
  202. </div>
  203. <p>All channel models provided by GIL are pairwise convertible:</p>
  204. <div class="highlight-cpp"><div class="highlight"><pre><span class="n">channel1</span> <span class="o">=</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">channel16_0_5_reference_t</span><span class="o">&gt;::</span><span class="n">max_value</span><span class="p">();</span>
  205. <span class="n">assert</span><span class="p">(</span><span class="n">channel1</span> <span class="o">==</span> <span class="mi">31</span><span class="p">);</span>
  206. <span class="n">bits16</span> <span class="n">chan16</span> <span class="o">=</span> <span class="n">channel_convert</span><span class="o">&lt;</span><span class="n">bits16</span><span class="o">&gt;</span><span class="p">(</span><span class="n">channel1</span><span class="p">);</span>
  207. <span class="n">assert</span><span class="p">(</span><span class="n">chan16</span> <span class="o">==</span> <span class="mi">65535</span><span class="p">);</span>
  208. </pre></div>
  209. </div>
  210. <p>Channel conversion is a lossy operation. GIL&#8217;s channel conversion is a linear
  211. transformation between the ranges of the source and destination channel.
  212. It maps precisely the minimum to the minimum and the maximum to the maximum.
  213. (For example, to convert from uint8_t to uint16_t GIL does not do a bit shift
  214. because it will not properly match the maximum values. Instead GIL multiplies
  215. the source by 257).</p>
  216. <p>All channel models that GIL provides are convertible from/to an integral or
  217. floating point type. Thus they support arithmetic operations. Here are the
  218. channel-level algorithms that GIL provides:</p>
  219. <div class="highlight-cpp"><div class="highlight"><pre><span class="c1">// Converts a source channel value into a destination channel.</span>
  220. <span class="c1">// Linearly maps the value of the source into the range of the destination.</span>
  221. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">DstChannel</span><span class="p">,</span> <span class="k">typename</span> <span class="n">SrcChannel</span><span class="o">&gt;</span>
  222. <span class="k">typename</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">DstChannel</span><span class="o">&gt;::</span><span class="n">value_type</span> <span class="n">channel_convert</span><span class="p">(</span><span class="n">SrcChannel</span> <span class="n">src</span><span class="p">);</span>
  223. <span class="c1">// returns max_value - x + min_value</span>
  224. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Channel</span><span class="o">&gt;</span>
  225. <span class="k">typename</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">Channel</span><span class="o">&gt;::</span><span class="n">value_type</span> <span class="n">channel_invert</span><span class="p">(</span><span class="n">Channel</span> <span class="n">x</span><span class="p">);</span>
  226. <span class="c1">// returns a * b / max_value</span>
  227. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">Channel</span><span class="o">&gt;</span>
  228. <span class="k">typename</span> <span class="n">channel_traits</span><span class="o">&lt;</span><span class="n">Channel</span><span class="o">&gt;::</span><span class="n">value_type</span> <span class="n">channel_multiply</span><span class="p">(</span><span class="n">Channel</span> <span class="n">a</span><span class="p">,</span> <span class="n">Channel</span> <span class="n">b</span><span class="p">);</span>
  229. </pre></div>
  230. </div>
  231. </div>
  232. </div>
  233. <div class="navbar" style="text-align:right;">
  234. <a class="prev" title="Point" href="point.html"><img src="../_static/prev.png" alt="prev"/></a>
  235. <a class="up" title="Design Guide" href="index.html"><img src="../_static/up.png" alt="up"/></a>
  236. <a class="next" title="Color Space and Layout" href="color_space.html"><img src="../_static/next.png" alt="next"/></a>
  237. </div>
  238. </div>
  239. <div class="footer" role="contentinfo">
  240. Last updated on 2019-12-10 00:12:10.
  241. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
  242. </div>
  243. </body>
  244. </html>