$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Test-list] svn:boost r82769 - in trunk/boost/gil/extension/toolbox: . color_converters color_spaces image_types metafunctions
From: chhenning_at_[hidden]
Date: 2013-02-06 20:37:50
Author: chhenning
Date: 2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
New Revision: 82769
URL: http://svn.boost.org/trac/boost/changeset/82769
Log:
Toolbox extension inital commit.
Added:
   trunk/boost/gil/extension/toolbox/
   trunk/boost/gil/extension/toolbox/color_converters/
   trunk/boost/gil/extension/toolbox/color_converters.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/
   trunk/boost/gil/extension/toolbox/color_spaces.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/cmyka.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/hsl.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/hsv.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/lab.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/color_spaces/xyz.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/dynamic_images.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/image_types/
   trunk/boost/gil/extension/toolbox/image_types.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/image_types/indexed_image.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/
   trunk/boost/gil/extension/toolbox/metafunctions.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/channel_type.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/channel_view.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/gil_extensions.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/is_similar.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp   (contents, props changed)
   trunk/boost/gil/extension/toolbox/toolbox.hpp   (contents, props changed)
Added: trunk/boost/gil/extension/toolbox/color_converters.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_converters.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,25 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file color_converters.hpp
+/// \brief Color converters for toolbox extension.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp>
+#include <boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp>
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_HPP
Added: trunk/boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_converters/gray_to_rgba.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,49 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_GRAY_TO_RGBA_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_GRAY_TO_RGBA_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file
+/// \brief
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/color_convert.hpp>
+
+namespace boost{ namespace gil {
+
+/// This one is missing in gil ( color_convert.hpp ).
+template <>
+struct default_color_converter_impl<gray_t,rgba_t>
+{
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const
+    {
+        get_color(dst,red_t())  =
+            channel_convert<typename color_element_type<P2, red_t  >::type>(get_color(src,gray_color_t()));
+        get_color(dst,green_t())=
+            channel_convert<typename color_element_type<P2, green_t>::type>(get_color(src,gray_color_t()));
+        get_color(dst,blue_t()) =
+            channel_convert<typename color_element_type<P2, blue_t >::type>(get_color(src,gray_color_t()));
+
+        typedef typename channel_type< P2 >::type channel_t;
+        get_color(dst,alpha_t()) = channel_traits< channel_t >::max_value();
+    }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // #define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_GRAY_TO_RGBA_HPP
+
Added: trunk/boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_converters/rgb_to_luminance.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,43 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_RGB_TO_LUMINANCE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_RGB_TO_LUMINANCE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file
+/// \brief
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/color_convert.hpp>
+
+namespace boost{ namespace gil { namespace detail {
+
+/// - performance specialization double
+/// - to eliminate compiler warning 4244
+template <typename GrayChannelValue>
+struct rgb_to_luminance_fn< double, double, double, GrayChannelValue >
+{
+    GrayChannelValue operator()( const double& red
+                               , const double& green
+                               , const double& blue    ) const
+   {
+      return channel_convert<GrayChannelValue>( red * 0.30 + green * 0.59 + blue * 0.11 );
+   }
+};
+
+} // namespace detail
+} // namespace gil
+} // namespace boost
+
+#endif // #define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_CONVERTERS_RGB_TO_LUMINANCE_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,29 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file color_spaces.hpp
+/// \brief Color spaces for toolbox extension.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/color_spaces/cmyka.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsl.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/hsv.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/lab.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/xyz.hpp>
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/cmyka.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/cmyka.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,87 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_CMYKA_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_CMYKA_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file cmyka.hpp
+/// \brief Support for cmyka color space.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost\gil\rgba.hpp>
+#include <boost\gil\cmyk.hpp>
+
+#include <boost\gil\color_convert.hpp>
+#include <boost\gil\typedefs.hpp>
+
+namespace boost{ namespace gil {
+
+/// \ingroup ColorSpaceModel
+typedef mpl::vector5<cyan_t,magenta_t,yellow_t,black_t,alpha_t> cmyka_t;
+
+/// \ingroup LayoutModel
+typedef layout<cmyka_t> cmyka_layout_t;
+
+
+GIL_DEFINE_ALL_TYPEDEFS(8,  cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(8s, cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(16, cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(16s,cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(32 ,cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(32s,cmyka)
+GIL_DEFINE_ALL_TYPEDEFS(32f,cmyka)
+
+///// \ingroup ColorConvert
+///// \brief Converting CMYKA to any pixel type. Note: Supports homogeneous pixels only.
+//template <typename C2>
+//struct default_color_converter_impl<cmyka_t,C2> {
+//    template <typename P1, typename P2>
+//    void operator()(const P1& src, P2& dst) const {
+//        typedef typename channel_type<P1>::type T1;
+//        default_color_converter_impl<cmyk_t,C2>()(
+//            pixel<T1,cmyk_layout_t>(channel_multiply(get_color(src,cyan_t()),  get_color(src,alpha_t())), 
+//                                    channel_multiply(get_color(src,magenta_t()),get_color(src,alpha_t())), 
+//                                    channel_multiply(get_color(src,yellow_t()), get_color(src,alpha_t())),
+//									channel_multiply(get_color(src,black_t()), get_color(src,alpha_t())))
+//            ,dst);
+//    }
+//};
+template <>
+struct default_color_converter_impl<cmyka_t,rgba_t> {
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const {
+        typedef typename channel_type<P1>::type T1;
+        default_color_converter_impl<cmyk_t,rgba_t>()(
+            pixel<T1,cmyk_layout_t>(get_color(src,cyan_t()), 
+                                    get_color(src,magenta_t()), 
+                                    get_color(src,yellow_t()),
+									get_color(src,black_t()))
+            ,dst);
+    }
+};
+
+/// \ingroup ColorConvert
+/// \brief Unfortunately CMYKA to CMYKA must be explicitly provided - otherwise we get ambiguous specialization error.
+template <>
+struct default_color_converter_impl<cmyka_t,cmyka_t> {
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const {
+        static_for_each(src,dst,default_channel_converter());
+    }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_CMYKA_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/gray_alpha.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,104 @@
+/*
+    Copyright 2012 Andreas Pokorny
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_GRAY_ALPHA_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_GRAY_ALPHA_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file gray_alpha.hpp
+/// \brief Support for gray_alpha color space.
+/// \author Andreas Pokorny \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/contains.hpp>
+
+#include <boost/gil/gil_config.hpp>
+#include <boost/gil/color_convert.hpp>
+#include <boost/gil/gray.hpp>
+#include <boost/gil/typedefs.hpp>
+
+namespace boost{ namespace gil {
+
+typedef mpl::vector2<gray_color_t,alpha_t> gray_alpha_t;
+
+typedef layout<gray_alpha_t> gray_alpha_layout_t;
+typedef layout<gray_alpha_layout_t, mpl::vector2_c<int,1,0> > alpha_gray_layout_t;
+
+GIL_DEFINE_BASE_TYPEDEFS(8,  alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(8s, alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(16, alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(16s,alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(32 ,alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(32s,alpha_gray)
+GIL_DEFINE_BASE_TYPEDEFS(32f,alpha_gray)
+
+GIL_DEFINE_ALL_TYPEDEFS(8,  gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(8s, gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(16, gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(16s,gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(32 ,gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(32s,gray_alpha)
+GIL_DEFINE_ALL_TYPEDEFS(32f,gray_alpha)
+
+/// \ingroup ColorConvert
+/// \brief Gray Alpha to RGBA
+template <>
+struct default_color_converter_impl<gray_alpha_t,rgba_t> {
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const {
+        get_color(dst,red_t())  =
+            channel_convert<typename color_element_type<P2, red_t>::type>(get_color(src,gray_color_t()));
+        get_color(dst,green_t())=
+            channel_convert<typename color_element_type<P2, green_t>::type>(get_color(src,gray_color_t()));
+        get_color(dst,blue_t()) =
+            channel_convert<typename color_element_type<P2, blue_t>::type>(get_color(src,gray_color_t()));
+        get_color(dst,alpha_t()) =
+            channel_convert<typename color_element_type<P2, alpha_t>::type>(get_color(src,alpha_t()));
+    }
+};
+
+/// \brief Gray Alpha to RGB
+template <>
+struct default_color_converter_impl<gray_alpha_t,rgb_t> {
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const {
+        get_color(dst,red_t())  =
+            channel_convert<typename color_element_type<P2, red_t>::type>(
+                channel_multiply(get_color(src,gray_color_t()),get_color(src,alpha_t()) ) 
+                );
+        get_color(dst,green_t())  =
+            channel_convert<typename color_element_type<P2, green_t>::type>(
+                channel_multiply(get_color(src,gray_color_t()),get_color(src,alpha_t()) ) 
+                );
+        get_color(dst,blue_t())  =
+            channel_convert<typename color_element_type<P2, blue_t>::type>(
+                channel_multiply(get_color(src,gray_color_t()),get_color(src,alpha_t()) ) 
+                );
+    }
+};
+
+/// \brief Gray Alpha to Gray
+template <>
+struct default_color_converter_impl<gray_alpha_t,gray_t> {
+    template <typename P1, typename P2>
+    void operator()(const P1& src, P2& dst) const {
+        get_color(dst,gray_color_t())  =
+            channel_convert<typename color_element_type<P2, gray_color_t>::type>(
+                channel_multiply(get_color(src,gray_color_t()),get_color(src,alpha_t()) ) 
+                );
+    }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_GRAY_ALPHA_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/hsl.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/hsl.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,266 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSL_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSL_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file hsl.hpp
+/// \brief Support for HSL color space
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+namespace boost{ namespace gil {
+
+/// \addtogroup ColorNameModel
+/// \{
+namespace hsl_color_space
+{
+/// \brief Hue
+struct hue_t {};    
+/// \brief Saturation
+struct saturation_t {};
+/// \brief Lightness
+struct lightness_t {}; 
+}
+/// \}
+
+/// \ingroup ColorSpaceModel
+typedef mpl::vector3< hsl_color_space::hue_t
+                    , hsl_color_space::saturation_t
+                    , hsl_color_space::lightness_t
+                    > hsl_t;
+
+/// \ingroup LayoutModel
+typedef layout<hsl_t> hsl_layout_t;
+
+
+GIL_DEFINE_ALL_TYPEDEFS( 32f, hsl );
+
+/// \ingroup ColorConvert
+/// \brief RGB to HSL
+template <>
+struct default_color_converter_impl< rgb_t, hsl_t >
+{
+   template <typename P1, typename P2>
+   void operator()( const P1& src, P2& dst ) const
+   {
+      using namespace hsl_color_space;
+
+      // only bits32f for hsl is supported
+      bits32f temp_red   = channel_convert<bits32f>( get_color( src, red_t()   ));
+      bits32f temp_green = channel_convert<bits32f>( get_color( src, green_t() ));
+      bits32f temp_blue  = channel_convert<bits32f>( get_color( src, blue_t()  ));
+
+      bits32f hue, saturation, lightness;
+
+      bits32f min_color = (std::min)( temp_red, (std::min)( temp_green, temp_blue ));
+      bits32f max_color = (std::max)( temp_red, (std::max)( temp_green, temp_blue ));
+
+      if( abs( min_color - max_color ) < 0.001 )
+      {
+         // rgb color is gray
+
+         hue        = 0.f;
+         saturation = 0.f;
+
+         // doesn't matter which rgb channel we use.
+         lightness = temp_red;
+      }
+      else
+      {
+
+         bits32f diff = max_color - min_color;
+
+         // lightness calculation
+
+         lightness = ( min_color + max_color ) / 2.f;
+
+         // saturation calculation
+
+         if( lightness < 0.5f )
+         {
+            saturation = diff 
+                       / ( min_color + max_color );
+         }
+         else
+         {
+            saturation = ( max_color - min_color ) 
+                       / ( 2.f - diff );
+
+         }
+
+         // hue calculation
+         if( abs( max_color - temp_red ) < 0.0001f )
+         {
+            // max_color is red
+            hue = ( temp_green - temp_blue ) 
+                / diff;
+
+         }
+         else if( abs( max_color - temp_green) < 0.0001f )
+         {
+            // max_color is green
+            // 2.0 + (b - r) / (maxColor - minColor);
+            hue = 2.f 
+                + ( temp_blue - temp_red ) 
+                / diff;
+
+         }
+         else
+         {
+            // max_color is blue
+            hue = 4.f 
+                + ( temp_red - temp_blue ) 
+                / diff;
+         }
+
+         hue /= 6.f;
+         
+         if( hue < 0.f )
+         {
+            hue += 1.f;
+         }
+      }
+
+      get_color( dst,hue_t() )        = hue;
+      get_color( dst,saturation_t() ) = saturation;
+      get_color( dst,lightness_t() )  = lightness;
+   }
+};
+
+/// \ingroup ColorConvert
+/// \brief HSL to RGB
+template <>
+struct default_color_converter_impl<hsl_t,rgb_t>
+{
+   template <typename P1, typename P2>
+   void operator()( const P1& src, P2& dst) const
+   {
+      using namespace hsl_color_space;
+
+      bits32f red, green, blue;
+
+      if( abs( get_color( src, saturation_t() )) < 0.0001  )
+      {
+         // If saturation is 0, the color is a shade of gray
+         red   = get_color( src, lightness_t() );
+         green = get_color( src, lightness_t() );
+         blue  = get_color( src, lightness_t() );
+      }
+      else
+      {
+         float temp1, temp2;
+         float tempr, tempg, tempb;
+
+         //Set the temporary values
+         if( get_color( src, lightness_t() ) < 0.5 ) 
+         {
+            temp2 = get_color( src, lightness_t() )
+                  * ( 1.f + get_color( src, saturation_t() ) );
+         }
+         else
+         {
+            temp2 = ( get_color( src, lightness_t() ) + get_color( src, saturation_t() )) 
+                  - ( get_color( src, lightness_t() ) * get_color( src, saturation_t() ));
+         }
+
+         temp1 = 2.f
+               * get_color( src, lightness_t() ) 
+               - temp2;
+
+         tempr = get_color( src, hue_t() ) + 1.f / 3.f;    
+
+         if( tempr > 1.f )
+         {
+            tempr--;
+         }
+
+         tempg = get_color( src, hue_t() );     
+         tempb = get_color( src, hue_t() ) - 1.f / 3.f;
+
+         if( tempb < 0.f )
+         {
+            tempb++;
+         }
+
+         //Red     
+         if( tempr < 1.f / 6.f )
+         {
+            red = temp1 + ( temp2 - temp1 ) * 6.f * tempr;
+         }
+         else if( tempr < 0.5f )
+         {
+            red = temp2;
+         }
+         else if( tempr < 2.f / 3.f )
+         {
+            red = temp1 + (temp2 - temp1) 
+                * (( 2.f / 3.f ) - tempr) * 6.f;
+         }
+         else
+         {
+            red = temp1;
+         }
+
+         //Green       
+         if( tempg < 1.f / 6.f )
+         {
+            green = temp1 + ( temp2 - temp1 ) * 6.f * tempg;
+         }
+         else if( tempg < 0.5f )
+         {
+            green = temp2;
+         }
+         else if( tempg < 2.f / 3.f )
+         {
+            green = temp1 + ( temp2 - temp1 )
+                  * (( 2.f / 3.f ) - tempg) * 6.f;
+         }
+         else
+         {
+            green = temp1;
+         }
+
+         //Blue    
+         if( tempb < 1.f / 6.f )
+         {
+            blue = temp1 + (temp2 - temp1) * 6.f * tempb;
+         }
+         else if( tempb < 0.5f )
+         {
+            blue = temp2;
+         }
+         else if( tempb < 2.f / 3.f )
+         {
+            blue = temp1 + (temp2 - temp1) 
+                 * (( 2.f / 3.f ) - tempb) * 6.f;
+         }
+         else
+         {
+            blue = temp1;
+         }
+      }
+
+      get_color(dst,red_t())  =
+         channel_convert<typename color_element_type< P2, red_t >::type>( red );
+      get_color(dst,green_t())=
+         channel_convert<typename color_element_type< P2, green_t >::type>( green );
+      get_color(dst,blue_t()) =
+         channel_convert<typename color_element_type< P2, blue_t >::type>( blue );
+   }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSL_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/hsv.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/hsv.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,235 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSV_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSV_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file hsv.hpp
+/// \brief Support for HSV color space
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/cast.hpp>
+
+namespace boost{ namespace gil {
+
+/// \addtogroup ColorNameModel
+/// \{
+namespace hsv_color_space
+{
+/// \brief Hue
+struct hue_t {};    
+/// \brief Saturation
+struct saturation_t{};
+/// \brief Value
+struct value_t {}; 
+}
+/// \}
+
+/// \ingroup ColorSpaceModel
+typedef mpl::vector3< hsv_color_space::hue_t
+                    , hsv_color_space::saturation_t
+                    , hsv_color_space::value_t
+                    > hsv_t;
+
+/// \ingroup LayoutModel
+typedef layout<hsv_t> hsv_layout_t;
+
+GIL_DEFINE_ALL_TYPEDEFS( 32f, hsv )
+
+/// \ingroup ColorConvert
+/// \brief RGB to HSV
+template <>
+struct default_color_converter_impl< rgb_t, hsv_t >
+{
+   template <typename P1, typename P2>
+   void operator()( const P1& src, P2& dst ) const
+   {
+      using namespace hsv_color_space;
+
+      // only bits32f for hsv is supported
+      bits32f temp_red   = channel_convert<bits32f>( get_color( src, red_t()   ));
+      bits32f temp_green = channel_convert<bits32f>( get_color( src, green_t() ));
+      bits32f temp_blue  = channel_convert<bits32f>( get_color( src, blue_t()  ));
+
+      bits32f hue, saturation, value;
+
+      bits32f min_color = (std::min)( temp_red, (std::min)( temp_green, temp_blue ));
+      bits32f max_color = (std::max)( temp_red, (std::max)( temp_green, temp_blue ));
+
+      value = max_color;
+
+      bits32f diff = max_color - min_color;
+
+      if( max_color < 0.0001f )
+      {  
+         saturation = 0.f;
+      }
+      else  
+      {      
+         saturation = diff / max_color;
+      }
+
+
+      if( saturation < 0.0001f )
+      {
+         //it doesn't matter what value it has
+         hue = 0.f; 
+      }   
+      else
+      { 
+         if( (std::abs)( boost::numeric_cast<int>(temp_red - max_color) ) < 0.0001f )
+         {
+            hue = ( temp_green - temp_blue )
+                / diff;
+         }
+         else if( temp_green == max_color )
+         {
+            hue = 2.f + ( temp_blue - temp_red ) 
+                / diff;
+         }
+         else
+         {
+            hue = 4.f + ( temp_red - temp_green ) 
+                / diff;
+         }
+
+         //to bring it to a number between 0 and 1
+         hue /= 6.f; 
+
+         if( hue < 0.f )
+         {
+            hue++;
+         }
+      }
+
+      get_color( dst, hue_t() )        = hue;
+      get_color( dst, saturation_t() ) = saturation;
+      get_color( dst, value_t() )      = value;
+   }
+};
+
+/// \ingroup ColorConvert
+/// \brief HSV to RGB
+template <>
+struct default_color_converter_impl<hsv_t,rgb_t>
+{
+   template <typename P1, typename P2>
+   void operator()( const P1& src, P2& dst) const
+   {
+      using namespace hsv_color_space;
+
+      bits32f red, green, blue;
+
+      //If saturation is 0, the color is a shade of gray
+      if( abs( get_color( src, saturation_t() )) < 0.0001f  )
+      {
+         // If saturation is 0, the color is a shade of gray
+         red   = get_color( src, value_t() );
+         green = get_color( src, value_t() );
+         blue  = get_color( src, value_t() );
+      }
+      else
+      {
+         bits32f frac, p, q, t, h;
+         bits32 i;
+
+         //to bring hue to a number between 0 and 6, better for the calculations
+         h = get_color( src, hue_t() );
+         h *= 6.f;
+
+         i = static_cast<bits32>( floor( h ));
+
+         frac = h - i;
+
+         p = get_color( src, value_t() ) 
+           * ( 1.f - get_color( src, saturation_t() ));
+
+         q = get_color( src, value_t() )
+           * ( 1.f - ( get_color( src, saturation_t() ) * frac ));
+
+         t = get_color( src, value_t() ) 
+           * ( 1.f - ( get_color( src, saturation_t() ) * ( 1.f - frac )));
+
+         switch( i )
+         {         
+            case 0: 
+            {
+               red   = get_color( src, value_t() );
+               green = t;
+               blue  = p;
+
+               break;
+            }
+
+            case 1: 
+            {
+               red   = q;
+               green = get_color( src, value_t() );
+               blue  = p;
+
+               break;
+            }
+
+            case 2: 
+            {
+               red   = p;
+               green = get_color( src, value_t() );
+               blue  = t;
+
+               break;
+            }
+
+            case 3: 
+            {
+               red   = p;
+               green = q;
+               blue  = get_color( src, value_t() );
+
+               break;
+            }
+
+            case 4: 
+            {
+               red   = t;
+               green = p;
+               blue  = get_color( src, value_t() );
+
+               break;
+            }
+
+            case 5: 
+            {
+               red   = get_color( src, value_t() );
+               green = p; 
+               blue  = q;
+
+               break;
+            }
+
+         }
+      }
+
+      get_color(dst,red_t())  =
+         channel_convert<typename color_element_type< P2, red_t >::type>( red );
+      get_color(dst,green_t())=
+         channel_convert<typename color_element_type< P2, green_t >::type>( green );
+      get_color(dst,blue_t()) =
+         channel_convert<typename color_element_type< P2, blue_t >::type>( blue );
+   }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_HSV_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/lab.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/lab.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,179 @@
+/*
+    Copyright 2012 Chung-Lin Wen
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_LAB_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_LAB_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file lab.hpp
+/// \brief Support for CIE Lab color space
+/// \author Chung-Lin Wen \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/cast.hpp>
+#include <boost/gil/gil_all.hpp>
+#include <boost/gil/extension/toolbox/color_spaces/xyz.hpp>
+
+namespace boost{ namespace gil {
+
+/// \addtogroup ColorNameModel
+/// \{
+namespace lab_color_space
+{
+/// \brief Luminance
+struct luminance_t {};    
+/// \brief a Color Component
+struct a_color_opponent_t {};
+/// \brief b Color Component
+struct b_color_opponent_t {}; 
+}
+/// \}
+
+/// \ingroup ColorSpaceModel
+typedef mpl::vector3< lab_color_space::luminance_t
+                    , lab_color_space::a_color_opponent_t
+                    , lab_color_space::b_color_opponent_t
+                    > lab_t;
+
+/// \ingroup LayoutModel
+typedef layout<lab_t> lab_layout_t;
+
+GIL_DEFINE_ALL_TYPEDEFS( 32f, lab );
+
+/// \ingroup ColorConvert
+/// \brief LAB to XYZ
+template <>
+struct default_color_converter_impl< lab_t, xyz_t >
+{
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst ) const
+    {
+        using namespace lab_color_space;
+        using namespace xyz_color_space;
+
+        bits32f p = ((get_color(src, luminance_t()) + 16.f)/116.f);
+
+        get_color(dst, y_t()) =
+                1.f * powf(p, 3.f);
+
+        get_color(dst, x_t()) =
+                0.95047f * powf((p +
+                                 (get_color(src, a_color_opponent_t())/500.f)
+                                 ), 3.f);
+        get_color(dst, z_t()) =
+                1.08883f * powf((p -
+                                 (get_color(src, b_color_opponent_t())/200.f)
+                                 ), 3.f);
+    }
+};
+
+/// \ingroup ColorConvert
+/// \brief XYZ to LAB
+/// \note I assume \c xyz_t
+template <>
+struct default_color_converter_impl< xyz_t, lab_t >
+{
+private:
+    /// \ref http://www.brucelindbloom.com/index.html?Eqn_XYZ_to_Lab.html
+    GIL_FORCEINLINE
+    bits32f forward_companding(bits32f value) const
+    {
+        if (value > 216.f/24389.f)
+        {
+            return powf(value, 1.f/3.f);
+        }
+        else
+        {
+            return ((24389.f/27.f * value + 16.f)/116.f);
+        }
+    }
+
+public:
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst ) const
+    {
+        using namespace lab_color_space;
+
+        bits32f f_y =
+                forward_companding(
+                    channel_convert<bits32f>(
+                        get_color(src, xyz_color_space::y_t())
+                        )
+                    // / 1.f
+                    );
+
+        bits32f f_x =
+                forward_companding(
+                    channel_convert<bits32f>(
+                        get_color(src, xyz_color_space::x_t())
+                        )
+                    * (1.f / 0.95047f)  // if the compiler is smart, it should
+                                        // precalculate this, no?
+                    );
+
+        bits32f f_z =
+                forward_companding(
+                    channel_convert<bits32f>(
+                        get_color(src, xyz_color_space::z_t())
+                        )
+                    * (1.f / 1.08883f)  // if the compiler is smart, it should
+                                        // precalculate this, no?
+                    );
+
+        get_color(dst, luminance_t()) =
+                116.f * f_y - 16.f;
+
+        get_color(dst, a_color_opponent_t()) =
+                500.f * (f_x - f_y);
+
+        get_color(dst, b_color_opponent_t()) =
+                200.f * (f_y - f_z);
+    }
+};
+
+
+/// \ingroup ColorConvert
+/// \brief RGB to LAB
+template <>
+struct default_color_converter_impl< rgb_t, lab_t >
+{
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst ) const
+    {
+        using namespace lab_color_space;
+
+        xyz32f_pixel_t xyz32f_temp_pixel;
+        default_color_converter_impl<rgb_t, xyz_t>()(src, xyz32f_temp_pixel);
+        default_color_converter_impl<xyz_t, lab_t>()(xyz32f_temp_pixel, dst);
+    }
+};
+
+/// \ingroup ColorConvert
+/// \brief LAB to RGB
+template <>
+struct default_color_converter_impl<lab_t,rgb_t>
+{
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst) const
+    {
+        using namespace lab_color_space;
+
+        xyz32f_pixel_t xyz32f_temp_pixel;
+        default_color_converter_impl<lab_t, xyz_t>()(src, xyz32f_temp_pixel);
+        default_color_converter_impl<xyz_t, rgb_t>()(xyz32f_temp_pixel, dst);
+    }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_LAB_HPP
Added: trunk/boost/gil/extension/toolbox/color_spaces/xyz.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/color_spaces/xyz.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,163 @@
+/*
+    Copyright 2012 Chung-Lin Wen, Davide Anastasia
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_XYZ_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_XYZ_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file xyz.hpp
+/// \brief Support for CIE XYZ color space
+/// \author Chung-Lin Wen, Davide Anastasia \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/cast.hpp>
+
+namespace boost{ namespace gil {
+
+/// \addtogroup ColorNameModel
+/// \{
+namespace xyz_color_space
+{
+/// \brief x Color Component
+struct x_t {};    
+/// \brief y Color Component
+struct y_t {};
+/// \brief z Color Component
+struct z_t {}; 
+}
+/// \}
+
+/// \ingroup ColorSpaceModel
+typedef mpl::vector3< xyz_color_space::x_t
+                    , xyz_color_space::y_t
+                    , xyz_color_space::z_t
+                    > xyz_t;
+
+/// \ingroup LayoutModel
+typedef layout<xyz_t> xyz_layout_t;
+
+GIL_DEFINE_ALL_TYPEDEFS( 32f, xyz );
+
+/// \ingroup ColorConvert
+/// \brief RGB to XYZ
+/// Link 
+/// \note rgb_t is assumed to be sRGB D65
+template <>
+struct default_color_converter_impl< rgb_t, xyz_t >
+{
+private:
+    GIL_FORCEINLINE
+    bits32f inverse_companding(bits32f sample) const
+    {
+        if ( sample > 0.04045f )
+        {
+            return powf((( sample + 0.055f ) / 1.055f ), 2.4f);
+        }
+        else
+        {
+            return ( sample / 12.92f );
+        }
+    }
+
+public:
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst ) const
+    {
+        using namespace xyz_color_space;
+
+        bits32f red(
+                    inverse_companding(
+                        channel_convert<bits32f>( get_color( src, red_t() ))
+                        )
+                    );
+        bits32f green(
+                    inverse_companding(
+                        channel_convert<bits32f>( get_color( src, green_t() ))
+                        )
+                    );
+        bits32f blue(
+                    inverse_companding(
+                        channel_convert<bits32f>( get_color( src, blue_t() ))
+                        )
+                    );
+
+        get_color( dst, x_t() ) =
+                red * 0.4124564f +
+                green * 0.3575761f +
+                blue * 0.1804375f;
+        get_color( dst, y_t() ) =
+                red * 0.2126729f +
+                green * 0.7151522f +
+                blue * 0.0721750f;
+        get_color( dst, z_t() ) =
+                red * 0.0193339f +
+                green * 0.1191920f +
+                blue * 0.9503041f;
+    }
+};
+
+/// \ingroup ColorConvert
+/// \brief XYZ to RGB
+template <>
+struct default_color_converter_impl<xyz_t,rgb_t>
+{
+private:
+    GIL_FORCEINLINE
+    bits32f companding(bits32f sample) const
+    {
+        if ( sample > 0.0031308f )
+        {
+            return ( 1.055f * powf( sample, 1.f/2.4f ) - 0.055f );
+        }
+        else
+        {
+            return ( 12.92f * sample );
+        }
+    }
+
+public:
+    template <typename P1, typename P2>
+    void operator()( const P1& src, P2& dst) const
+    {
+        using namespace xyz_color_space;
+
+        // Note: ideally channel_convert should be compiled out, because xyz_t
+        // is bits32f natively only
+        bits32f x( channel_convert<bits32f>( get_color( src, x_t() ) ) );
+        bits32f y( channel_convert<bits32f>( get_color( src, y_t() ) ) );
+        bits32f z( channel_convert<bits32f>( get_color( src, z_t() ) ) );
+
+        get_color(dst,red_t())  =
+                channel_convert<typename color_element_type<P2, red_t>::type>(
+                    companding( x *  3.2404542f +
+                                y * -1.5371385f +
+                                z * -0.4985314f )
+                    );
+        get_color(dst,green_t()) =
+                channel_convert<typename color_element_type<P2, green_t>::type>(
+                    companding( x * -0.9692660f +
+                                y *  1.8760108f +
+                                z *  0.0415560f )
+                    );
+        get_color(dst,blue_t()) =
+                channel_convert<typename color_element_type<P2, blue_t>::type>(
+                    companding( x *  0.0556434f +
+                                y * -0.2040259f +
+                                z *  1.0572252f )
+                    );
+    }
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_COLOR_SPACES_XYZ_HPP
Added: trunk/boost/gil/extension/toolbox/dynamic_images.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/dynamic_images.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,126 @@
+/*
+    Copyright 2005-2007 Adobe Systems Incorporated
+
+    Use, modification and distribution are subject to 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).
+
+    See http://opensource.adobe.com/gil for most recent version including documentation.
+*/
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_DYNAMIC_IMAGES_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_DYNAMIC_IMAGES_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file dynamic_images.hpp
+/// \brief Generic io functions for dealing with dynamic images.
+/// \author Hailin Jin, Lubomir Bourdev, and Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/gil/gil_config.hpp>
+#include <boost/gil/extension/dynamic_image/dynamic_image_all.hpp>
+
+namespace boost { namespace gil {
+
+// need this for various meta functions.
+struct any_image_pixel_t       {};
+struct any_image_channel_t     {};
+struct any_image_color_space_t {};
+
+namespace detail {
+
+template <long N>
+struct construct_matched_t {
+    template <typename Images,typename Pred>
+    static bool apply(any_image<Images>& im,Pred pred) {
+        if (pred.template apply<typename mpl::at_c<Images,N-1>::type>()) {
+            typename mpl::at_c<Images,N-1>::type x;
+            im.move_in(x);
+            return true;
+        } else return construct_matched_t<N-1>::apply(im,pred);
+    }
+};
+template <>
+struct construct_matched_t<0> {
+    template <typename Images,typename Pred>
+    static bool apply(any_image<Images>&,Pred) {return false;}
+};
+
+// A function object that can be passed to apply_operation.
+// Given a predicate IsSupported taking a view type and returning an MPL boolean,
+// calls the apply method of OpClass with the view if the given view IsSupported, or throws an exception otherwise
+template <typename IsSupported, typename OpClass>
+class dynamic_io_fnobj {
+    OpClass* _op;
+
+    template <typename View>
+    void apply(const View& view,mpl::true_ ) {_op->apply(view);}
+
+    template <typename View, typename Info >
+    void apply( const View& view
+              , const Info& info
+              , const mpl::true_
+              )
+    {
+        _op->apply( view, info );
+    }
+
+    template <typename View>
+    void apply(const View& /* view */ ,mpl::false_)
+    {
+        throw std::ios_base::failure( "dynamic_io: unsupported view type for the given file format" );
+    }
+
+    template <typename View, typename Info >
+    void apply( const View& /* view */
+              , const Info& /* info */
+              , const mpl::false_
+              )
+    {
+        throw std::ios_base::failure( "dynamic_io: unsupported view type for the given file format" );
+    }
+
+public:
+    dynamic_io_fnobj(OpClass* op) : _op(op) {}
+
+    typedef void result_type;
+
+    template <typename View>
+    void operator()(const View& view) {apply(view,typename IsSupported::template apply<View>::type());}
+
+    template< typename View, typename Info >
+    void operator()(const View& view, const Info& info )
+    {
+        apply( view
+             , info
+             , typename IsSupported::template apply< View >::type()
+             );
+    }
+
+};
+
+} // namespace detail
+
+/// \brief Within the any_image, constructs an image with the given dimensions
+///        and a type that satisfies the given predicate
+template <typename Images,typename Pred>
+inline bool construct_matched(any_image<Images>& im,Pred pred) {
+    return detail::construct_matched_t<mpl::size<Images>::value>::apply(im,pred);
+}
+
+template<>
+struct color_space_type< any_image_pixel_t >
+{
+    typedef any_image_color_space_t type;
+};
+
+
+} }  // namespace boost::gil
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_DYNAMIC_IMAGES_HPP
Added: trunk/boost/gil/extension/toolbox/image_types.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/image_types.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,24 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IMAGE_TYPES_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IMAGE_TYPES_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file image_types.hpp
+/// \brief Image Types for toolbox extension.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/image_types/indexed_image.hpp>
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IMAGE_TYPES_HPP
Added: trunk/boost/gil/extension/toolbox/image_types/indexed_image.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/image_types/indexed_image.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,364 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_IMAGE_TYPES_INDEXED_IMAGE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_IMAGE_TYPES_INDEXED_IMAGE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file indexed_image.hpp
+/// \brief Indexed Image extension
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/type_traits/is_integral.hpp>
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/gil/image.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+
+namespace boost{ namespace gil {
+
+typedef boost::gil::point2< std::ptrdiff_t > point_t;
+
+template< typename Locator >
+struct get_pixel_type_locator : mpl::if_< typename is_bit_aligned< typename Locator::value_type >::type
+                                        , typename Locator::reference
+                                        , typename Locator::value_type
+                                        > {};
+
+// used for virtual locator
+template< typename IndicesLoc
+        , typename PaletteLoc
+        >
+struct indexed_image_deref_fn_base
+{
+    typedef IndicesLoc indices_locator_t;
+    typedef PaletteLoc palette_locator_t;
+    //typedef typename get_pixel_type_locator< indices_locator_t >::type index_t;
+
+    typedef indexed_image_deref_fn_base     const_t;
+    typedef typename PaletteLoc::value_type value_type;
+    typedef value_type                      reference;
+    typedef value_type                      const_reference;
+    typedef point_t                         argument_type;
+    typedef reference                       result_type;
+
+    static const bool is_mutable = false;
+
+    indexed_image_deref_fn_base() {}
+
+    indexed_image_deref_fn_base( const indices_locator_t& indices_loc
+                               , const palette_locator_t& palette_loc
+                               )
+    : _indices_loc( indices_loc )
+    , _palette_loc( palette_loc )
+    {}
+
+    void set_indices( const indices_locator_t& indices_loc ) { _indices_loc = indices_loc; }
+    void set_palette( const palette_locator_t& palette_loc ) { _palette_loc = palette_loc; }
+
+    const indices_locator_t& indices() const { return _indices_loc; }
+    const palette_locator_t& palette() const { return _palette_loc; }
+
+protected:
+
+    indices_locator_t _indices_loc;
+    palette_locator_t _palette_loc;
+};
+
+
+// used for virtual locator
+template< typename IndicesLoc
+        , typename PaletteLoc
+        , typename Enable = void // there is specilization for integral indices
+        >
+struct indexed_image_deref_fn : indexed_image_deref_fn_base< IndicesLoc
+                                                           , PaletteLoc
+                                                           >
+{
+    typedef indexed_image_deref_fn_base< IndicesLoc
+                                       , PaletteLoc
+                                       > base_t;
+
+
+    indexed_image_deref_fn()
+    : base_t()
+    {}
+
+    indexed_image_deref_fn( const typename base_t::indices_locator_t& indices_loc
+                          , const typename base_t::palette_locator_t& palette_loc
+                          )
+    : base_t( indices_loc
+            , palette_loc
+            )
+    {}
+
+    typename base_t::result_type operator()( const point_t& p ) const
+    {
+        return * this->_palette_loc.xy_at( at_c<0>( *this->_indices_loc.xy_at( p )), 0 );
+    }
+};
+
+
+template< typename IndicesLoc
+        , typename PaletteLoc
+        >
+struct indexed_image_deref_fn< IndicesLoc
+                             , PaletteLoc
+                             , typename boost::enable_if< boost::is_integral< typename IndicesLoc::value_type > >::type
+                             > : indexed_image_deref_fn_base< IndicesLoc
+                                                            , PaletteLoc
+                                                            >
+{
+    typedef indexed_image_deref_fn_base< IndicesLoc
+                                       , PaletteLoc
+                                       > base_t;
+
+    indexed_image_deref_fn()
+    : base_t()
+    {}
+
+    indexed_image_deref_fn( const typename base_t::indices_locator_t& indices_loc
+                          , const typename base_t::palette_locator_t& palette_loc
+                          )
+    : base_t( indices_loc
+            , palette_loc
+            )
+    {}
+
+    typename base_t::result_type operator()( const point_t& p ) const
+    {
+        return *this->_palette_loc.xy_at( *this->_indices_loc.xy_at( p ), 0 );
+    }
+};
+
+template< typename IndicesLoc
+        , typename PaletteLoc
+        >
+struct indexed_image_locator_type
+{
+    typedef virtual_2d_locator< indexed_image_deref_fn< IndicesLoc
+                                                      , PaletteLoc
+                                                      >
+                              , false
+                              > type;
+};
+
+template< typename Locator > // indexed_image_locator_type< ... >::type
+class indexed_image_view : public image_view< Locator >
+{
+public:
+
+    typedef typename Locator::deref_fn_t deref_fn_t;
+    typedef typename deref_fn_t::indices_locator_t indices_locator_t;
+    typedef typename deref_fn_t::palette_locator_t palette_locator_t;
+
+    typedef indexed_image_view< Locator > const_t;
+
+    typedef image_view< indices_locator_t > indices_view_t;
+    typedef image_view< palette_locator_t > palette_view_t;
+
+    indexed_image_view()
+    : image_view< Locator >()
+    , _num_colors( 0 )
+    {}
+
+    indexed_image_view( const point_t& dimensions
+                      , std::size_t    num_colors
+                      , const Locator& locator
+                      )
+    : image_view< Locator >( dimensions, locator )
+    , _num_colors( num_colors )
+    {}
+
+    template< typename IndexedView >
+    indexed_image_view( const IndexedView& iv )
+    : image_view< Locator >( iv )
+    , _num_colors( iv._num_colors )
+    {}
+
+    const std::size_t num_colors() const { return _num_colors; }
+
+
+    const indices_locator_t& indices() const { return get_deref_fn().indices(); }
+    const palette_locator_t& palette() const { return get_deref_fn().palette(); }
+
+    const indices_view_t get_indices_view() const { return indices_view_t( this->dimensions(), indices() ); }
+    const palette_view_t get_palette_view() const { return palette_view_t( point_t( num_colors(), 1 )
+                                                                         , palette()
+                                                                         ); }
+
+private:
+
+    const deref_fn_t& get_deref_fn() const { return this->pixels().deref_fn(); }
+
+private:
+
+    template< typename Locator2 > friend class indexed_image_view;
+
+    std::size_t _num_colors;
+};
+
+
+template< typename Index
+        , typename Pixel
+        , typename IndicesAllocator = std::allocator< unsigned char >
+        , typename PalleteAllocator = std::allocator< unsigned char >
+        >
+class indexed_image
+{
+public:
+
+    typedef image< Index, false, IndicesAllocator > indices_t;
+    typedef image< Pixel, false, PalleteAllocator > palette_t;
+
+    typedef typename indices_t::view_t indices_view_t;
+    typedef typename palette_t::view_t palette_view_t;
+
+    typedef typename indices_t::const_view_t indices_const_view_t;
+    typedef typename palette_t::const_view_t palette_const_view_t;
+
+    typedef typename indices_view_t::locator indices_locator_t;
+    typedef typename palette_view_t::locator palette_locator_t;
+
+    typedef typename indexed_image_locator_type< indices_locator_t
+                                               , palette_locator_t
+                                               >::type locator_t;
+
+    typedef typename indices_t::coord_t x_coord_t;
+    typedef typename indices_t::coord_t y_coord_t;
+
+
+    typedef indexed_image_view< locator_t > view_t;
+    typedef typename view_t::const_t        const_view_t;
+
+    indexed_image( const x_coord_t   width = 0
+                 , const y_coord_t   height = 0
+                 , const std::size_t num_colors = 1
+                 , const std::size_t indices_alignment = 0
+                 , const std::size_t palette_alignment = 0
+                 )
+    : _indices( width     , height, indices_alignment, IndicesAllocator() )
+    , _palette( num_colors,      1, palette_alignment, PalleteAllocator() )
+    {
+        init( point_t( width, height ), num_colors );
+    }
+
+    indexed_image( const point_t&    dimensions
+                 , const std::size_t num_colors = 1
+                 , const std::size_t indices_alignment = 0
+                 , const std::size_t palette_alignment = 0
+                 )
+    : _indices( dimensions,    indices_alignment, IndicesAllocator() )
+    , _palette( num_colors, 1, palette_alignment, PalleteAllocator() )
+    {
+        init( dimensions, num_colors );
+    }
+
+    indexed_image( const indexed_image& img )
+    : _indices( img._indices )
+    , _palette( img._palette )
+    {}
+
+    template <typename Pixel2, typename Index2>
+    indexed_image( const indexed_image< Pixel2, Index2 >& img )
+    {
+        _indices = img._indices;
+        _palette = img._palette;
+    }
+
+    indexed_image& operator= ( const indexed_image& img )
+    {
+        _indices = img._indices;
+        _palette = img._palette;
+
+        return *this;
+    }
+
+    indices_const_view_t get_indices_const_view() const { return static_cast< indices_const_view_t >( _view.get_indices_view()); }
+    palette_const_view_t get_palette_const_view() const { return static_cast< palette_const_view_t >( _view.get_palette_view()); }
+
+    indices_view_t get_indices_view() { return _view.get_indices_view(); }
+    palette_view_t get_palette_view() { return _view.get_palette_view(); }
+
+public:
+
+    view_t _view;
+
+private:
+
+    void init( const point_t&    dimensions
+             , const std::size_t num_colors
+             )
+    {
+        typedef indexed_image_deref_fn< indices_locator_t
+                                      , palette_locator_t
+                                      > defer_fn_t;
+
+        defer_fn_t deref_fn( view( _indices ).xy_at( 0, 0 )
+                           , view( _palette ).xy_at( 0, 0 )
+                           );
+
+        locator_t locator( point_t( 0, 0 )
+                         , point_t( 1, 1 )
+                         , deref_fn
+                         );
+
+        _view = view_t( dimensions
+                      , num_colors
+                      , locator
+                      );
+    }
+
+private:
+
+    indices_t _indices;
+    palette_t _palette;
+};
+
+template< typename Index
+        , typename Pixel
+        >
+inline
+const typename indexed_image< Index, Pixel >::view_t& view( indexed_image< Index, Pixel >& img )
+{
+    return img._view;
+}
+
+template< typename Index
+        , typename Pixel
+        >
+inline
+const typename indexed_image< Index, Pixel >::const_view_t const_view( indexed_image< Index, Pixel >& img )
+{
+    return static_cast< const typename indexed_image< Index, Pixel >::const_view_t>( img._view );
+}
+
+// Whole image has one color and all indices are set to 0.
+template< typename Locator
+        , typename Value
+        >
+void fill_pixels( const indexed_image_view< Locator >& view
+                , const Value&                         value
+                )
+{
+    typedef indexed_image_view< Locator > view_t;
+
+    fill_pixels( view.get_indices_view(), typename view_t::indices_view_t::value_type( 0 ));
+    *view.get_palette_view().begin() = value;
+}
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_IMAGE_TYPES_INDEXED_IMAGE_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,31 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file metafunctions.hpp
+/// \brief Header for toolbox's metafunctions.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/metafunctions/channel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/channel_view.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_similar.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp>
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/channel_type.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/channel_type.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,111 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_CHANNEL_TYPE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_CHANNEL_TYPE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file channel_type.hpp
+/// \brief channel_type metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/utility/enable_if.hpp>
+
+#include <boost/mpl/at.hpp>
+
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/channel.hpp>
+
+#include <boost/gil/extension/toolbox/dynamic_images.hpp>
+
+#include <boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp>
+
+namespace boost{ namespace gil {
+
+/// channel_type metafunction
+/// \brief Generates the channel type for 
+
+template <typename B, typename C, typename L, bool M>  
+struct gen_chan_ref
+{
+	typedef packed_dynamic_channel_reference< B
+	                                        , mpl::at_c< C, 0 >::type::value
+	                                        , M
+	                                        > type;
+};
+
+//! This implementation works for bit_algined_pixel_reference 
+//! with a homogeneous channel layout. 
+//! The result type will be a packed_dynamic_channel_reference, since the 
+//! offset info will be missing. 
+
+// bit_aligned_pixel_reference
+template <typename B, typename C, typename L, bool M>  
+struct channel_type< bit_aligned_pixel_reference<B,C,L,M> > 
+	: lazy_enable_if< is_homogeneous< bit_aligned_pixel_reference< B, C, L, M > >
+                    , gen_chan_ref< B, C, L, M >
+		            > {};
+
+template <typename B, typename C, typename L, bool M>  
+struct channel_type<const bit_aligned_pixel_reference<B,C,L,M> > 
+	: lazy_enable_if< is_homogeneous< bit_aligned_pixel_reference< B, C, L, M > >
+	                , gen_chan_ref< B, C, L, M >
+		            > {};
+
+template <typename B, typename C, typename L>  
+struct gen_chan_ref_p
+{
+	typedef packed_dynamic_channel_reference< B
+	                                        , get_num_bits< typename mpl::at_c<C,0>::type>::value
+	                                        , true
+	                                        > type;
+};
+
+// packed_pixel
+template < typename BitField
+         , typename ChannelRefVec
+         , typename Layout
+         >
+struct channel_type< packed_pixel< BitField
+                                 , ChannelRefVec
+                                 , Layout
+                                 >
+                   > : lazy_enable_if< is_homogeneous< packed_pixel< BitField
+                                                                   , ChannelRefVec
+                                                                   , Layout
+                                                                   >
+                                                     >
+                                     , gen_chan_ref_p< BitField
+                                                     , ChannelRefVec
+                                                     , Layout
+                                                     >
+		                             > {};
+
+template <typename B, typename C, typename L>  
+struct channel_type< const packed_pixel< B, C, L > > 
+	: lazy_enable_if< is_homogeneous<packed_pixel< B, C, L > >
+	                , gen_chan_ref_p< B, C, L >
+		            >
+{};
+
+template<>
+struct channel_type< any_image_pixel_t >
+{
+    typedef any_image_channel_t type;
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_CHANNEL_TYPE_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/channel_view.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/channel_view.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,79 @@
+/*
+    Copyright 2010 Fabien Castan, Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_CHANNEL_VIEW_HPP_INCLUDED
+#define BOOST_GIL_EXTENSION_TOOLBOX_CHANNEL_VIEW_HPP_INCLUDED
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file channel_view.hpp
+/// \brief Helper to generate channel_view type.
+/// \author Fabien Castan, Christian Henning \n
+///
+/// \date   2010 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/gil_all.hpp>
+
+namespace boost {
+namespace gil {
+
+template < typename Channel
+         , typename View
+         >
+struct channel_type_to_index
+{
+    static const int value = gil::detail::type_to_index< typename color_space_type< View >::type // color (mpl::vector)
+                                                       , Channel                                 // channel type
+                                                       >::type::value;                           //< index of the channel in the color (mpl::vector)
+};
+
+template< typename Channel
+        , typename View
+        >
+struct channel_view_type : public kth_channel_view_type< channel_type_to_index< Channel
+                                                                              , View
+                                                                              >::value
+                                                       , View
+                                                       >
+{
+    static const int index = channel_type_to_index< Channel
+                                                  , View
+                                                  >::value;
+                                                  
+    typedef kth_channel_view_type< index
+                                 , View
+                                 > parent_t;
+
+    typedef typename parent_t::type type;
+
+
+    static type make( const View& src )
+    {
+        return parent_t::make( src );
+    }
+};
+
+/// \ingroup ImageViewTransformationsKthChannel
+template< typename Channel
+        , typename View
+        >
+typename channel_view_type< Channel
+                          , View
+                          >::type channel_view( const View& src )
+{
+   return channel_view_type< Channel
+                           , View
+                           >::make( src );
+}
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_CHANNEL_VIEW_HPP_INCLUDED
Added: trunk/boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/get_num_bits.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,60 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_NUM_BITS_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_NUM_BITS_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file get_num_bits.hpp
+/// \brief get_num_bits metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/channel.hpp>
+
+namespace boost{ namespace gil {
+
+/// get_num_bits metafunctions
+/// \brief Determines the numbers of bits for the given channel type.
+
+template <typename T>
+struct get_num_bits;
+
+template< typename B, int I, int S, bool M >
+struct get_num_bits< packed_channel_reference< B, I, S, M > >
+{
+    BOOST_STATIC_CONSTANT( int, value = S );
+};
+
+template<typename B,int I, int S, bool M>
+struct get_num_bits< const packed_channel_reference< B, I, S, M > >
+{
+    BOOST_STATIC_CONSTANT( int, value = S );
+};
+
+template<typename B, int I, bool M>
+struct get_num_bits< packed_dynamic_channel_reference< B, I, M > >
+{
+    BOOST_STATIC_CONSTANT( int, value = I );
+};
+
+template<typename b, int i, bool m>
+struct get_num_bits< const packed_dynamic_channel_reference< b, i, m > >
+{
+    BOOST_STATIC_CONSTANT( int, value = i );
+};
+
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_NUM_BITS_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/get_pixel_type.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,46 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_PIXEL_TYPE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_PIXEL_TYPE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file get_pixel_type.hpp
+/// \brief get_pixel_type metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/dynamic_images.hpp>
+#include <boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp>
+
+namespace boost{ namespace gil {
+
+/// get_pixel_type metafunction
+/// \brief Depending on Image this function generates either 
+///        the pixel type or the reference type in case
+///        the image is bit_aligned.
+template< typename View >
+struct get_pixel_type : mpl::if_< typename is_bit_aligned< typename View::value_type >::type
+                                , typename View::reference
+                                , typename View::value_type
+                                > {};
+
+template< typename ImageViewTypes >
+struct get_pixel_type< any_image_view< ImageViewTypes > >
+{
+    typedef any_image_pixel_t type;
+};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_GET_PIXEL_TYPE_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/gil_extensions.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/gil_extensions.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,42 @@
+/*
+    Copyright 2010 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_GIL_EXTENSIONS_HPP_INCLUDED
+#define BOOST_GIL_EXTENSION_TOOLBOX_GIL_EXTENSIONS_HPP_INCLUDED
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file
+/// \brief Definitions of is_bit_aligned, is_homogeneous, and is_similar metafunctions and
+///        some other goodies.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date   2008 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/gil_all.hpp>
+
+
+#include <boost/mpl/if.hpp>
+
+#include <boost/gil/extension/toolbox/dynamic_images.hpp>
+
+namespace boost { namespace gil {
+
+
+/// other goodies
+
+
+
+
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_GIL_EXTENSIONS_HPP_INCLUDED
Added: trunk/boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/is_bit_aligned.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,47 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_BIT_ALIGNED_TYPE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_BIT_ALIGNED_TYPE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file is_bit_aligned.hpp
+/// \brief is_bit_aligned metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+
+namespace boost{ namespace gil {
+
+/// is_bit_aligned metafunctions
+/// \brief Determines whether the given type is bit_aligned.
+
+template< typename PixelRef >
+struct is_bit_aligned : mpl::false_{};
+
+template <typename B, typename C, typename L, bool M>  
+struct is_bit_aligned<bit_aligned_pixel_reference<B,C,L,M> > : mpl::true_{};
+
+template <typename B, typename C, typename L, bool M>  
+struct is_bit_aligned<const bit_aligned_pixel_reference<B,C,L,M> > : mpl::true_{};
+
+template <typename B, typename C, typename L>  
+struct is_bit_aligned<packed_pixel<B,C,L> > : mpl::true_{};
+
+template <typename B, typename C, typename L>  
+struct is_bit_aligned<const packed_pixel<B,C,L> > : mpl::true_{};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_BIT_ALIGNED_TYPE_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/is_homogeneous.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,93 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_HOMOGENEOUS_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_HOMOGENEOUS_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file is_homogeneous.hpp
+/// \brief is_homogeneous metafunction
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/at.hpp>
+
+#include <boost/gil/pixel.hpp>
+
+
+namespace boost{ namespace gil {
+
+/// is_homogeneous metafunctions
+/// \brief Determines if a pixel types are homogeneous.
+
+template<typename C,typename CMP, int Next, int Last> struct is_homogeneous_impl;
+
+template<typename C,typename CMP, int Last>
+struct is_homogeneous_impl<C,CMP,Last,Last> : mpl::true_{};
+
+template<typename C,typename CMP, int Next, int Last>
+struct is_homogeneous_impl : mpl::and_< is_homogeneous_impl< C, CMP,Next + 1, Last >
+                                      , is_same< CMP, typename mpl::at_c<C,Next>::type
+                                      > > {};
+
+template < typename P > struct is_homogeneous : mpl::false_ {};
+
+// pixel
+template < typename C, typename L > struct is_homogeneous< pixel<C,L> > : mpl::true_ {};
+template < typename C, typename L > struct is_homogeneous<const pixel<C,L> > : mpl::true_ {};
+template < typename C, typename L > struct is_homogeneous< pixel<C,L>& > : mpl::true_ {};
+template < typename C, typename L > struct is_homogeneous<const pixel<C,L>& > : mpl::true_ {};
+
+// planar pixel reference
+template <typename Channel, typename ColorSpace>
+struct is_homogeneous< planar_pixel_reference< Channel, ColorSpace > > : mpl::true_ {};
+template <typename Channel, typename ColorSpace>
+struct is_homogeneous< const planar_pixel_reference< Channel, ColorSpace > > : mpl::true_ {};
+
+template<typename C,typename CMP, int I,int Last>
+struct is_homogeneous_impl_p {};
+
+// for packed_pixel
+template <typename B, typename C, typename L >
+struct is_homogeneous<packed_pixel< B, C, L > > 
+	: is_homogeneous_impl_p< C 
+                           , typename mpl::at_c< C, 0 >::type
+                           , 1
+                           , mpl::size< C >::type::value
+                           > {};
+
+template< typename B
+        , typename C
+        , typename L
+        >  
+struct is_homogeneous< const packed_pixel< B, C, L > > 
+	: is_homogeneous_impl_p< C
+	                       , typename mpl::at_c<C,0>::type
+	                       , 1
+	                       , mpl::size< C >::type::value
+	                       > {};
+
+// for bit_aligned_pixel_reference
+template <typename B, typename C, typename L, bool M>  
+struct is_homogeneous<bit_aligned_pixel_reference<B,C,L,M> > 
+	: is_homogeneous_impl<C,typename mpl::at_c<C,0>::type,1,mpl::size<C>::type::value>
+{};
+
+template <typename B, typename C, typename L, bool M>  
+struct is_homogeneous<const bit_aligned_pixel_reference<B,C,L,M> > 
+	: is_homogeneous_impl<C,typename mpl::at_c<C,0>::type,1,mpl::size<C>::type::value>
+{};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_HOMOGENEOUS_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/is_similar.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/is_similar.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,43 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_SIMILAR_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_SIMILAR_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file is_similar.hpp
+/// \brief is_similar metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/channel.hpp>
+
+namespace boost{ namespace gil {
+
+/// is_similar metafunctions
+/// \brief Determines if two pixel types are similar.
+
+template< typename A, typename B >
+struct is_similar : mpl::false_ {};
+
+template<typename A>
+struct is_similar< A, A > : mpl::true_ {};
+
+template<typename B,int I, int S, bool M, int I2>
+struct is_similar< packed_channel_reference< B,  I, S, M >
+                 , packed_channel_reference< B, I2, S, M >
+                 > : mpl::true_ {};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_IS_SIMILAR_HPP
Added: trunk/boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/metafunctions/pixel_bit_size.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,55 @@
+/*
+    Copyright 2012 Christian Henning, Andreas Pokorny, Lubomir Bourdev
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_PIXEL_BIT_SIZE_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_PIXEL_BIT_SIZE_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file pixel_bit_size.hpp
+/// \brief pixel_bit_size metafunction.
+/// \author Christian Henning, Andreas Pokorny, Lubomir Bourdev \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/int.hpp>
+#include <boost/mpl/accumulate.hpp>
+
+#include <boost/gil/bit_aligned_pixel_reference.hpp>
+#include <boost/gil/packed_pixel.hpp>
+
+namespace boost{ namespace gil {
+
+/// pixel_bit_size metafunctions
+/// \brief Accumulates the all channel size.
+/// 
+/// \code
+/// typedef bit_aligned_image5_type< 16, 16, 16, 8, 8, devicen_layout_t< 5 > >::type image_t;
+/// const int size = pixel_bit_size<image_t::view_t::reference>::value;
+/// \endcode
+template< typename PixelRef >
+struct pixel_bit_size : mpl::int_<0> {};
+
+template <typename B, typename C, typename L, bool M>  
+struct pixel_bit_size<bit_aligned_pixel_reference<B,C,L,M> > : mpl::int_< mpl::accumulate< C, mpl::int_<0>, mpl::plus<mpl::_1, mpl::_2> >::type::value >{};
+
+template <typename B, typename C, typename L, bool M>  
+struct pixel_bit_size<const bit_aligned_pixel_reference<B,C,L,M> > : mpl::int_< mpl::accumulate< C, mpl::int_<0>, mpl::plus<mpl::_1, mpl::_2> >::type::value >{};
+
+template <typename B, typename C, typename L>  
+struct pixel_bit_size<packed_pixel<B,C,L> > : mpl::int_< mpl::accumulate< C, mpl::int_<0>, mpl::plus<mpl::_1, mpl::_2> >::type::value >{};
+
+template <typename B, typename C, typename L>  
+struct pixel_bit_size<const packed_pixel<B,C,L> > : mpl::int_< mpl::accumulate< C, mpl::int_<0>, mpl::plus<mpl::_1, mpl::_2> >::type::value >{};
+
+} // namespace gil
+} // namespace boost
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_METAFUNCTIONS_PIXEL_BIT_SIZE_HPP
Added: trunk/boost/gil/extension/toolbox/toolbox.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/gil/extension/toolbox/toolbox.hpp	2013-02-06 20:37:47 EST (Wed, 06 Feb 2013)
@@ -0,0 +1,29 @@
+/*
+    Copyright 2012 Christian Henning
+    Use, modification and distribution are subject to 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).
+*/
+
+/*************************************************************************************************/
+
+#ifndef BOOST_GIL_EXTENSION_TOOLBOX_TOOLBOX_HPP
+#define BOOST_GIL_EXTENSION_TOOLBOX_TOOLBOX_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file toolbox.hpp
+/// \brief Main header for toolbox extension.
+/// \author Christian Henning \n
+///
+/// \date 2012 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/gil/extension/toolbox/color_converters.hpp>
+#include <boost/gil/extension/toolbox/color_spaces.hpp>
+#include <boost/gil/extension/toolbox/image_types.hpp>
+#include <boost/gil/extension/toolbox/metafunctions.hpp>
+
+#include <boost/gil/extension/toolbox/dynamic_images.hpp>
+
+#endif // BOOST_GIL_EXTENSION_TOOLBOX_TOOLBOX_HPP