/* | |
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 <boost/bind.hpp> | |
//////////////////////////////////////////////////////////////////////////////////////// | |
/// \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<equal_pixels_fn,bool> { | |
template <typename V1, typename V2> | |
GIL_FORCEINLINE bool apply_compatible(const V1& v1, const V2& v2) const { | |
return equal_pixels(v1,v2); | |
} | |
}; | |
} // namespace detail | |
/// \ingroup ImageViewSTLAlgorithmsEqualPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename View2> // Model MutableImageViewConcept | |
bool equal_pixels(const any_image_view<Types1>& src, const View2& dst) { | |
return apply_operation(src,boost::bind(detail::equal_pixels_fn(), _1, dst)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsEqualPixels | |
template <typename View1, // Model ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
bool equal_pixels(const View1& src, const any_image_view<Types2>& dst) { | |
return apply_operation(dst,boost::bind(detail::equal_pixels_fn(), src, _1)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsEqualPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
bool equal_pixels(const any_image_view<Types1>& src, const any_image_view<Types2>& dst) { | |
return apply_operation(src,dst,detail::equal_pixels_fn()); | |
} | |
namespace detail { | |
struct copy_pixels_fn : public binary_operation_obj<copy_pixels_fn> { | |
template <typename View1, typename View2> | |
GIL_FORCEINLINE void apply_compatible(const View1& src, const View2& dst) const { | |
copy_pixels(src,dst); | |
} | |
}; | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename View2> // Model MutableImageViewConcept | |
void copy_pixels(const any_image_view<Types1>& src, const View2& dst) { | |
apply_operation(src,boost::bind(detail::copy_pixels_fn(), _1, dst)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyPixels | |
template <typename View1, // Model ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
void copy_pixels(const View1& src, const any_image_view<Types2>& dst) { | |
apply_operation(dst,boost::bind(detail::copy_pixels_fn(), src, _1)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
void copy_pixels(const any_image_view<Types1>& src, const any_image_view<Types2>& 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 <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename View2, // Model MutableImageViewConcept | |
typename CC> // Model ColorConverterConcept | |
void copy_and_convert_pixels(const any_image_view<Types1>& src, const View2& dst, CC cc) { | |
apply_operation(src,boost::bind(detail::copy_and_convert_pixels_fn<CC>(cc), _1, dst)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename View2> // Model MutableImageViewConcept | |
void copy_and_convert_pixels(const any_image_view<Types1>& src, const View2& dst) { | |
apply_operation(src,boost::bind(detail::copy_and_convert_pixels_fn<default_color_converter>(), _1, dst)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels | |
template <typename View1, // Model ImageViewConcept | |
typename Types2, // Model MPL Random Access Container of models of MutableImageViewConcept | |
typename CC> // Model ColorConverterConcept | |
void copy_and_convert_pixels(const View1& src, const any_image_view<Types2>& dst, CC cc) { | |
apply_operation(dst,boost::bind(detail::copy_and_convert_pixels_fn<CC>(cc), src, _1)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels | |
template <typename View1, // Model ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
void copy_and_convert_pixels(const View1& src, const any_image_view<Types2>& dst) { | |
apply_operation(dst,boost::bind(detail::copy_and_convert_pixels_fn<default_color_converter>(), src, _1)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename Types2, // Model MPL Random Access Container of models of MutableImageViewConcept | |
typename CC> // Model ColorConverterConcept | |
void copy_and_convert_pixels(const any_image_view<Types1>& src, const any_image_view<Types2>& dst, CC cc) { | |
apply_operation(src,dst,detail::copy_and_convert_pixels_fn<CC>(cc)); | |
} | |
/// \ingroup ImageViewSTLAlgorithmsCopyAndConvertPixels | |
template <typename Types1, // Model MPL Random Access Container of models of ImageViewConcept | |
typename Types2> // Model MPL Random Access Container of models of MutableImageViewConcept | |
void copy_and_convert_pixels(const any_image_view<Types1>& src, const any_image_view<Types2>& dst) { | |
apply_operation(src,dst,detail::copy_and_convert_pixels_fn<default_color_converter>()); | |
} | |
namespace detail { | |
template <bool COMPATIBLE> struct fill_pixels_fn1 { | |
template <typename V, typename Value> static void apply(const V& src, const Value& val) { fill_pixels(src,val); } | |
}; | |
// copy_pixels invoked on incompatible images | |
template <> struct fill_pixels_fn1<false> { | |
template <typename V, typename Value> static void apply(const V& src, const Value& val) { throw std::bad_cast();} | |
}; | |
template <typename Value> | |
struct fill_pixels_fn { | |
fill_pixels_fn(const Value& val) : _val(val) {} | |
typedef void result_type; | |
template <typename V> result_type operator()(const V& img_view) const { | |
fill_pixels_fn1<pixels_are_compatible<typename V::value_type, Value>::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 <typename Types, // Model MPL Random Access Container of models of MutableImageViewConcept | |
typename Value> | |
void fill_pixels(const any_image_view<Types>& img_view, const Value& val) { | |
apply_operation(img_view,detail::fill_pixels_fn<Value>(val)); | |
} | |
} } // namespace boost::gil | |
#endif |