36 #ifndef VIGRA_BASICIMAGEVIEW_HXX
37 #define VIGRA_BASICIMAGEVIEW_HXX
39 #include "imageiterator.hxx"
40 #include "initimage.hxx"
43 #ifdef VIGRA_CHECK_BOUNDS
44 #define VIGRA_ASSERT_INSIDE(diff) \
45 vigra_precondition(this->isInside(diff), "Index out of bounds")
47 #define VIGRA_ASSERT_INSIDE(diff)
74 template <
class PIXELTYPE>
187 : data_(const_cast<
pointer>(data)),
196 : data_(const_cast<
pointer>(data)),
244 return d.
x >= 0 && d.
y >= 0 &&
253 VIGRA_ASSERT_INSIDE(d);
254 return data_[d.
y*stride_ + d.
x];
263 return data_[d.
y*stride_ + d.
x];
272 return data_[dy*stride_ + dx];
281 return data_[dy*stride_ + dx];
291 return data_ + dy*stride_;
301 return data_ + dy*stride_;
341 vigra_precondition(stride_ == width_,
342 "BasicImageView::begin(): "
343 "can only create scan order iterator if width() == stride().");
352 vigra_precondition(stride_ == width_,
353 "BasicImageView::end(): "
354 "can only create scan order iterator if width() == stride().");
363 vigra_precondition(stride_ == width_,
364 "BasicImageView::begin(): "
365 "can only create scan order iterator if width() == stride().");
374 vigra_precondition(stride_ == width_,
375 "BasicImageView::end(): "
376 "can only create scan order iterator if width() == stride().");
384 return data_ + stride_ * y;
398 return data_ + stride_ * y;
412 typedef typename column_iterator::BaseType Iter;
427 typedef typename const_column_iterator::BaseType Iter;
462 int width_, height_, stride_;
472 template <
class PixelType,
class Accessor>
473 inline triple<typename BasicImageView<PixelType>::const_traverser,
474 typename BasicImageView<PixelType>::const_traverser, Accessor>
475 srcImageRange(BasicImageView<PixelType>
const & img, Accessor a)
477 return triple<typename BasicImageView<PixelType>::const_traverser,
478 typename BasicImageView<PixelType>::const_traverser,
479 Accessor>(img.upperLeft(),
484 template <
class PixelType,
class Accessor>
485 inline triple<typename BasicImageView<PixelType>::const_traverser,
486 typename BasicImageView<PixelType>::const_traverser, Accessor>
487 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi, Accessor a)
489 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
490 roi.right() <= img.width() && roi.bottom() <= img.height(),
491 "srcImageRange(): ROI rectangle outside image.");
492 return triple<typename BasicImageView<PixelType>::const_traverser,
493 typename BasicImageView<PixelType>::const_traverser,
494 Accessor>(img.upperLeft() + roi.upperLeft(),
495 img.upperLeft() + roi.lowerRight(),
499 template <
class PixelType,
class Accessor>
500 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
501 srcImage(BasicImageView<PixelType>
const & img, Accessor a)
503 return pair<typename BasicImageView<PixelType>::const_traverser,
504 Accessor>(img.upperLeft(), a);
507 template <
class PixelType,
class Accessor>
508 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
509 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
511 vigra_precondition(img.isInside(ul),
512 "srcImage(): ROI rectangle outside image.");
513 return pair<typename BasicImageView<PixelType>::const_traverser,
514 Accessor>(img.upperLeft() + ul, a);
517 template <
class PixelType,
class Accessor>
518 inline triple<typename BasicImageView<PixelType>::traverser,
519 typename BasicImageView<PixelType>::traverser, Accessor>
520 destImageRange(BasicImageView<PixelType> & img, Accessor a)
522 return triple<typename BasicImageView<PixelType>::traverser,
523 typename BasicImageView<PixelType>::traverser,
524 Accessor>(img.upperLeft(),
529 template <
class PixelType,
class Accessor>
530 inline triple<typename BasicImageView<PixelType>::traverser,
531 typename BasicImageView<PixelType>::traverser, Accessor>
532 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi, Accessor a)
534 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
535 roi.right() <= img.width() && roi.bottom() <= img.height(),
536 "destImageRange(): ROI rectangle outside image.");
537 return triple<typename BasicImageView<PixelType>::traverser,
538 typename BasicImageView<PixelType>::traverser,
539 Accessor>(img.upperLeft() + roi.upperLeft(),
540 img.upperLeft() + roi.lowerRight(),
544 template <
class PixelType,
class Accessor>
545 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
546 destImage(BasicImageView<PixelType> & img, Accessor a)
548 return pair<typename BasicImageView<PixelType>::traverser,
549 Accessor>(img.upperLeft(), a);
552 template <
class PixelType,
class Accessor>
553 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
554 destImage(BasicImageView<PixelType> & img, Point2D
const & ul, Accessor a)
556 vigra_precondition(img.isInside(ul),
557 "destImage(): ROI rectangle outside image.");
558 return pair<typename BasicImageView<PixelType>::traverser,
559 Accessor>(img.upperLeft() + ul, a);
562 template <
class PixelType,
class Accessor>
563 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
564 maskImage(BasicImageView<PixelType>
const & img, Accessor a)
566 return pair<typename BasicImageView<PixelType>::const_traverser,
567 Accessor>(img.upperLeft(), a);
570 template <
class PixelType,
class Accessor>
571 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
572 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
574 vigra_precondition(img.isInside(ul),
575 "maskImage(): ROI rectangle outside image.");
576 return pair<typename BasicImageView<PixelType>::const_traverser,
577 Accessor>(img.upperLeft() + ul, a);
582 template <
class PixelType>
583 inline triple<typename BasicImageView<PixelType>::const_traverser,
584 typename BasicImageView<PixelType>::const_traverser,
585 typename BasicImageView<PixelType>::ConstAccessor>
586 srcImageRange(BasicImageView<PixelType>
const & img)
588 return triple<typename BasicImageView<PixelType>::const_traverser,
589 typename BasicImageView<PixelType>::const_traverser,
590 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
595 template <
class PixelType>
596 inline triple<typename BasicImageView<PixelType>::const_traverser,
597 typename BasicImageView<PixelType>::const_traverser,
598 typename BasicImageView<PixelType>::ConstAccessor>
599 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi)
601 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
602 roi.right() <= img.width() && roi.bottom() <= img.height(),
603 "srcImageRange(): ROI rectangle outside image.");
604 return triple<typename BasicImageView<PixelType>::const_traverser,
605 typename BasicImageView<PixelType>::const_traverser,
606 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + roi.upperLeft(),
607 img.upperLeft() + roi.lowerRight(),
611 template <
class PixelType>
612 inline pair< typename BasicImageView<PixelType>::const_traverser,
613 typename BasicImageView<PixelType>::ConstAccessor>
614 srcImage(BasicImageView<PixelType>
const & img)
616 return pair<typename BasicImageView<PixelType>::const_traverser,
617 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
621 template <
class PixelType>
622 inline pair< typename BasicImageView<PixelType>::const_traverser,
623 typename BasicImageView<PixelType>::ConstAccessor>
624 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
626 vigra_precondition(img.isInside(ul),
627 "srcImage(): ROI rectangle outside image.");
628 return pair<typename BasicImageView<PixelType>::const_traverser,
629 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + ul,
633 template <
class PixelType>
634 inline triple< typename BasicImageView<PixelType>::traverser,
635 typename BasicImageView<PixelType>::traverser,
636 typename BasicImageView<PixelType>::Accessor>
637 destImageRange(BasicImageView<PixelType> & img)
639 return triple<typename BasicImageView<PixelType>::traverser,
640 typename BasicImageView<PixelType>::traverser,
641 typename BasicImageView<PixelType>::Accessor>(img.upperLeft(),
646 template <
class PixelType>
647 inline triple< typename BasicImageView<PixelType>::traverser,
648 typename BasicImageView<PixelType>::traverser,
649 typename BasicImageView<PixelType>::Accessor>
650 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi)
652 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
653 roi.right() <= img.width() && roi.bottom() <= img.height(),
654 "destImageRange(): ROI rectangle outside image.");
655 return triple<typename BasicImageView<PixelType>::traverser,
656 typename BasicImageView<PixelType>::traverser,
657 typename BasicImageView<PixelType>::Accessor>(img.upperLeft() + roi.upperLeft(),
658 img.upperLeft() + roi.lowerRight(),
662 template <
class PixelType>
663 inline pair< typename BasicImageView<PixelType>::traverser,
664 typename BasicImageView<PixelType>::Accessor>
665 destImage(BasicImageView<PixelType> & img)
667 return pair<typename BasicImageView<PixelType>::traverser,
668 typename BasicImageView<PixelType>::Accessor>(img.upperLeft(),
672 template <
class PixelType>
673 inline pair< typename BasicImageView<PixelType>::traverser,
674 typename BasicImageView<PixelType>::Accessor>
675 destImage(BasicImageView<PixelType> & img, Point2D
const & ul)
677 vigra_precondition(img.isInside(ul),
678 "destImage(): ROI rectangle outside image.");
679 return pair<typename BasicImageView<PixelType>::traverser,
680 typename BasicImageView<PixelType>::Accessor>(img.upperLeft() + ul,
684 template <
class PixelType>
685 inline pair< typename BasicImageView<PixelType>::const_traverser,
686 typename BasicImageView<PixelType>::ConstAccessor>
687 maskImage(BasicImageView<PixelType>
const & img)
689 return pair<typename BasicImageView<PixelType>::const_traverser,
690 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
694 template <
class PixelType>
695 inline pair< typename BasicImageView<PixelType>::const_traverser,
696 typename BasicImageView<PixelType>::ConstAccessor>
697 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
699 vigra_precondition(img.isInside(ul),
700 "maskImage(): ROI rectangle outside image.");
701 return pair<typename BasicImageView<PixelType>::const_traverser,
702 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + ul,
707 #undef VIGRA_ASSERT_INSIDE
int height() const
Definition: basicimageview.hxx:220
IteratorTraits< traverser >::DefaultAccessor Accessor
Definition: basicimageview.hxx:168
reference operator[](difference_type const &d)
Definition: basicimageview.hxx:251
const_traverser upperLeft() const
Definition: basicimageview.hxx:322
ImageIterator< value_type > Iterator
Definition: basicimageview.hxx:131
PIXELTYPE * pointer
Definition: basicimageview.hxx:99
PIXELTYPE const & const_reference
Definition: basicimageview.hxx:95
void initImage(...)
Write a value to every pixel in an image or rectangular ROI.
int y
Definition: diff2d.hxx:392
const_column_iterator columnEnd(int x) const
Definition: basicimageview.hxx:433
BasicImageView(const_pointer data, int w, int h, int stride=0)
Definition: basicimageview.hxx:186
pointer operator[](int dy)
Definition: basicimageview.hxx:288
const_row_iterator rowBegin(int y) const
Definition: basicimageview.hxx:396
column_iterator columnEnd(int x)
Definition: basicimageview.hxx:418
PIXELTYPE & reference
Definition: basicimageview.hxx:90
row_iterator rowBegin(int y)
Definition: basicimageview.hxx:382
reference operator()(int dx, int dy)
Definition: basicimageview.hxx:269
int x
Definition: diff2d.hxx:385
RowIteratorSelector::res row_iterator
Definition: imageiterator.hxx:606
Two dimensional difference vector.
Definition: diff2d.hxx:185
traverser lowerRight()
Definition: basicimageview.hxx:315
ColumnIteratorSelector::res column_iterator
Definition: imageiterator.hxx:610
Size2D size_type
Definition: basicimageview.hxx:163
PIXELTYPE * ScanOrderIterator
Definition: basicimageview.hxx:113
ImageIterator< value_type > traverser
Definition: basicimageview.hxx:127
traverser::column_iterator column_iterator
Definition: basicimageview.hxx:151
column_iterator columnBegin(int x)
Definition: basicimageview.hxx:410
Standard 2D random access const iterator for images that store the data as a linear array...
Definition: imageiterator.hxx:896
ConstImageIterator< value_type > ConstIterator
Definition: basicimageview.hxx:139
PIXELTYPE const * const_iterator
Definition: basicimageview.hxx:119
const_traverser::row_iterator const_row_iterator
Definition: basicimageview.hxx:147
BasicImageView(const_pointer data, difference_type const &size, int stride=0)
Definition: basicimageview.hxx:195
Two dimensional size object.
Definition: diff2d.hxx:482
ConstAccessor accessor() const
Definition: basicimageview.hxx:454
const_iterator end() const
Definition: basicimageview.hxx:372
const_row_iterator rowEnd(int y) const
Definition: basicimageview.hxx:403
traverser::row_iterator row_iterator
Definition: basicimageview.hxx:143
PIXELTYPE * iterator
Definition: basicimageview.hxx:109
iterator end()
Definition: basicimageview.hxx:350
bool isInside(difference_type const &d) const
Definition: basicimageview.hxx:242
const_reference operator[](difference_type const &d) const
Definition: basicimageview.hxx:260
Diff2D difference_type
Definition: basicimageview.hxx:159
BasicImageView()
Definition: basicimageview.hxx:177
const_traverser::column_iterator const_column_iterator
Definition: basicimageview.hxx:155
const_pointer data() const
Definition: basicimageview.hxx:440
const_traverser lowerRight() const
Definition: basicimageview.hxx:331
const_column_iterator columnBegin(int x) const
Definition: basicimageview.hxx:425
BasicImageView & init(value_type const &pixel)
Definition: basicimageview.hxx:204
BasicImage using foreign memory.
Definition: basicimageview.hxx:75
PIXELTYPE value_type
Definition: basicimageview.hxx:81
traverser upperLeft()
Definition: basicimageview.hxx:306
int width() const
Definition: basicimageview.hxx:213
iterator begin()
Definition: basicimageview.hxx:339
const_pointer operator[](int dy) const
Definition: basicimageview.hxx:298
ConstImageIterator< value_type > const_traverser
Definition: basicimageview.hxx:135
IteratorTraits< const_traverser >::DefaultAccessor ConstAccessor
Definition: basicimageview.hxx:173
Standard 2D random access iterator for images that store the data in a linear array.
Definition: imageiterator.hxx:850
const_iterator begin() const
Definition: basicimageview.hxx:361
row_iterator rowEnd(int y)
Definition: basicimageview.hxx:389
Accessor accessor()
Definition: basicimageview.hxx:447
Encapsulate access to the values an iterator points to.
Definition: accessor.hxx:132
const_reference operator()(int dx, int dy) const
Definition: basicimageview.hxx:278
size_type size() const
Definition: basicimageview.hxx:235
PIXELTYPE const * ConstScanOrderIterator
Definition: basicimageview.hxx:123
PIXELTYPE const * const_pointer
Definition: basicimageview.hxx:103
PIXELTYPE PixelType
Definition: basicimageview.hxx:85
int stride() const
Definition: basicimageview.hxx:228