8 #ifndef BOOST_GIL_VIRTUAL_LOCATOR_HPP 9 #define BOOST_GIL_VIRTUAL_LOCATOR_HPP 11 #include <boost/gil/dynamic_step.hpp> 12 #include <boost/gil/position_iterator.hpp> 14 #include <boost/assert.hpp> 15 #include <boost/iterator/iterator_facade.hpp> 17 namespace boost {
namespace gil {
22 template <
typename Deref,
bool IsTransposed>
30 using deref_fn_t = Deref;
33 using coord_t =
typename parent_t::coord_t;
34 using x_coord_t =
typename parent_t::x_coord_t;
35 using y_coord_t =
typename parent_t::y_coord_t;
39 template <
typename NewDeref>
struct add_deref
47 virtual_2d_locator(
const point_t& p=point_t(0,0),
const point_t& step=point_t(1,1),
const deref_fn_t& d=deref_fn_t()) : _p(p,step,d) {}
49 : _p(loc.pos(), point_t(loc.step().x,loc.step().y*y_step), loc.deref_fn()) {}
51 template <
typename D,
bool TR>
55 point_t(loc.step().x * y_step, loc.step().y * x_step) :
56 point_t(loc.step().x * x_step, loc.step().y * y_step)
59 BOOST_ASSERT(transpose == (IsTransposed != TR));
63 virtual_2d_locator(
const virtual_2d_locator& pl) : _p(pl._p) {}
65 bool operator==(
const this_t& p)
const {
return _p==p._p; }
67 x_iterator& x() {
return *gil_reinterpret_cast<x_iterator*>(
this); }
68 y_iterator& y() {
return _p; }
69 x_iterator
const& x()
const {
return *gil_reinterpret_cast_c<x_iterator const*>(
this); }
70 y_iterator
const& y()
const {
return _p; }
73 y_coord_t y_distance_to(
const this_t& it2, x_coord_t)
const {
return (it2.pos()[1-IsTransposed] - pos()[1-IsTransposed])/step()[1-IsTransposed]; }
74 bool is_1d_traversable(x_coord_t)
const {
return false; }
77 const point_t& pos()
const {
return _p.pos(); }
78 const point_t& step()
const {
return _p.step(); }
79 const deref_fn_t& deref_fn()
const {
return _p.deref_fn(); }
81 template <
typename D,
bool TR>
friend class virtual_2d_locator;
89 template <
typename D,
bool TR>
93 template <
typename D,
bool TR>
94 struct color_space_type<virtual_2d_locator<D,TR> > :
public color_space_type<typename virtual_2d_locator<D,TR>::parent_t> {
97 template <
typename D,
bool TR>
98 struct channel_mapping_type<virtual_2d_locator<D,TR> > :
public channel_mapping_type<typename virtual_2d_locator<D,TR>::parent_t> {
101 template <
typename D,
bool TR>
102 struct is_planar<virtual_2d_locator<D,TR> > :
public is_planar<typename virtual_2d_locator<D,TR>::parent_t> {
109 template <
typename D,
bool TR>
119 template <
typename D,
bool TR>
129 template <
typename D,
bool IsTransposed>
132 using type = virtual_2d_locator<D,1-IsTransposed>;
Definition: algorithm.hpp:30
base class for models of PixelLocatorConceptPixel locator is similar to a pixel iterator, but allows for 2D navigation of pixels within an image view. It has a 2D difference_type and supports random access operations like:
Definition: locator.hpp:109
An iterator that remembers its current X,Y position and invokes a function object with it upon derefe...
Definition: position_iterator.hpp:27
A 2D locator over a virtual image. Upon dereferencing, invokes a given function object passing it its...
Definition: virtual_locator.hpp:23
Definition: image_view_factory.hpp:37
Composes two dereference function objects. Similar to std::unary_compose but needs to pull some alias...
Definition: utilities.hpp:105
Base template for types that model HasDynamicYStepTypeConcept.
Definition: dynamic_step.hpp:21
Definition: color_convert.hpp:30
2D point both axes of which have the same dimension typeModels: Point2DConcept
Definition: locator.hpp:28
Base template for types that model HasDynamicXStepTypeConcept.
Definition: dynamic_step.hpp:17