<div dir="ltr">Whoops, the diff was cut off. Here'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 <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 <typename UnsignedIntegralChannel></span></p> <p class=""><span class="">-struct unsigned_integral_max_value : public mpl::integral_c<UnsignedIntegralChannel,-1> {};</span></p> <p class=""><span class="">+struct unsigned_integral_max_value : public mpl::integral_c<UnsignedIntegralChannel,(1<<sizeof(UnsignedIntegralChannel))-1> {};</span></p> <p class=""><span class=""></span><br></p> <p class=""><span class=""> template <></span></p> <p class=""><span class=""> struct unsigned_integral_max_value<uint8_t> : public mpl::integral_c<uint32_t,0xFF> {};</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"><<a href="mailto:nathan.crookston@gmail.com" target="_blank">nathan.crookston@gmail.com</a>></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've successfully done what you'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'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 <typename SrcChannelV, typename DstChannelV, bool SrcLessThanDst, bool</span></p> <p><span> </span></p> <p><span> </span></p> <p><span> template <typename UnsignedIntegralChannel></span></p> <p><span>-struct unsigned_integral_max_value : public mpl::integral_c<UnsignedIntegralChannel,-1> {};</span></p> <p><span>+struct unsigned_integral_max_value : public mpl::integral_c<UnsignedIntegralChannel,(1<<sizeof(Un</span></p> <p><span> </span></p> <p><span> template <></span></p> <p><span> struct unsigned_integral_max_value<uint8_t> : public mpl::integral_c<uint32_t,0xFF> {};</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><boost/gil/gil_all.hpp></span></p> <p><span>#include </span><span><cstdint></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 <std::</span><span>uint16_t</span><span>, ::detail::bits14_min, ::detail::bits14_max> 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> <> </span><span>struct</span><span> unsigned_integral_max_value<bits14_t> : </span><span>public</span><span> mpl::integral_c<</span><span>uint32_t</span><span>,</span><span>0x3FF</span><span>> {};</span></p> <p><span> </span><span>template</span><span> <> </span><span>struct</span><span> unsigned_integral_num_bits<bits14_t> : </span><span>public</span><span> mpl::int_<</span><span>14</span><span>> {};</span></p><span class=""> <p><span>}}}</span></p> <p><span></span><br></p> <p><span>typedef</span><span> pixel<bits14_t, gray_layout_t> Pixel1;</span></p> <p><span>typedef</span><span> image<Pixel1> 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<bits14_t>::max_value();</span></p> <p><span> assert(x == </span><span>0x3ff</span><span>);</span></p> <p><span> bits16 y = channel_convert<bits16>(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> << </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"><<a href="mailto:gabemarcano@yahoo.com" target="_blank">gabemarcano@yahoo.com</a>></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'm not sure if it's a problem on my end or with Boost.GIL. In<br> essence, I'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 <boost/gil/gil_all.hpp><br> #include <cstdint><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> <std::uint16_t,<br> ::detail::bits14_min, ::detail::bits14_max> bits14_t;<br> <br> typedef pixel<bits14_t, gray_layout_t> Pixel1;<br> typedef image<Pixel1> Frame1;<br> <br> int main()<br> {<br> Frame1 image(<br> Frame1::point_t(100, 100),<br> Frame1::value_type((1 << 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> <std::uint16_t,<br> ::detail::bits14_min, ::detail::bits14_max> bits14_t;<br> to<br> typedef scoped_channel_value<br> <float,<br> ::detail::bits14_min, ::detail::bits14_max> 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<short unsigned<br> int, detail::bits14_min, detail::bits14_max>’ is not a<br> valid type for a template non-type parameter<br> struct unsigned_integral_max_value : public<br> mpl::integral_c<UnsignedIntegralChannel,-1> {};<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>