extending.html 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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>Extending - 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="Conclusions" href="conclusions.html" />
  25. <link rel="prev" title="Technicalities" href="technicalities.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="Technicalities" href="technicalities.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="Conclusions" href="conclusions.html"><img src="../_static/next.png" alt="next"/></a>
  59. </div>
  60. <div class="section" id="extending">
  61. <h1>Extending</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="#defining-new-color-spaces" id="id2">Defining new color spaces</a></li>
  66. <li><a class="reference internal" href="#defining-new-channel-types" id="id3">Defining new channel types</a></li>
  67. <li><a class="reference internal" href="#overloading-color-conversion" id="id4">Overloading color conversion</a></li>
  68. <li><a class="reference internal" href="#defining-new-image-views" id="id5">Defining new image views</a></li>
  69. </ul>
  70. </div>
  71. <div class="section" id="overview">
  72. <h2><a class="toc-backref" href="#id1">Overview</a></h2>
  73. <p>You can define your own pixel iterators, locators, image views,
  74. images, channel types, color spaces and algorithms. You can make
  75. virtual images that live on the disk, inside a jpeg file, somewhere on
  76. the internet, or even fully-synthetic images such as the Mandelbrot
  77. set. As long as they properly model the corresponding concepts, they
  78. will work with any existing GIL code. Most such extensions require no
  79. changes to the library and can thus be supplied in another module.</p>
  80. </div>
  81. <div class="section" id="defining-new-color-spaces">
  82. <h2><a class="toc-backref" href="#id2">Defining new color spaces</a></h2>
  83. <p>Each color space is in a separate file. To add a new color space, just
  84. copy one of the existing ones (like rgb.hpp) and change it
  85. accordingly. If you want color conversion support, you will have to
  86. provide methods to convert between it and the existing color spaces
  87. (see color_convert.h). For convenience you may want to provide useful
  88. typedefs for pixels, pointers, references and images with the new
  89. color space (see typedefs.h).</p>
  90. </div>
  91. <div class="section" id="defining-new-channel-types">
  92. <h2><a class="toc-backref" href="#id3">Defining new channel types</a></h2>
  93. <p>Most of the time you don&#8217;t need to do anything special to use a new
  94. channel type. You can just use it:</p>
  95. <div class="highlight-cpp"><div class="highlight"><pre><span class="k">typedef</span> <span class="n">pixel</span><span class="o">&lt;</span><span class="kt">double</span><span class="p">,</span><span class="n">rgb_layout_t</span><span class="o">&gt;</span> <span class="n">rgb64_pixel_t</span><span class="p">;</span> <span class="c1">// 64 bit RGB pixel</span>
  96. <span class="k">typedef</span> <span class="n">rgb64_pixel</span><span class="o">*</span> <span class="n">rgb64_pixel_ptr_t</span><span class="p">;</span><span class="c1">// pointer to 64-bit interleaved data</span>
  97. <span class="k">typedef</span> <span class="n">image_type</span><span class="o">&lt;</span><span class="kt">double</span><span class="p">,</span><span class="n">rgb_layout_t</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">rgb64_image_t</span><span class="p">;</span> <span class="c1">// 64-bit interleaved image</span>
  98. </pre></div>
  99. </div>
  100. <p>If you want to use your own channel class, you will need to provide a
  101. specialization of <code class="docutils literal"><span class="pre">channel_traits</span></code> for it (see channel.hpp). If you
  102. want to do conversion between your and existing channel types, you
  103. will need to provide an overload of <code class="docutils literal"><span class="pre">channel_convert</span></code>.</p>
  104. </div>
  105. <div class="section" id="overloading-color-conversion">
  106. <h2><a class="toc-backref" href="#id4">Overloading color conversion</a></h2>
  107. <p>Suppose you want to provide your own color conversion. For example,
  108. you may want to implement higher quality color conversion using color
  109. profiles. Typically you may want to redefine color conversion only in
  110. some instances and default to GIL&#8217;s color conversion in all other
  111. cases. Here is, for example, how to overload color conversion so that
  112. color conversion to gray inverts the result but everything else
  113. remains the same:</p>
  114. <div class="highlight-cpp"><div class="highlight"><pre><span class="c1">// make the default use GIL&#39;s default</span>
  115. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">SrcColorSpace</span><span class="p">,</span> <span class="k">typename</span> <span class="n">DstColorSpace</span><span class="o">&gt;</span>
  116. <span class="k">struct</span> <span class="nl">my_color_converter_impl</span>
  117. <span class="p">:</span> <span class="k">public</span> <span class="n">default_color_converter_impl</span><span class="o">&lt;</span><span class="n">SrcColorSpace</span><span class="p">,</span><span class="n">DstColorSpace</span><span class="o">&gt;</span> <span class="p">{};</span>
  118. <span class="c1">// provide specializations only for cases you care about</span>
  119. <span class="c1">// (in this case, if the destination is grayscale, invert it)</span>
  120. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">SrcColorSpace</span><span class="o">&gt;</span>
  121. <span class="k">struct</span> <span class="n">my_color_converter_impl</span><span class="o">&lt;</span><span class="n">SrcColorSpace</span><span class="p">,</span><span class="n">gray_t</span><span class="o">&gt;</span>
  122. <span class="p">{</span>
  123. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">SrcP</span><span class="p">,</span> <span class="k">typename</span> <span class="n">DstP</span><span class="o">&gt;</span> <span class="c1">// Model PixelConcept</span>
  124. <span class="kt">void</span> <span class="k">operator</span><span class="p">()(</span><span class="k">const</span> <span class="n">SrcP</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">,</span> <span class="n">DstP</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span> <span class="k">const</span>
  125. <span class="p">{</span>
  126. <span class="n">default_color_converter_impl</span><span class="o">&lt;</span><span class="n">SrcColorSpace</span><span class="p">,</span><span class="n">gray_t</span><span class="o">&gt;</span><span class="p">()(</span><span class="n">src</span><span class="p">,</span><span class="n">dst</span><span class="p">);</span>
  127. <span class="n">get_color</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span><span class="n">gray_color_t</span><span class="p">())</span><span class="o">=</span><span class="n">channel_invert</span><span class="p">(</span><span class="n">get_color</span><span class="p">(</span><span class="n">dst</span><span class="p">,</span><span class="n">gray_color_t</span><span class="p">()));</span>
  128. <span class="p">}</span>
  129. <span class="p">};</span>
  130. <span class="c1">// create a color converter object that dispatches to your own implementation</span>
  131. <span class="k">struct</span> <span class="n">my_color_converter</span>
  132. <span class="p">{</span>
  133. <span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="n">SrcP</span><span class="p">,</span> <span class="k">typename</span> <span class="n">DstP</span><span class="o">&gt;</span> <span class="c1">// Model PixelConcept</span>
  134. <span class="kt">void</span> <span class="k">operator</span><span class="p">()(</span><span class="k">const</span> <span class="n">SrcP</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">,</span><span class="n">DstP</span><span class="o">&amp;</span> <span class="n">dst</span><span class="p">)</span> <span class="k">const</span>
  135. <span class="p">{</span>
  136. <span class="k">typedef</span> <span class="k">typename</span> <span class="n">color_space_type</span><span class="o">&lt;</span><span class="n">SrcP</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">SrcColorSpace</span><span class="p">;</span>
  137. <span class="k">typedef</span> <span class="k">typename</span> <span class="n">color_space_type</span><span class="o">&lt;</span><span class="n">DstP</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">DstColorSpace</span><span class="p">;</span>
  138. <span class="n">my_color_converter_impl</span><span class="o">&lt;</span><span class="n">SrcColorSpace</span><span class="p">,</span><span class="n">DstColorSpace</span><span class="o">&gt;</span><span class="p">()(</span><span class="n">src</span><span class="p">,</span><span class="n">dst</span><span class="p">);</span>
  139. <span class="p">}</span>
  140. <span class="p">};</span>
  141. </pre></div>
  142. </div>
  143. <p>GIL color conversion functions take the color converter as an
  144. optional parameter. You can pass your own color converter:</p>
  145. <div class="highlight-cpp"><div class="highlight"><pre><span class="n">color_converted_view</span><span class="o">&lt;</span><span class="n">gray8_pixel_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">img_view</span><span class="p">,</span><span class="n">my_color_converter</span><span class="p">());</span>
  146. </pre></div>
  147. </div>
  148. </div>
  149. <div class="section" id="defining-new-image-views">
  150. <h2><a class="toc-backref" href="#id5">Defining new image views</a></h2>
  151. <p>You can provide your own pixel iterators, locators and views,
  152. overriding either the mechanism for getting from one pixel to the next
  153. or doing an arbitrary pixel transformation on dereference. For
  154. example, let&#8217;s look at the implementation of <code class="docutils literal"><span class="pre">color_converted_view</span></code>
  155. (an image factory method that, given any image view, returns a new,
  156. otherwise identical view, except that color conversion is performed on
  157. pixel access). First we need to define a model of
  158. <code class="docutils literal"><span class="pre">PixelDereferenceAdaptorConcept</span></code>; a function object that will be
  159. called when we dereference a pixel iterator. It will call
  160. <code class="docutils literal"><span class="pre">color_convert</span></code> to convert to the destination pixel type:</p>
  161. <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">SrcConstRefP</span><span class="p">,</span> <span class="c1">// const reference to the source pixel</span>
  162. <span class="k">typename</span> <span class="n">DstP</span><span class="o">&gt;</span> <span class="c1">// Destination pixel value (models PixelValueConcept)</span>
  163. <span class="k">class</span> <span class="nc">color_convert_deref_fn</span>
  164. <span class="p">{</span>
  165. <span class="k">public</span><span class="o">:</span>
  166. <span class="k">typedef</span> <span class="n">color_convert_deref_fn</span> <span class="n">const_t</span><span class="p">;</span>
  167. <span class="k">typedef</span> <span class="n">DstP</span> <span class="n">value_type</span><span class="p">;</span>
  168. <span class="k">typedef</span> <span class="n">value_type</span> <span class="n">reference</span><span class="p">;</span> <span class="c1">// read-only dereferencing</span>
  169. <span class="k">typedef</span> <span class="k">const</span> <span class="n">value_type</span><span class="o">&amp;</span> <span class="n">const_reference</span><span class="p">;</span>
  170. <span class="k">typedef</span> <span class="n">SrcConstRefP</span> <span class="n">argument_type</span><span class="p">;</span>
  171. <span class="k">typedef</span> <span class="n">reference</span> <span class="n">result_type</span><span class="p">;</span>
  172. <span class="k">static</span> <span class="kt">bool</span> <span class="k">constexpr</span> <span class="n">is_mutable</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
  173. <span class="n">result_type</span> <span class="nf">operator</span><span class="p">()(</span><span class="n">argument_type</span> <span class="n">srcP</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
  174. <span class="n">result_type</span> <span class="n">dstP</span><span class="p">;</span>
  175. <span class="n">color_convert</span><span class="p">(</span><span class="n">srcP</span><span class="p">,</span><span class="n">dstP</span><span class="p">);</span>
  176. <span class="k">return</span> <span class="n">dstP</span><span class="p">;</span>
  177. <span class="p">}</span>
  178. <span class="p">};</span>
  179. </pre></div>
  180. </div>
  181. <p>We then use the <code class="docutils literal"><span class="pre">add_deref</span></code> member struct of image views to construct the
  182. type of a view that invokes a given function object (<code class="docutils literal"><span class="pre">deref_t</span></code>) upon
  183. dereferencing. In our case, it performs color conversion:</p>
  184. <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">SrcView</span><span class="p">,</span> <span class="k">typename</span> <span class="n">DstP</span><span class="o">&gt;</span>
  185. <span class="k">struct</span> <span class="n">color_converted_view_type</span>
  186. <span class="p">{</span>
  187. <span class="k">private</span><span class="o">:</span>
  188. <span class="k">typedef</span> <span class="k">typename</span> <span class="n">SrcView</span><span class="o">::</span><span class="n">const_t</span><span class="o">::</span><span class="n">reference</span> <span class="n">src_pix_ref</span><span class="p">;</span> <span class="c1">// const reference to pixel in SrcView</span>
  189. <span class="k">typedef</span> <span class="n">color_convert_deref_fn</span><span class="o">&lt;</span><span class="n">src_pix_ref</span><span class="p">,</span> <span class="n">DstP</span><span class="o">&gt;</span> <span class="n">deref_t</span><span class="p">;</span> <span class="c1">// the dereference adaptor that performs color conversion</span>
  190. <span class="k">typedef</span> <span class="k">typename</span> <span class="n">SrcView</span><span class="o">::</span><span class="k">template</span> <span class="n">add_deref</span><span class="o">&lt;</span><span class="n">deref_t</span><span class="o">&gt;</span> <span class="n">add_ref_t</span><span class="p">;</span>
  191. <span class="k">public</span><span class="o">:</span>
  192. <span class="k">typedef</span> <span class="k">typename</span> <span class="n">add_ref_t</span><span class="o">::</span><span class="n">type</span> <span class="n">type</span><span class="p">;</span> <span class="c1">// the color converted view type</span>
  193. <span class="k">static</span> <span class="n">type</span> <span class="nf">make</span><span class="p">(</span><span class="k">const</span> <span class="n">SrcView</span><span class="o">&amp;</span> <span class="n">sv</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">add_ref_t</span><span class="o">::</span><span class="n">make</span><span class="p">(</span><span class="n">sv</span><span class="p">,</span> <span class="n">deref_t</span><span class="p">());</span> <span class="p">}</span>
  194. <span class="p">};</span>
  195. </pre></div>
  196. </div>
  197. <p>Finally our <code class="docutils literal"><span class="pre">color_converted_view</span></code> code simply creates color-converted view
  198. from the source view:</p>
  199. <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">DstP</span><span class="p">,</span> <span class="k">typename</span> <span class="n">View</span><span class="o">&gt;</span> <span class="kr">inline</span>
  200. <span class="k">typename</span> <span class="n">color_converted_view_type</span><span class="o">&lt;</span><span class="n">View</span><span class="p">,</span><span class="n">DstP</span><span class="o">&gt;::</span><span class="n">type</span> <span class="n">color_convert_view</span><span class="p">(</span><span class="k">const</span> <span class="n">View</span><span class="o">&amp;</span> <span class="n">src</span><span class="p">)</span>
  201. <span class="p">{</span>
  202. <span class="k">return</span> <span class="n">color_converted_view_type</span><span class="o">&lt;</span><span class="n">View</span><span class="p">,</span><span class="n">DstP</span><span class="o">&gt;::</span><span class="n">make</span><span class="p">(</span><span class="n">src</span><span class="p">);</span>
  203. <span class="p">}</span>
  204. </pre></div>
  205. </div>
  206. <p>(The actual color convert view transformation is slightly more
  207. complicated, as it takes an optional color conversion object, which
  208. allows users to specify their own color conversion methods). See the
  209. GIL tutorial for an example of creating a virtual image view that
  210. defines the Mandelbrot set.</p>
  211. </div>
  212. </div>
  213. <div class="navbar" style="text-align:right;">
  214. <a class="prev" title="Technicalities" href="technicalities.html"><img src="../_static/prev.png" alt="prev"/></a>
  215. <a class="up" title="Design Guide" href="index.html"><img src="../_static/up.png" alt="up"/></a>
  216. <a class="next" title="Conclusions" href="conclusions.html"><img src="../_static/next.png" alt="next"/></a>
  217. </div>
  218. </div>
  219. <div class="footer" role="contentinfo">
  220. Last updated on 2019-12-10 00:12:10.
  221. Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.5.6.
  222. </div>
  223. </body>
  224. </html>