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