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)
75 template <
class PIXELTYPE>
245 return d.
x >= 0 && d.
y >= 0 &&
254 VIGRA_ASSERT_INSIDE(d);
255 return data_[d.
y*stride_ + d.
x];
264 return data_[d.
y*stride_ + d.
x];
273 return data_[dy*stride_ + dx];
282 return data_[dy*stride_ + dx];
292 return data_ + dy*stride_;
302 return data_ + dy*stride_;
342 vigra_precondition(stride_ == width_,
343 "BasicImageView::begin(): "
344 "can only create scan order iterator if width() == stride().");
353 vigra_precondition(stride_ == width_,
354 "BasicImageView::end(): "
355 "can only create scan order iterator if width() == stride().");
364 vigra_precondition(stride_ == width_,
365 "BasicImageView::begin(): "
366 "can only create scan order iterator if width() == stride().");
375 vigra_precondition(stride_ == width_,
376 "BasicImageView::end(): "
377 "can only create scan order iterator if width() == stride().");
385 return data_ + stride_ * y;
399 return data_ + stride_ * y;
413 typedef typename column_iterator::BaseType Iter;
428 typedef typename const_column_iterator::BaseType Iter;
463 std::ptrdiff_t width_, height_, stride_;
473 template <
class PixelType,
class Accessor>
474 inline triple<typename BasicImageView<PixelType>::const_traverser,
476 srcImageRange(BasicImageView<PixelType>
const & img, Accessor a)
478 return triple<typename BasicImageView<PixelType>::const_traverser,
480 Accessor>(img.upperLeft(),
485 template <
class PixelType,
class Accessor>
486 inline triple<typename BasicImageView<PixelType>::const_traverser,
488 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi, Accessor a)
490 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
491 roi.right() <= img.width() && roi.bottom() <= img.height(),
492 "srcImageRange(): ROI rectangle outside image.");
493 return triple<typename BasicImageView<PixelType>::const_traverser,
495 Accessor>(img.upperLeft() + roi.upperLeft(),
496 img.upperLeft() + roi.lowerRight(),
500 template <
class PixelType,
class Accessor>
501 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
502 srcImage(BasicImageView<PixelType>
const & img, Accessor a)
504 return pair<typename BasicImageView<PixelType>::const_traverser,
505 Accessor>(img.upperLeft(), a);
508 template <
class PixelType,
class Accessor>
509 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
510 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
512 vigra_precondition(img.isInside(ul),
513 "srcImage(): ROI rectangle outside image.");
514 return pair<typename BasicImageView<PixelType>::const_traverser,
515 Accessor>(img.upperLeft() + ul, a);
518 template <
class PixelType,
class Accessor>
519 inline triple<typename BasicImageView<PixelType>::traverser,
521 destImageRange(BasicImageView<PixelType> & img, Accessor a)
523 return triple<typename BasicImageView<PixelType>::traverser,
525 Accessor>(img.upperLeft(),
530 template <
class PixelType,
class Accessor>
531 inline triple<typename BasicImageView<PixelType>::traverser,
533 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi, Accessor a)
535 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
536 roi.right() <= img.width() && roi.bottom() <= img.height(),
537 "destImageRange(): ROI rectangle outside image.");
538 return triple<typename BasicImageView<PixelType>::traverser,
540 Accessor>(img.upperLeft() + roi.upperLeft(),
541 img.upperLeft() + roi.lowerRight(),
545 template <
class PixelType,
class Accessor>
546 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
547 destImage(BasicImageView<PixelType> & img, Accessor a)
549 return pair<typename BasicImageView<PixelType>::traverser,
550 Accessor>(img.upperLeft(), a);
553 template <
class PixelType,
class Accessor>
554 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
555 destImage(BasicImageView<PixelType> & img, Point2D
const & ul, Accessor a)
557 vigra_precondition(img.isInside(ul),
558 "destImage(): ROI rectangle outside image.");
559 return pair<typename BasicImageView<PixelType>::traverser,
560 Accessor>(img.upperLeft() + ul, a);
563 template <
class PixelType,
class Accessor>
564 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
565 maskImage(BasicImageView<PixelType>
const & img, Accessor a)
567 return pair<typename BasicImageView<PixelType>::const_traverser,
568 Accessor>(img.upperLeft(), a);
571 template <
class PixelType,
class Accessor>
572 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
573 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
575 vigra_precondition(img.isInside(ul),
576 "maskImage(): ROI rectangle outside image.");
577 return pair<typename BasicImageView<PixelType>::const_traverser,
578 Accessor>(img.upperLeft() + ul, a);
583 template <
class PixelType>
584 inline triple<typename BasicImageView<PixelType>::const_traverser,
587 srcImageRange(BasicImageView<PixelType>
const & img)
589 return triple<typename BasicImageView<PixelType>::const_traverser,
596 template <
class PixelType>
597 inline triple<typename BasicImageView<PixelType>::const_traverser,
600 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi)
602 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
603 roi.right() <= img.width() && roi.bottom() <= img.height(),
604 "srcImageRange(): ROI rectangle outside image.");
605 return triple<typename BasicImageView<PixelType>::const_traverser,
608 img.upperLeft() + roi.lowerRight(),
612 template <
class PixelType>
613 inline pair< typename BasicImageView<PixelType>::const_traverser,
615 srcImage(BasicImageView<PixelType>
const & img)
617 return pair<typename BasicImageView<PixelType>::const_traverser,
622 template <
class PixelType>
623 inline pair< typename BasicImageView<PixelType>::const_traverser,
625 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
627 vigra_precondition(img.isInside(ul),
628 "srcImage(): ROI rectangle outside image.");
629 return pair<typename BasicImageView<PixelType>::const_traverser,
634 template <
class PixelType>
635 inline triple< typename BasicImageView<PixelType>::traverser,
638 destImageRange(BasicImageView<PixelType> & img)
640 return triple<typename BasicImageView<PixelType>::traverser,
647 template <
class PixelType>
648 inline triple< typename BasicImageView<PixelType>::traverser,
651 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi)
653 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
654 roi.right() <= img.width() && roi.bottom() <= img.height(),
655 "destImageRange(): ROI rectangle outside image.");
656 return triple<typename BasicImageView<PixelType>::traverser,
659 img.upperLeft() + roi.lowerRight(),
663 template <
class PixelType>
664 inline pair< typename BasicImageView<PixelType>::traverser,
666 destImage(BasicImageView<PixelType> & img)
668 return pair<typename BasicImageView<PixelType>::traverser,
673 template <
class PixelType>
674 inline pair< typename BasicImageView<PixelType>::traverser,
676 destImage(BasicImageView<PixelType> & img, Point2D
const & ul)
678 vigra_precondition(img.isInside(ul),
679 "destImage(): ROI rectangle outside image.");
680 return pair<typename BasicImageView<PixelType>::traverser,
685 template <
class PixelType>
686 inline pair< typename BasicImageView<PixelType>::const_traverser,
688 maskImage(BasicImageView<PixelType>
const & img)
690 return pair<typename BasicImageView<PixelType>::const_traverser,
695 template <
class PixelType>
696 inline pair< typename BasicImageView<PixelType>::const_traverser,
698 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
700 vigra_precondition(img.isInside(ul),
701 "maskImage(): ROI rectangle outside image.");
702 return pair<typename BasicImageView<PixelType>::const_traverser,
708 #undef VIGRA_ASSERT_INSIDE