/* 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_ALGORITHM_HPP #define GIL_DYNAMICIMAGE_ALGORITHM_HPP #include "../../algorithm.hpp" #include "any_image.hpp" #include //////////////////////////////////////////////////////////////////////////////////////// /// \file /// \brief Some basic STL-style algorithms when applied to runtime type specified image views /// \author Lubomir Bourdev and Hailin Jin \n /// Adobe Systems Incorporated /// \date 2005-2007 \n Last updated on September 24, 2006 /// //////////////////////////////////////////////////////////////////////////////////////// namespace boost { namespace gil { namespace detail { struct equal_pixels_fn : public binary_operation_obj { template GIL_FORCEINLINE bool apply_compatible(const V1& v1, const V2& v2) const { return equal_pixels(v1,v2); } }; } // namespace detail /// \ingroup ImageViewSTLAlgorithmsEqualPixels template // Model MutableImageViewConcept bool equal_pixels(const any_image_view& src, const View2& dst) { return apply_operation(src,boost::bind(detail::equal_pixels_fn(), _1, dst)); } /// \ingroup ImageViewSTLAlgorithmsEqualPixels template // Model MPL Random Access Container of models of MutableImageViewConcept bool equal_pixels(const View1& src, const any_image_view& dst) { return apply_operation(dst,boost::bind(detail::equal_pixels_fn(), src, _1)); } /// \ingroup ImageViewSTLAlgorithmsEqualPixels template // Model MPL Random Access Container of models of MutableImageViewConcept bool equal_pixels(const any_image_view& src, const any_image_view& dst) { return apply_operation(src,dst,detail::equal_pixels_fn()); } namespace detail { struct copy_pixels_fn : public binary_operation_obj { template GIL_FORCEINLINE void apply_compatible(const View1& src, const View2& dst) const { copy_pixels(src,dst); } }; } /// \ingroup ImageViewSTLAlgorithmsCopyPixels template // Model MutableImageViewConcept void copy_pixels(const any_image_view& src, const View2& dst) { apply_operation(src,boost::bind(detail::copy_pixels_fn(), _1, dst)); } /// \ingroup ImageViewSTLAlgorithmsCopyPixels template // Model MPL Random Access Container of models of MutableImageViewConcept void copy_pixels(const View1& src, const any_image_view& dst) { apply_operation(dst,boost::bind(detail::copy_pixels_fn(), src, _1)); } /// \ingroup ImageViewSTLAlgorithmsCopyPixels template // Model MPL Random Access Container of models of MutableImageViewConcept void copy_pixels(const any_image_view& src, const any_image_view& dst) { apply_operation(src,dst,detail::copy_pixels_fn()); } //forward declaration for default_color_converter (see full definition in color_convert.hpp) struct default_color_converter; /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model ColorConverterConcept void copy_and_convert_pixels(const any_image_view& src, const View2& dst, CC cc) { apply_operation(src,boost::bind(detail::copy_and_convert_pixels_fn(cc), _1, dst)); } /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model MutableImageViewConcept void copy_and_convert_pixels(const any_image_view& src, const View2& dst) { apply_operation(src,boost::bind(detail::copy_and_convert_pixels_fn(), _1, dst)); } /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model ColorConverterConcept void copy_and_convert_pixels(const View1& src, const any_image_view& dst, CC cc) { apply_operation(dst,boost::bind(detail::copy_and_convert_pixels_fn(cc), src, _1)); } /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model MPL Random Access Container of models of MutableImageViewConcept void copy_and_convert_pixels(const View1& src, const any_image_view& dst) { apply_operation(dst,boost::bind(detail::copy_and_convert_pixels_fn(), src, _1)); } /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model ColorConverterConcept void copy_and_convert_pixels(const any_image_view& src, const any_image_view& dst, CC cc) { apply_operation(src,dst,detail::copy_and_convert_pixels_fn(cc)); } /// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels template // Model MPL Random Access Container of models of MutableImageViewConcept void copy_and_convert_pixels(const any_image_view& src, const any_image_view& dst) { apply_operation(src,dst,detail::copy_and_convert_pixels_fn()); } namespace detail { template struct fill_pixels_fn1 { template static void apply(const V& src, const Value& val) { fill_pixels(src,val); } }; // copy_pixels invoked on incompatible images template <> struct fill_pixels_fn1 { template static void apply(const V& src, const Value& val) { throw std::bad_cast();} }; template struct fill_pixels_fn { fill_pixels_fn(const Value& val) : _val(val) {} typedef void result_type; template result_type operator()(const V& img_view) const { fill_pixels_fn1::value>::apply(img_view,_val); } Value _val; }; } /// \ingroup ImageViewSTLAlgorithmsFillPixels /// \brief fill_pixels for any image view. The pixel to fill with must be compatible with the current view template void fill_pixels(const any_image_view& img_view, const Value& val) { apply_operation(img_view,detail::fill_pixels_fn(val)); } } } // namespace boost::gil #endif