<div dir="ltr">Whoops, the diff was cut off.  Here&#39;s the full diff, on the off chance you need it:<div>







<p class=""><span class="">diff --git a/include/boost/gil/channel_algorithm.hpp b/include/boost/gil/channel_algorithm.hpp</span></p>
<p class=""><span class="">index 1361219..1799470 100644</span></p>
<p class=""><span class="">--- a/include/boost/gil/channel_algorithm.hpp</span></p>
<p class=""><span class="">+++ b/include/boost/gil/channel_algorithm.hpp</span></p>
<p class=""><span class="">@@ -51,7 +51,7 @@</span><span class=""> template &lt;typename SrcChannelV, typename DstChannelV, bool SrcLessThanDst, bool</span></p>
<p class=""><span class=""></span><br></p>
<p class=""><span class=""></span><br></p>
<p class=""><span class=""> template &lt;typename UnsignedIntegralChannel&gt;</span></p>
<p class=""><span class="">-struct unsigned_integral_max_value : public mpl::integral_c&lt;UnsignedIntegralChannel,-1&gt; {};</span></p>
<p class=""><span class="">+struct unsigned_integral_max_value : public mpl::integral_c&lt;UnsignedIntegralChannel,(1&lt;&lt;sizeof(UnsignedIntegralChannel))-1&gt; {};</span></p>
<p class=""><span class=""></span><br></p>
<p class=""><span class=""> template &lt;&gt;</span></p>
<p class=""><span class=""> struct unsigned_integral_max_value&lt;uint8_t&gt; : public mpl::integral_c&lt;uint32_t,0xFF&gt; {};</span></p><p class=""><span class="">HTH,</span></p><p class=""><span class="">Nate</span></p><p class=""><span class=""><br></span></p></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 12, 2015 at 2:04 PM, Nate Crookston <span dir="ltr">&lt;<a href="mailto:nathan.crookston@gmail.com" target="_blank">nathan.crookston@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi Gabriel,</div><div><br></div><div>I&#39;ve successfully done what you&#39;re trying to do I think.  I wrote about some problems in the following thread: <a href="https://groups.google.com/forum/#!topic/boost-list/4CqibxPFdUw" target="_blank">https://groups.google.com/forum/#!topic/boost-list/4CqibxPFdUw</a>.  In short, I had to specialize a few other metafunctions.  I think we should add a scoped_integral_channel_value type which has appropriate specializations for people trying to do what you&#39;re doing.<br></div><div><br></div><div>I had to make the following change to compile with c++11 clang:</div><div>







<p><span><b>diff --git a/include/boost/gil/channel_algorithm.hpp b/include/boost/gil/channel_algorithm.hpp</b></span></p>
<p><span><b>index 1361219..1799470 100644</b></span></p>
<p><span><b>--- a/include/boost/gil/channel_algorithm.hpp</b></span></p>
<p><span><b>+++ b/include/boost/gil/channel_algorithm.hpp</b></span></p>
<p><span>@@ -51,7 +51,7 @@</span><span> template &lt;typename SrcChannelV, typename DstChannelV, bool SrcLessThanDst, bool</span></p>
<p><span> </span></p>
<p><span> </span></p>
<p><span> template &lt;typename UnsignedIntegralChannel&gt;</span></p>
<p><span>-struct unsigned_integral_max_value : public mpl::integral_c&lt;UnsignedIntegralChannel,-1&gt; {};</span></p>
<p><span>+struct unsigned_integral_max_value : public mpl::integral_c&lt;UnsignedIntegralChannel,(1&lt;&lt;sizeof(Un</span></p>
<p><span> </span></p>
<p><span> template &lt;&gt;</span></p>
<p><span> struct unsigned_integral_max_value&lt;uint8_t&gt; : public mpl::integral_c&lt;uint32_t,0xFF&gt; {};</span></p><p><span><br></span></p><p><span>Then I added a couple specializations in your code:</span></p></div><div><span class="">







<p><span></span><br></p>
<p><span>#include </span><span>&lt;boost/gil/gil_all.hpp&gt;</span></p>
<p><span>#include </span><span>&lt;cstdint&gt;</span></p>
<p><span></span><br></p>
<p><span>using</span><span> </span><span>namespace</span><span> std;</span></p>
<p><span>using</span><span> </span><span>namespace</span><span> boost::gil;</span></p>
<p><span></span><br></p>
<p><span>namespace</span><span> detail</span></p>
<p><span>{</span></p>
<p><span>    </span><span>struct</span><span> bits14_min { </span><span>static</span><span> std::</span><span>uint16_t</span><span> apply() { </span><span>return</span><span> </span><span>0</span><span>;} };</span></p>
<p><span>    </span><span>struct</span><span> bits14_max { </span><span>static</span><span> std::</span><span>uint16_t</span><span> apply() { </span><span>return</span><span> </span><span>0x3FF</span><span>;} };</span></p>
<p><span>}</span></p>
<p><span></span><br></p>
<p><span>typedef</span><span> scoped_channel_value &lt;std::</span><span>uint16_t</span><span>, ::detail::bits14_min, ::detail::bits14_max&gt; bits14_t;</span></p>
</span><p><span>namespace</span><span> boost { </span><span>namespace</span><span> gil { </span><span>namespace</span><span> detail {</span></p>
<p><span>  </span><span>template</span><span> &lt;&gt; </span><span>struct</span><span> unsigned_integral_max_value&lt;bits14_t&gt; : </span><span>public</span><span> mpl::integral_c&lt;</span><span>uint32_t</span><span>,</span><span>0x3FF</span><span>&gt; {};</span></p>
<p><span>  </span><span>template</span><span> &lt;&gt; </span><span>struct</span><span> unsigned_integral_num_bits&lt;bits14_t&gt; : </span><span>public</span><span> mpl::int_&lt;</span><span>14</span><span>&gt; {};</span></p><span class="">
<p><span>}}}</span></p>
<p><span></span><br></p>
<p><span>typedef</span><span> pixel&lt;bits14_t, gray_layout_t&gt; Pixel1;</span></p>
<p><span>typedef</span><span> image&lt;Pixel1&gt; Frame1;</span></p>
<p><span></span><br></p>
<p><span>int</span><span> main()</span></p>
<p><span>{</span></p>
</span><p><span>  bits14_t x = channel_traits&lt;bits14_t&gt;::max_value();</span></p>
<p><span>  assert(x == </span><span>0x3ff</span><span>);</span></p>
<p><span>  bits16 y = channel_convert&lt;bits16&gt;(x);</span></p>
<p><span>  assert(y == </span><span>0xffff</span><span>);</span></p><span class="">
<p><span></span><br></p>
<p><span>  Frame1 image(</span></p>
<p><span>      Frame1::point_t(</span><span>100</span><span>, </span><span>100</span><span>),</span></p>
<p><span>      Frame1::value_type((</span><span>1</span><span> &lt;&lt; </span><span>14</span><span>)-</span><span>1</span><span>),</span></p>
<p><span>      </span><span>0</span><span>);</span></p>
<p><span></span><br></p>
<p><span>  gray16_image_t image2(image.dimensions());</span></p>
<p><span></span><br></p>
<p><span>  Frame1::view_t view1(view(image));</span></p>
<p><span>  gray16_image_t::view_t view2(view(image2));</span></p>
<p><span></span><br></p>
<p><span>  copy_and_convert_pixels(view1, view2);</span></p>
<p><span>  </span><span>return</span><span> </span><span>0</span><span>;</span></p>
<p><span>}</span></p></span></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">On Thu, Jan 8, 2015 at 4:13 PM, Gabriel Marcano <span dir="ltr">&lt;<a href="mailto:gabemarcano@yahoo.com" target="_blank">gabemarcano@yahoo.com</a>&gt;</span> wrote:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5">I have been experimenting with Boost.GIL, and I have run into something<br>
that I&#39;m not sure if it&#39;s a problem on my end or with Boost.GIL. In<br>
essence, I&#39;m trying to make a grayscale image with channels limited to<br>
14 bits. I am using scoped_channel_value to do this. The problem<br>
happens when I try to convert the 14 bit image to a 16 bit grayscale<br>
image I get compilation errors. I am including the code I am using<br>
below:<br>
<br>
//START CODE<br>
<br>
    #include &lt;boost/gil/gil_all.hpp&gt;<br>
    #include &lt;cstdint&gt;<br>
<br>
    using namespace std;<br>
    using namespace boost::gil;<br>
<br>
    namespace detail<br>
    {<br>
        struct bits14_min { static std::uint16_t apply() { return 0;} };<br>
        struct bits14_max<br>
           { static std::uint16_t apply() { return 0x3FF;} };<br>
    }<br>
<br>
    typedef scoped_channel_value<br>
        &lt;std::uint16_t,<br>
            ::detail::bits14_min, ::detail::bits14_max&gt; bits14_t;<br>
<br>
    typedef pixel&lt;bits14_t, gray_layout_t&gt; Pixel1;<br>
    typedef image&lt;Pixel1&gt; Frame1;<br>
<br>
    int main()<br>
    {<br>
        Frame1 image(<br>
            Frame1::point_t(100, 100),<br>
            Frame1::value_type((1 &lt;&lt; 14)-1),<br>
            0);<br>
<br>
        gray16_image_t image2(image.dimensions());<br>
<br>
        Frame1::view_t view1(view(image));<br>
        gray16_image_t::view_t view2(view(image2));<br>
<br>
        copy_and_convert_pixels(view1, view2);<br>
<br>
        return 0;<br>
    }<br>
<br>
//END CODE<br>
<br>
The interesting thing is that the program compiles if change<br>
    typedef scoped_channel_value<br>
        &lt;std::uint16_t,<br>
            ::detail::bits14_min, ::detail::bits14_max&gt; bits14_t;<br>
to<br>
    typedef scoped_channel_value<br>
        &lt;float,<br>
            ::detail::bits14_min, ::detail::bits14_max&gt; bits14_t;<br>
<br>
I think the relevant error in the log is this:<br>
    /usr/include/boost/gil/channel_algorithm.hpp:54:8: error:<br>
        ‘struct boost::gil::scoped_channel_value&lt;short unsigned<br>
        int, detail::bits14_min, detail::bits14_max&gt;’ is not a<br>
        valid type for a template non-type parameter<br>
         struct unsigned_integral_max_value : public<br>
             mpl::integral_c&lt;UnsignedIntegralChannel,-1&gt; {};<br>
<br>
I am attaching the full compile log to this email. Thank you for any<br>
help with this matter!<br>
<br>
Sincerely,<br>
<br>
Gabriel E. Marcano<br>
<br></div></div>_______________________________________________<br>
Boost-users mailing list<br>
<a href="mailto:Boost-users@lists.boost.org" target="_blank">Boost-users@lists.boost.org</a><br>
<a href="http://lists.boost.org/mailman/listinfo.cgi/boost-users" target="_blank">http://lists.boost.org/mailman/listinfo.cgi/boost-users</a><br></blockquote></div><br></div>
</blockquote></div><br></div>