summaryrefslogtreecommitdiff
path: root/boost/gil/extension/io/pnm/detail/supported_types.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/gil/extension/io/pnm/detail/supported_types.hpp')
-rw-r--r--boost/gil/extension/io/pnm/detail/supported_types.hpp146
1 files changed, 146 insertions, 0 deletions
diff --git a/boost/gil/extension/io/pnm/detail/supported_types.hpp b/boost/gil/extension/io/pnm/detail/supported_types.hpp
new file mode 100644
index 0000000000..7bede91402
--- /dev/null
+++ b/boost/gil/extension/io/pnm/detail/supported_types.hpp
@@ -0,0 +1,146 @@
+/*
+ Copyright 2008 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_IO_PNM_DETAIL_SUPPORTED_TYPES_HPP
+#define BOOST_GIL_EXTENSION_IO_PNM_DETAIL_SUPPORTED_TYPES_HPP
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// \file
+/// \brief
+/// \author Christian Henning \n
+///
+/// \date 2008 \n
+///
+////////////////////////////////////////////////////////////////////////////////////////
+
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <boost/gil/channel.hpp>
+#include <boost/gil/color_base.hpp>
+
+namespace boost { namespace gil { namespace detail {
+
+// Read Support
+
+template< pnm_image_type::type ASCII_Type
+ , pnm_image_type::type Binary_Type
+ >
+struct pnm_rw_support_base
+{
+ static const pnm_image_type::type _asc_type = ASCII_Type;
+ static const pnm_image_type::type _bin_type = Binary_Type;
+};
+
+template< typename Channel
+ , typename ColorSpace
+ >
+struct pnm_read_support : read_support_false
+ , pnm_rw_support_base< 0
+ , 0
+ > {};
+
+template< typename BitField, bool Mutable >
+struct pnm_read_support< packed_dynamic_channel_reference< BitField
+ , 1
+ , Mutable
+ >
+ , gray_t
+ > : read_support_true
+ , pnm_rw_support_base< pnm_image_type::mono_asc_t::value
+ , pnm_image_type::mono_bin_t::value
+ > {};
+
+template<>
+struct pnm_read_support<uint8_t
+ , gray_t
+ > : read_support_true
+ , pnm_rw_support_base< pnm_image_type::gray_asc_t::value
+ , pnm_image_type::gray_bin_t::value
+ > {};
+
+
+template<>
+struct pnm_read_support<uint8_t
+ , rgb_t
+ > : read_support_true
+ , pnm_rw_support_base< pnm_image_type::color_asc_t::value
+ , pnm_image_type::color_bin_t::value
+ > {};
+
+// Write support
+
+template< typename Channel
+ , typename ColorSpace
+ >
+struct pnm_write_support : write_support_false
+{};
+
+template< typename BitField, bool Mutable >
+struct pnm_write_support< packed_dynamic_channel_reference< BitField
+ , 1
+ , Mutable
+ >
+ , gray_t
+ > : write_support_true
+ , pnm_rw_support_base< pnm_image_type::mono_asc_t::value
+ , pnm_image_type::mono_bin_t::value
+ > {};
+
+
+template<>
+struct pnm_write_support<uint8_t
+ , gray_t
+ > : write_support_true
+ , pnm_rw_support_base< pnm_image_type::gray_asc_t::value
+ , pnm_image_type::gray_bin_t::value
+ > {};
+
+
+template<>
+struct pnm_write_support<uint8_t
+ , rgb_t
+ > : write_support_true
+ , pnm_rw_support_base< pnm_image_type::color_asc_t::value
+ , pnm_image_type::color_bin_t::value
+ > {};
+
+} // namespace detail
+
+template< typename Pixel >
+struct is_read_supported< Pixel
+ , pnm_tag
+ >
+ : mpl::bool_< detail::pnm_read_support< typename channel_type < Pixel >::type
+ , typename color_space_type< Pixel >::type
+ >::is_supported
+ >
+{
+ typedef detail::pnm_read_support< typename channel_type < Pixel >::type
+ , typename color_space_type< Pixel >::type
+ > parent_t;
+
+ static const pnm_image_type::type _asc_type = parent_t::_asc_type;
+ static const pnm_image_type::type _bin_type = parent_t::_bin_type;
+};
+
+template< typename Pixel >
+struct is_write_supported< Pixel
+ , pnm_tag
+ >
+ : mpl::bool_< detail::pnm_write_support< typename channel_type < Pixel >::type
+ , typename color_space_type< Pixel >::type
+ >::is_supported
+ > {};
+
+} // namespace gil
+} // namespace boost
+
+
+#endif