virtual_locator.hpp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /*
  2. Copyright 2005-2007 Adobe Systems Incorporated
  3. Use, modification and distribution are subject to the Boost Software License,
  4. Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. http://www.boost.org/LICENSE_1_0.txt).
  6. See http://opensource.adobe.com/gil for most recent version including documentation.
  7. */
  8. /*************************************************************************************************/
  9. #ifndef GIL_VIRTUAL_LOCATOR_HPP
  10. #define GIL_VIRTUAL_LOCATOR_HPP
  11. ////////////////////////////////////////////////////////////////////////////////////////
  12. /// \file
  13. /// \brief Locator for virtual image views
  14. /// \author Lubomir Bourdev and Hailin Jin \n
  15. /// Adobe Systems Incorporated
  16. /// \date 2005-2007 \n Last updated on February 12, 2007
  17. ///
  18. ////////////////////////////////////////////////////////////////////////////////////////
  19. #include <boost/iterator/iterator_facade.hpp>
  20. #include "position_iterator.hpp"
  21. namespace boost { namespace gil {
  22. /// \brief A 2D locator over a virtual image. Upon dereferencing, invokes a given function object passing it its coordinates. Models: PixelLocatorConcept, HasDynamicXStepTypeConcept, HasDynamicYStepTypeConcept, HasTransposedTypeConcept
  23. /// \ingroup PixelLocatorModel PixelBasedModel
  24. ///
  25. template <typename Deref, bool IsTransposed> // A function object that given a point returns a reference. Models PixelDereferenceAdaptorConcept
  26. class virtual_2d_locator : public pixel_2d_locator_base<virtual_2d_locator<Deref,IsTransposed>, position_iterator<Deref,IsTransposed>, position_iterator<Deref,1-IsTransposed> > {
  27. typedef virtual_2d_locator<Deref,IsTransposed> this_t;
  28. public:
  29. typedef pixel_2d_locator_base<virtual_2d_locator<Deref,IsTransposed>, position_iterator<Deref,IsTransposed>, position_iterator<Deref,1-IsTransposed> > parent_t;
  30. typedef virtual_2d_locator<typename Deref::const_t,IsTransposed> const_t;
  31. typedef Deref deref_fn_t;
  32. typedef typename parent_t::point_t point_t;
  33. typedef typename parent_t::coord_t coord_t;
  34. typedef typename parent_t::x_coord_t x_coord_t;
  35. typedef typename parent_t::y_coord_t y_coord_t;
  36. typedef typename parent_t::x_iterator x_iterator;
  37. typedef typename parent_t::y_iterator y_iterator;
  38. template <typename NewDeref> struct add_deref {
  39. typedef virtual_2d_locator<deref_compose<NewDeref,Deref>,IsTransposed > type;
  40. static type make(const virtual_2d_locator<Deref,IsTransposed>& loc, const NewDeref& nderef) {
  41. return type(loc.pos(), loc.step(), deref_compose<NewDeref,Deref>(nderef,loc.deref_fn()));
  42. }
  43. };
  44. 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) {}
  45. template <typename D, bool TR> virtual_2d_locator(const virtual_2d_locator<D,TR>& loc, coord_t y_step)
  46. : _p(loc.pos(), point_t(loc.step().x,loc.step().y*y_step), loc.deref_fn()) {}
  47. template <typename D, bool TR> virtual_2d_locator(const virtual_2d_locator<D,TR>& loc, coord_t x_step, coord_t y_step, bool transpose=false)
  48. : _p(loc.pos(), transpose ?
  49. point_t(loc.step().x*y_step,loc.step().y*x_step) :
  50. point_t(loc.step().x*x_step,loc.step().y*y_step), loc.deref_fn()) { assert(transpose==(IsTransposed!=TR));}
  51. template <typename D, bool TR> virtual_2d_locator(const virtual_2d_locator<D,TR>& pl) : _p(pl._p) {}
  52. virtual_2d_locator(const virtual_2d_locator& pl) : _p(pl._p) {}
  53. bool operator==(const this_t& p) const { return _p==p._p; }
  54. x_iterator& x() { return *gil_reinterpret_cast<x_iterator*>(this); }
  55. y_iterator& y() { return _p; }
  56. x_iterator const& x() const { return *gil_reinterpret_cast_c<x_iterator const*>(this); }
  57. y_iterator const& y() const { return _p; }
  58. // Returns the y distance between two x_iterators given the difference of their x positions
  59. y_coord_t y_distance_to(const this_t& it2, x_coord_t xDiff) const { return (it2.pos()[1-IsTransposed] - pos()[1-IsTransposed])/step()[1-IsTransposed]; }
  60. bool is_1d_traversable(x_coord_t) const { return false; } // is there no gap at the end of each row? I.e. can we use x_iterator to visit every pixel instead of nested loops?
  61. // Methods specific for virtual 2D locator
  62. const point_t& pos() const { return _p.pos(); }
  63. const point_t& step() const { return _p.step(); }
  64. const deref_fn_t& deref_fn() const { return _p.deref_fn(); }
  65. private:
  66. template <typename D, bool TR> friend class virtual_2d_locator;
  67. y_iterator _p; // contains the current position, the step and the dereference object
  68. };
  69. /////////////////////////////
  70. // PixelBasedConcept
  71. /////////////////////////////
  72. template <typename D, bool TR>
  73. struct channel_type<virtual_2d_locator<D,TR> > : public channel_type<typename virtual_2d_locator<D,TR>::parent_t> {
  74. };
  75. template <typename D, bool TR>
  76. struct color_space_type<virtual_2d_locator<D,TR> > : public color_space_type<typename virtual_2d_locator<D,TR>::parent_t> {
  77. };
  78. template <typename D, bool TR>
  79. struct channel_mapping_type<virtual_2d_locator<D,TR> > : public channel_mapping_type<typename virtual_2d_locator<D,TR>::parent_t> {
  80. };
  81. template <typename D, bool TR>
  82. struct is_planar<virtual_2d_locator<D,TR> > : public is_planar<typename virtual_2d_locator<D,TR>::parent_t> {
  83. };
  84. /////////////////////////////
  85. // HasDynamicXStepTypeConcept
  86. /////////////////////////////
  87. template <typename D, bool TR>
  88. struct dynamic_x_step_type<virtual_2d_locator<D,TR> > {
  89. typedef virtual_2d_locator<D,TR> type;
  90. };
  91. /////////////////////////////
  92. // HasDynamicYStepTypeConcept
  93. /////////////////////////////
  94. template <typename D, bool TR>
  95. struct dynamic_y_step_type<virtual_2d_locator<D,TR> > {
  96. typedef virtual_2d_locator<D,TR> type;
  97. };
  98. /////////////////////////////
  99. // HasTransposedTypeConcept
  100. /////////////////////////////
  101. template <typename D, bool IsTransposed>
  102. struct transposed_type<virtual_2d_locator<D,IsTransposed> > {
  103. typedef virtual_2d_locator<D,1-IsTransposed> type;
  104. };
  105. } } // namespace boost::gil
  106. #endif