/* 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 GIL_DYNAMICIMAGE_IMAGE_VIEWS_HPP #define GIL_DYNAMICIMAGE_IMAGE_VIEWS_HPP /*! /// \file /// \brief Methods for constructing any image views from other any image views /// \author Lubomir Bourdev and Hailin Jin \n /// Adobe Systems Incorporated /// \date 2005-2007 \n Last updated on January 31, 2007 /// Extends image view factory to runtime type-specified views (any_image_view) */ #include "any_image_view.hpp" #include "../../image_view_factory.hpp" namespace boost { namespace gil { namespace detail { template struct flipped_up_down_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(flipped_up_down_view(src)); } }; template struct flipped_left_right_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(flipped_left_right_view(src)); } }; template struct rotated90cw_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(rotated90cw_view(src)); } }; template struct rotated90ccw_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(rotated90ccw_view(src)); } }; template struct tranposed_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(tranposed_view(src)); } }; template struct rotated180_view_fn { typedef Result result_type; template result_type operator()(const View& src) const { return result_type(rotated180_view(src)); } }; template struct subimage_view_fn { typedef Result result_type; subimage_view_fn(const point2& topleft, const point2& dimensions) : _topleft(topleft), _size2(dimensions) {} point2 _topleft,_size2; template result_type operator()(const View& src) const { return result_type(subimage_view(src,_topleft,_size2)); } }; template struct subsampled_view_fn { typedef Result result_type; subsampled_view_fn(const point2& step) : _step(step) {} point2 _step; template result_type operator()(const View& src) const { return result_type(subsampled_view(src,_step)); } }; template struct nth_channel_view_fn { typedef Result result_type; nth_channel_view_fn(int n) : _n(n) {} int _n; template result_type operator()(const View& src) const { return result_type(nth_channel_view(src,_n)); } }; template struct color_converted_view_fn { typedef Result result_type; color_converted_view_fn(CC cc = CC()): _cc(cc) {} template result_type operator()(const View& src) const { return result_type(color_converted_view(src, _cc)); } private: CC _cc; }; } // namespace detail /// \ingroup ImageViewTransformationsFlipUD template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_y_step_type >::type flipped_up_down_view(const any_image_view& src) { return apply_operation(src,detail::flipped_up_down_view_fn >::type>()); } /// \ingroup ImageViewTransformationsFlipLR template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_x_step_type >::type flipped_left_right_view(const any_image_view& src) { return apply_operation(src,detail::flipped_left_right_view_fn >::type>()); } /// \ingroup ImageViewTransformationsTransposed template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_transposed_type >::type transposed_view(const any_image_view& src) { return apply_operation(src,detail::tranposed_view_fn >::type>()); } /// \ingroup ImageViewTransformations90CW template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_transposed_type >::type rotated90cw_view(const any_image_view& src) { return apply_operation(src,detail::rotated90cw_view_fn >::type>()); } /// \ingroup ImageViewTransformations90CCW template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_transposed_type >::type rotated90ccw_view(const any_image_view& src) { return apply_operation(src,detail::rotated90ccw_view_fn >::type>()); } /// \ingroup ImageViewTransformations180 template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_type >::type rotated180_view(const any_image_view& src) { return apply_operation(src,detail::rotated180_view_fn >::type>()); } /// \ingroup ImageViewTransformationsSubimage template inline // Models MPL Random Access Container of models of ImageViewConcept any_image_view subimage_view(const any_image_view& src, const point2& topleft, const point2& dimensions) { return apply_operation(src,detail::subimage_view_fn >(topleft,dimensions)); } /// \ingroup ImageViewTransformationsSubimage template inline // Models MPL Random Access Container of models of ImageViewConcept any_image_view subimage_view(const any_image_view& src, int xMin, int yMin, int width, int height) { return apply_operation(src,detail::subimage_view_fn >(point2(xMin,yMin),point2(width,height))); } /// \ingroup ImageViewTransformationsSubsampled template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_type >::type subsampled_view(const any_image_view& src, const point2& step) { return apply_operation(src,detail::subsampled_view_fn >::type>(step)); } /// \ingroup ImageViewTransformationsSubsampled template inline // Models MPL Random Access Container of models of ImageViewConcept typename dynamic_xy_step_type >::type subsampled_view(const any_image_view& src, int xStep, int yStep) { return apply_operation(src,detail::subsampled_view_fn >::type>(point2(xStep,yStep))); } namespace detail { template struct get_nthchannel_type { typedef typename nth_channel_view_type::type type; }; template struct views_get_nthchannel_type : public mpl::transform > {}; } /// \ingroup ImageViewTransformationsNthChannel /// \brief Given a runtime source image view, returns the type of a runtime image view over a single channel of the source view template struct nth_channel_view_type > { typedef any_image_view::type> type; }; /// \ingroup ImageViewTransformationsNthChannel template inline // Models MPL Random Access Container of models of ImageViewConcept typename nth_channel_view_type >::type nth_channel_view(const any_image_view& src, int n) { return apply_operation(src,detail::nth_channel_view_fn >::type>(n)); } namespace detail { template struct get_ccv_type : public color_converted_view_type {}; template struct views_get_ccv_type : public mpl::transform > {}; } /// \ingroup ImageViewTransformationsColorConvert /// \brief Returns the type of a runtime-specified view, color-converted to a given pixel type with user specified color converter template struct color_converted_view_type,DstP,CC> { typedef any_image_view::type> type; }; /// \ingroup ImageViewTransformationsColorConvert /// \brief overload of generic color_converted_view with user defined color-converter template inline // Models MPL Random Access Container of models of ImageViewConcept typename color_converted_view_type, DstP, CC>::type color_converted_view(const any_image_view& src,CC cc) { return apply_operation(src,detail::color_converted_view_fn, DstP, CC>::type >()); } /// \ingroup ImageViewTransformationsColorConvert /// \brief Returns the type of a runtime-specified view, color-converted to a given pixel type with the default coor converter template struct color_converted_view_type,DstP> { typedef any_image_view::type> type; }; /// \ingroup ImageViewTransformationsColorConvert /// \brief overload of generic color_converted_view with the default color-converter template inline // Models MPL Random Access Container of models of ImageViewConcept typename color_converted_view_type, DstP>::type color_converted_view(const any_image_view& src) { return apply_operation(src,detail::color_converted_view_fn, DstP>::type >()); } /// \ingroup ImageViewTransformationsColorConvert /// \brief overload of generic color_converted_view with user defined color-converter /// These are workarounds for GCC 3.4, which thinks color_converted_view is ambiguous with the same method for templated views (in gil/image_view_factory.hpp) template inline // Models MPL Random Access Container of models of ImageViewConcept typename color_converted_view_type, DstP, CC>::type any_color_converted_view(const any_image_view& src,CC cc) { return apply_operation(src,detail::color_converted_view_fn, DstP, CC>::type >()); } /// \ingroup ImageViewTransformationsColorConvert /// \brief overload of generic color_converted_view with the default color-converter /// These are workarounds for GCC 3.4, which thinks color_converted_view is ambiguous with the same method for templated views (in gil/image_view_factory.hpp) template inline // Models MPL Random Access Container of models of ImageViewConcept typename color_converted_view_type, DstP>::type any_color_converted_view(const any_image_view& src) { return apply_operation(src,detail::color_converted_view_fn, DstP>::type >()); } /// \} } } // namespace boost::gil #endif