36 #ifndef VIGRA_BASICIMAGE_HXX
37 #define VIGRA_BASICIMAGE_HXX
42 #include "iteratortraits.hxx"
43 #include "accessor.hxx"
45 #include "basicimageview.hxx"
48 #ifdef VIGRA_CHECK_BOUNDS
49 #define VIGRA_ASSERT_INSIDE(diff) \
50 vigra_precondition(this->isInside(diff), "Index out of bounds")
52 #define VIGRA_ASSERT_INSIDE(diff)
57 template <
class IMAGEITERATOR>
58 class LineBasedColumnIteratorPolicy
61 typedef IMAGEITERATOR ImageIterator;
62 typedef typename IMAGEITERATOR::LineStartIterator LineStartIterator;
63 typedef typename IMAGEITERATOR::value_type value_type;
64 typedef typename IMAGEITERATOR::difference_type::MoveY
66 typedef typename IMAGEITERATOR::reference reference;
67 typedef typename IMAGEITERATOR::index_reference index_reference;
68 typedef typename IMAGEITERATOR::pointer pointer;
69 typedef std::random_access_iterator_tag iterator_category;
74 explicit BaseType(LineStartIterator c = LineStartIterator(),
75 difference_type o = 0)
76 : line_start_(c), offset_(o)
79 LineStartIterator line_start_;
80 difference_type offset_;
83 static void initialize(BaseType &) {}
85 static reference dereference(BaseType
const & d)
86 {
return const_cast<reference
>(*(*d.line_start_ + d.offset_)); }
88 static index_reference dereference(BaseType
const & d, difference_type n)
90 return const_cast<index_reference
>(*(d.line_start_[n] + d.offset_));
93 static bool equal(BaseType
const & d1, BaseType
const & d2)
94 {
return d1.line_start_ == d2.line_start_; }
96 static bool less(BaseType
const & d1, BaseType
const & d2)
97 {
return d1.line_start_ < d2.line_start_; }
99 static difference_type difference(BaseType
const & d1, BaseType
const & d2)
100 {
return d1.line_start_ - d2.line_start_; }
102 static void increment(BaseType & d)
105 static void decrement(BaseType & d)
108 static void advance(BaseType & d, difference_type n)
109 { d.line_start_ += n; }
124 template <
class IMAGEITERATOR,
class PIXELTYPE,
125 class REFERENCE,
class POINTER,
class LINESTARTITERATOR>
130 PIXELTYPE, REFERENCE, POINTER, LINESTARTITERATOR>
self_type;
132 typedef LINESTARTITERATOR LineStartIterator;
133 typedef PIXELTYPE value_type;
134 typedef PIXELTYPE PixelType;
135 typedef REFERENCE reference;
136 typedef REFERENCE index_reference;
137 typedef POINTER pointer;
139 typedef image_traverser_tag iterator_category;
140 typedef POINTER row_iterator;
144 typedef std::ptrdiff_t MoveX;
145 typedef LINESTARTITERATOR MoveY;
154 return static_cast<IMAGEITERATOR &
>(*this);
161 return static_cast<IMAGEITERATOR &
>(*this);
166 IMAGEITERATOR ret(
static_cast<IMAGEITERATOR
const &
>(*
this));
175 IMAGEITERATOR ret(
static_cast<IMAGEITERATOR
const &
>(*
this));
190 return (x == rhs.x) && (y == rhs.y);
195 return (x != rhs.x) || (y != rhs.y);
198 reference operator*()
const
203 pointer operator->()
const
210 return *(*(y + d.
y) + x + d.
x);
213 index_reference operator()(std::ptrdiff_t dx, std::ptrdiff_t dy)
const
215 return *(*(y + dy) + x + dx);
218 pointer operator[](std::ptrdiff_t dy)
const
223 row_iterator rowIterator()
const
228 typedef typename column_iterator::BaseType Iter;
261 template <
class PIXELTYPE,
class ITERATOR>
264 PIXELTYPE, PIXELTYPE &, PIXELTYPE *, ITERATOR>
269 PIXELTYPE &, PIXELTYPE *, ITERATOR>
Base;
293 template <
class PIXELTYPE,
class ITERATOR>
296 PIXELTYPE, PIXELTYPE const &, PIXELTYPE const *, ITERATOR>
301 PIXELTYPE, PIXELTYPE
const &, PIXELTYPE
const *, ITERATOR>
Base;
333 #ifndef NO_PARTIAL_TEMPLATE_SPECIALIZATION
337 :
public IteratorTraitsBase<BasicImageIterator<T, T**> >
342 typedef DefaultAccessor default_accessor;
343 typedef VigraTrueType hasConstantStrides;
347 struct IteratorTraits<ConstBasicImageIterator<T, T**> >
348 :
public IteratorTraitsBase<ConstBasicImageIterator<T, T**> >
350 typedef BasicImageIterator<T, T**> mutable_iterator;
351 typedef ConstBasicImageIterator<T, T**> const_iterator;
352 typedef typename AccessorTraits<T>::default_const_accessor DefaultAccessor;
353 typedef DefaultAccessor default_accessor;
354 typedef VigraTrueType hasConstantStrides;
359 #define VIGRA_DEFINE_ITERATORTRAITS(VALUETYPE) \
361 struct IteratorTraits<BasicImageIterator<VALUETYPE, VALUETYPE **> > \
362 : public IteratorTraitsBase<BasicImageIterator<VALUETYPE, VALUETYPE **> > \
364 typedef BasicImageIterator<VALUETYPE, VALUETYPE**> mutable_iterator; \
365 typedef ConstBasicImageIterator<VALUETYPE, VALUETYPE**> const_iterator; \
366 typedef typename AccessorTraits<VALUETYPE >::default_accessor DefaultAccessor; \
367 typedef DefaultAccessor default_accessor; \
368 typedef VigraTrueType hasConstantStrides; \
372 struct IteratorTraits<ConstBasicImageIterator<VALUETYPE, VALUETYPE **> > \
373 : public IteratorTraitsBase<ConstBasicImageIterator<VALUETYPE, VALUETYPE **> > \
375 typedef BasicImageIterator<VALUETYPE, VALUETYPE**> mutable_iterator; \
376 typedef ConstBasicImageIterator<VALUETYPE, VALUETYPE**> const_iterator; \
377 typedef typename AccessorTraits<VALUETYPE >::default_const_accessor DefaultAccessor; \
378 typedef DefaultAccessor default_accessor; \
379 typedef VigraTrueType hasConstantStrides; \
382 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<unsigned char>)
383 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<short>)
384 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<unsigned short>)
385 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<int>)
386 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<unsigned int>)
387 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<float>)
388 VIGRA_DEFINE_ITERATORTRAITS(RGBValue<double>)
390 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 2>
391 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
392 #undef VIGRA_PIXELTYPE
393 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 3>
394 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
395 #undef VIGRA_PIXELTYPE
396 #define VIGRA_PIXELTYPE TinyVector<unsigned char, 4>
397 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
398 #undef VIGRA_PIXELTYPE
399 #define VIGRA_PIXELTYPE TinyVector<short, 2>
400 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
401 #undef VIGRA_PIXELTYPE
402 #define VIGRA_PIXELTYPE TinyVector<short, 3>
403 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
404 #undef VIGRA_PIXELTYPE
405 #define VIGRA_PIXELTYPE TinyVector<short, 4>
406 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
407 #undef VIGRA_PIXELTYPE
408 #define VIGRA_PIXELTYPE TinyVector<unsigned short, 2>
409 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
410 #undef VIGRA_PIXELTYPE
411 #define VIGRA_PIXELTYPE TinyVector<unsigned short, 3>
412 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
413 #undef VIGRA_PIXELTYPE
414 #define VIGRA_PIXELTYPE TinyVector<unsigned short, 4>
415 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
416 #undef VIGRA_PIXELTYPE
417 #define VIGRA_PIXELTYPE TinyVector<int, 2>
418 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
419 #undef VIGRA_PIXELTYPE
420 #define VIGRA_PIXELTYPE TinyVector<int, 3>
421 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
422 #undef VIGRA_PIXELTYPE
423 #define VIGRA_PIXELTYPE TinyVector<int, 4>
424 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
425 #undef VIGRA_PIXELTYPE
426 #define VIGRA_PIXELTYPE TinyVector<unsigned int, 2>
427 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
428 #undef VIGRA_PIXELTYPE
429 #define VIGRA_PIXELTYPE TinyVector<unsigned int, 3>
430 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
431 #undef VIGRA_PIXELTYPE
432 #define VIGRA_PIXELTYPE TinyVector<unsigned int, 4>
433 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
434 #undef VIGRA_PIXELTYPE
435 #define VIGRA_PIXELTYPE TinyVector<float, 2>
436 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
437 #undef VIGRA_PIXELTYPE
438 #define VIGRA_PIXELTYPE TinyVector<float, 3>
439 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
440 #undef VIGRA_PIXELTYPE
441 #define VIGRA_PIXELTYPE TinyVector<float, 4>
442 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
443 #undef VIGRA_PIXELTYPE
444 #define VIGRA_PIXELTYPE TinyVector<double, 2>
445 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
446 #undef VIGRA_PIXELTYPE
447 #define VIGRA_PIXELTYPE TinyVector<double, 3>
448 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
449 #undef VIGRA_PIXELTYPE
450 #define VIGRA_PIXELTYPE TinyVector<double, 4>
451 VIGRA_DEFINE_ITERATORTRAITS(VIGRA_PIXELTYPE)
452 #undef VIGRA_PIXELTYPE
454 #undef VIGRA_DEFINE_ITERATORTRAITS
474 template <
class PIXELTYPE,
class Alloc = std::allocator<PIXELTYPE> >
584 typedef Alloc Allocator;
585 typedef typename Alloc::template rebind<PIXELTYPE *>::other LineAllocator;
615 "BasicImage::BasicImage(int width, int height): "
616 "width and height must be >= 0.\n");
630 vigra_precondition((
size.
x >= 0) && (
size.
y >= 0),
631 "BasicImage::BasicImage(Diff2D size): "
632 "size.x and size.y must be >= 0.\n");
650 "BasicImage::BasicImage(int width, int height, value_type const & ): "
651 "width and height must be >= 0.\n");
668 "BasicImage::BasicImage(int width, int height, value_type const & ): "
669 "width and height must be >= 0.\n");
685 vigra_precondition((
size.
x >= 0) && (
size.
y >= 0),
686 "BasicImage::BasicImage(Diff2D const & size, value_type const & v): "
687 "size.x and size.y must be >= 0.\n");
702 vigra_precondition((
size.
x >= 0) && (
size.
y >= 0),
703 "BasicImage::BasicImage(Diff2D const & size, value_type const & v): "
704 "size.x and size.y must be >= 0.\n");
721 "BasicImage::BasicImage(int width, int height, const_pointer ): "
722 "width and height must be >= 0.\n");
737 vigra_precondition((
size.
x >= 0) && (
size.
y >= 0),
738 "BasicImage::BasicImage(Diff2D const & size, const_pointer): "
739 "size.x and size.y must be >= 0.\n");
750 allocator_(rhs.allocator_),
751 pallocator_(rhs.pallocator_)
818 resizeImpl(
width,
height, NumericTraits<value_type>::zero(),
819 CanSkipInitialization<value_type>::value);
863 return d.
x >= 0 && d.
y >= 0 &&
872 VIGRA_ASSERT_INSIDE(d);
873 return lines_[d.
y][d.
x];
881 VIGRA_ASSERT_INSIDE(d);
882 return lines_[d.
y][d.
x];
891 return lines_[dy][dx];
900 return lines_[dy][dx];
927 vigra_precondition(data_ != 0,
928 "BasicImage::upperLeft(): image must have non-zero size.");
938 vigra_precondition(data_ != 0,
939 "BasicImage::lowerRight(): image must have non-zero size.");
947 vigra_precondition(data_ != 0,
948 "BasicImage::upperLeft(): image must have non-zero size.");
958 vigra_precondition(data_ != 0,
959 "BasicImage::lowerRight(): image must have non-zero size.");
967 vigra_precondition(data_ != 0,
968 "BasicImage::begin(): image must have non-zero size.");
976 vigra_precondition(data_ != 0,
977 "BasicImage::end(): image must have non-zero size.");
985 vigra_precondition(data_ != 0,
986 "BasicImage::begin(): image must have non-zero size.");