123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- #ifndef BOOST_GIL_EXTENSION_DYNAMIC_IMAGE_ALGORITHM_HPP
- #define BOOST_GIL_EXTENSION_DYNAMIC_IMAGE_ALGORITHM_HPP
- #include <boost/gil/extension/dynamic_image/any_image.hpp>
- #include <boost/gil/algorithm.hpp>
- #include <boost/variant2/variant.hpp>
- #include <functional>
- #include <utility>
- namespace boost { namespace gil {
- namespace detail {
- struct equal_pixels_fn : binary_operation_obj<equal_pixels_fn, bool>
- {
- template <typename V1, typename V2>
- BOOST_FORCEINLINE
- bool apply_compatible(V1 const& v1, V2 const& v2) const
- {
- return equal_pixels(v1, v2);
- }
- };
- }
- template <typename ...Types, typename View>
- auto equal_pixels(any_image_view<Types...> const& src, View const& dst) -> bool
- {
- return variant2::visit(
- std::bind(detail::equal_pixels_fn(), std::placeholders::_1, dst),
- src);
- }
- template <typename View, typename ...Types>
- auto equal_pixels(View const& src, any_image_view<Types...> const& dst) -> bool
- {
- return variant2::visit(
- std::bind(detail::equal_pixels_fn(), src, std::placeholders::_1),
- dst);
- }
- template <typename ...Types1, typename ...Types2>
- auto equal_pixels(any_image_view<Types1...> const& src, any_image_view<Types2...> const& dst) -> bool
- {
- return variant2::visit(detail::equal_pixels_fn(), src, dst);
- }
- namespace detail {
- struct copy_pixels_fn : public binary_operation_obj<copy_pixels_fn>
- {
- template <typename View1, typename View2>
- BOOST_FORCEINLINE
- void apply_compatible(View1 const& src, View2 const& dst) const
- {
- copy_pixels(src,dst);
- }
- };
- }
- template <typename ...Types, typename View>
- void copy_pixels(any_image_view<Types...> const& src, View const& dst)
- {
- variant2::visit(std::bind(detail::copy_pixels_fn(), std::placeholders::_1, dst), src);
- }
- template <typename ...Types, typename View>
- void copy_pixels(View const& src, any_image_view<Types...> const& dst)
- {
- variant2::visit(std::bind(detail::copy_pixels_fn(), src, std::placeholders::_1), dst);
- }
- template <typename ...Types1, typename ...Types2>
- void copy_pixels(any_image_view<Types1...> const& src, any_image_view<Types2...> const& dst)
- {
- variant2::visit(detail::copy_pixels_fn(), src, dst);
- }
- struct default_color_converter;
- template <typename ...Types, typename View, typename CC>
- void copy_and_convert_pixels(any_image_view<Types...> const& src, View const& dst, CC cc)
- {
- using cc_fn = detail::copy_and_convert_pixels_fn<CC>;
- variant2::visit(std::bind(cc_fn{cc}, std::placeholders::_1, dst), src);
- }
- template <typename ...Types, typename View>
- void copy_and_convert_pixels(any_image_view<Types...> const& src, View const& dst)
- {
- using cc_fn = detail::copy_and_convert_pixels_fn<default_color_converter>;
- variant2::visit(std::bind(cc_fn{}, std::placeholders::_1, dst), src);
- }
- template <typename View, typename ...Types, typename CC>
- void copy_and_convert_pixels(View const& src, any_image_view<Types...> const& dst, CC cc)
- {
- using cc_fn = detail::copy_and_convert_pixels_fn<CC>;
- variant2::visit(std::bind(cc_fn{cc}, src, std::placeholders::_1), dst);
- }
- template <typename View, typename ...Types>
- void copy_and_convert_pixels(View const& src, any_image_view<Types...> const& dst)
- {
- using cc_fn = detail::copy_and_convert_pixels_fn<default_color_converter>;
- variant2::visit(std::bind(cc_fn{}, src, std::placeholders::_1), dst);
- }
- template <typename ...Types1, typename ...Types2, typename CC>
- void copy_and_convert_pixels(
- any_image_view<Types1...> const& src,
- any_image_view<Types2...> const& dst, CC cc)
- {
- variant2::visit(detail::copy_and_convert_pixels_fn<CC>(cc), src, dst);
- }
- template <typename ...Types1, typename ...Types2>
- void copy_and_convert_pixels(
- any_image_view<Types1...> const& src,
- any_image_view<Types2...> const& dst)
- {
- variant2::visit(
- detail::copy_and_convert_pixels_fn<default_color_converter>(), src, dst);
- }
- namespace detail {
- template <bool IsCompatible>
- struct fill_pixels_fn1
- {
- template <typename V, typename Value>
- static void apply(V const& src, Value const& val) { fill_pixels(src, val); }
- };
- template <>
- struct fill_pixels_fn1<false>
- {
- template <typename V, typename Value>
- static void apply(V const&, Value const&) { throw std::bad_cast();}
- };
- template <typename Value>
- struct fill_pixels_fn
- {
- fill_pixels_fn(Value const& val) : val_(val) {}
- using result_type = void;
- template <typename V>
- result_type operator()(V const& view) const
- {
- fill_pixels_fn1
- <
- pixels_are_compatible
- <
- typename V::value_type,
- Value
- >::value
- >::apply(view, val_);
- }
- Value val_;
- };
- }
- template <typename ...Types, typename Value>
- void fill_pixels(any_image_view<Types...> const& view, Value const& val)
- {
- variant2::visit(detail::fill_pixels_fn<Value>(val), view);
- }
- namespace detail {
- template <typename F>
- struct for_each_pixel_fn
- {
- for_each_pixel_fn(F&& fun) : fun_(std::move(fun)) {}
- template <typename View>
- auto operator()(View const& view) -> F
- {
- return for_each_pixel(view, fun_);
- }
- F fun_;
- };
- }
- template <typename ...Types, typename F>
- auto for_each_pixel(any_image_view<Types...> const& view, F fun) -> F
- {
- return variant2::visit(detail::for_each_pixel_fn<F>(std::move(fun)), view);
- }
- }}
- #endif
|