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)
73 template <
class PIXELTYPE>
186 : data_(const_cast<
pointer>(data)),
195 : data_(const_cast<
pointer>(data)),
243 return d.
x >= 0 && d.
y >= 0 &&
252 VIGRA_ASSERT_INSIDE(d);
253 return data_[d.
y*stride_ + d.
x];
262 return data_[d.
y*stride_ + d.
x];
271 return data_[dy*stride_ + dx];
280 return data_[dy*stride_ + dx];
290 return data_ + dy*stride_;
300 return data_ + dy*stride_;
340 vigra_precondition(stride_ == width_,
341 "BasicImageView::begin(): "
342 "can only create scan order iterator if width() == stride().");
351 vigra_precondition(stride_ == width_,
352 "BasicImageView::end(): "
353 "can only create scan order iterator if width() == stride().");
362 vigra_precondition(stride_ == width_,
363 "BasicImageView::begin(): "
364 "can only create scan order iterator if width() == stride().");
373 vigra_precondition(stride_ == width_,
374 "BasicImageView::end(): "
375 "can only create scan order iterator if width() == stride().");
383 return data_ + stride_ * y;
397 return data_ + stride_ * y;
411 typedef typename column_iterator::BaseType Iter;
426 typedef typename const_column_iterator::BaseType Iter;
461 int width_, height_, stride_;
471 template <
class PixelType,
class Accessor>
472 inline triple<typename BasicImageView<PixelType>::const_traverser,
473 typename BasicImageView<PixelType>::const_traverser, Accessor>
474 srcImageRange(BasicImageView<PixelType>
const & img, Accessor a)
476 return triple<typename BasicImageView<PixelType>::const_traverser,
477 typename BasicImageView<PixelType>::const_traverser,
478 Accessor>(img.upperLeft(),
483 template <
class PixelType,
class Accessor>
484 inline triple<typename BasicImageView<PixelType>::const_traverser,
485 typename BasicImageView<PixelType>::const_traverser, Accessor>
486 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi, Accessor a)
488 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
489 roi.right() <= img.width() && roi.bottom() <= img.height(),
490 "srcImageRange(): ROI rectangle outside image.");
491 return triple<typename BasicImageView<PixelType>::const_traverser,
492 typename BasicImageView<PixelType>::const_traverser,
493 Accessor>(img.upperLeft() + roi.upperLeft(),
494 img.upperLeft() + roi.lowerRight(),
498 template <
class PixelType,
class Accessor>
499 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
500 srcImage(BasicImageView<PixelType>
const & img, Accessor a)
502 return pair<typename BasicImageView<PixelType>::const_traverser,
503 Accessor>(img.upperLeft(), a);
506 template <
class PixelType,
class Accessor>
507 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
508 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
510 vigra_precondition(img.isInside(ul),
511 "srcImage(): ROI rectangle outside image.");
512 return pair<typename BasicImageView<PixelType>::const_traverser,
513 Accessor>(img.upperLeft() + ul, a);
516 template <
class PixelType,
class Accessor>
517 inline triple<typename BasicImageView<PixelType>::traverser,
518 typename BasicImageView<PixelType>::traverser, Accessor>
519 destImageRange(BasicImageView<PixelType> & img, Accessor a)
521 return triple<typename BasicImageView<PixelType>::traverser,
522 typename BasicImageView<PixelType>::traverser,
523 Accessor>(img.upperLeft(),
528 template <
class PixelType,
class Accessor>
529 inline triple<typename BasicImageView<PixelType>::traverser,
530 typename BasicImageView<PixelType>::traverser, Accessor>
531 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi, Accessor a)
533 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
534 roi.right() <= img.width() && roi.bottom() <= img.height(),
535 "destImageRange(): ROI rectangle outside image.");
536 return triple<typename BasicImageView<PixelType>::traverser,
537 typename BasicImageView<PixelType>::traverser,
538 Accessor>(img.upperLeft() + roi.upperLeft(),
539 img.upperLeft() + roi.lowerRight(),
543 template <
class PixelType,
class Accessor>
544 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
545 destImage(BasicImageView<PixelType> & img, Accessor a)
547 return pair<typename BasicImageView<PixelType>::traverser,
548 Accessor>(img.upperLeft(), a);
551 template <
class PixelType,
class Accessor>
552 inline pair<typename BasicImageView<PixelType>::traverser, Accessor>
553 destImage(BasicImageView<PixelType> & img, Point2D
const & ul, Accessor a)
555 vigra_precondition(img.isInside(ul),
556 "destImage(): ROI rectangle outside image.");
557 return pair<typename BasicImageView<PixelType>::traverser,
558 Accessor>(img.upperLeft() + ul, a);
561 template <
class PixelType,
class Accessor>
562 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
563 maskImage(BasicImageView<PixelType>
const & img, Accessor a)
565 return pair<typename BasicImageView<PixelType>::const_traverser,
566 Accessor>(img.upperLeft(), a);
569 template <
class PixelType,
class Accessor>
570 inline pair<typename BasicImageView<PixelType>::const_traverser, Accessor>
571 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul, Accessor a)
573 vigra_precondition(img.isInside(ul),
574 "maskImage(): ROI rectangle outside image.");
575 return pair<typename BasicImageView<PixelType>::const_traverser,
576 Accessor>(img.upperLeft() + ul, a);
581 template <
class PixelType>
582 inline triple<typename BasicImageView<PixelType>::const_traverser,
583 typename BasicImageView<PixelType>::const_traverser,
584 typename BasicImageView<PixelType>::ConstAccessor>
585 srcImageRange(BasicImageView<PixelType>
const & img)
587 return triple<typename BasicImageView<PixelType>::const_traverser,
588 typename BasicImageView<PixelType>::const_traverser,
589 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
594 template <
class PixelType>
595 inline triple<typename BasicImageView<PixelType>::const_traverser,
596 typename BasicImageView<PixelType>::const_traverser,
597 typename BasicImageView<PixelType>::ConstAccessor>
598 srcImageRange(BasicImageView<PixelType>
const & img, Rect2D
const & roi)
600 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
601 roi.right() <= img.width() && roi.bottom() <= img.height(),
602 "srcImageRange(): ROI rectangle outside image.");
603 return triple<typename BasicImageView<PixelType>::const_traverser,
604 typename BasicImageView<PixelType>::const_traverser,
605 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + roi.upperLeft(),
606 img.upperLeft() + roi.lowerRight(),
610 template <
class PixelType>
611 inline pair< typename BasicImageView<PixelType>::const_traverser,
612 typename BasicImageView<PixelType>::ConstAccessor>
613 srcImage(BasicImageView<PixelType>
const & img)
615 return pair<typename BasicImageView<PixelType>::const_traverser,
616 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
620 template <
class PixelType>
621 inline pair< typename BasicImageView<PixelType>::const_traverser,
622 typename BasicImageView<PixelType>::ConstAccessor>
623 srcImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
625 vigra_precondition(img.isInside(ul),
626 "srcImage(): ROI rectangle outside image.");
627 return pair<typename BasicImageView<PixelType>::const_traverser,
628 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + ul,
632 template <
class PixelType>
633 inline triple< typename BasicImageView<PixelType>::traverser,
634 typename BasicImageView<PixelType>::traverser,
635 typename BasicImageView<PixelType>::Accessor>
636 destImageRange(BasicImageView<PixelType> & img)
638 return triple<typename BasicImageView<PixelType>::traverser,
639 typename BasicImageView<PixelType>::traverser,
640 typename BasicImageView<PixelType>::Accessor>(img.upperLeft(),
645 template <
class PixelType>
646 inline triple< typename BasicImageView<PixelType>::traverser,
647 typename BasicImageView<PixelType>::traverser,
648 typename BasicImageView<PixelType>::Accessor>
649 destImageRange(BasicImageView<PixelType> & img, Rect2D
const & roi)
651 vigra_precondition(roi.left() >= 0 && roi.top() >= 0 &&
652 roi.right() <= img.width() && roi.bottom() <= img.height(),
653 "destImageRange(): ROI rectangle outside image.");
654 return triple<typename BasicImageView<PixelType>::traverser,
655 typename BasicImageView<PixelType>::traverser,
656 typename BasicImageView<PixelType>::Accessor>(img.upperLeft() + roi.upperLeft(),
657 img.upperLeft() + roi.lowerRight(),
661 template <
class PixelType>
662 inline pair< typename BasicImageView<PixelType>::traverser,
663 typename BasicImageView<PixelType>::Accessor>
664 destImage(BasicImageView<PixelType> & img)
666 return pair<typename BasicImageView<PixelType>::traverser,
667 typename BasicImageView<PixelType>::Accessor>(img.upperLeft(),
671 template <
class PixelType>
672 inline pair< typename BasicImageView<PixelType>::traverser,
673 typename BasicImageView<PixelType>::Accessor>
674 destImage(BasicImageView<PixelType> & img, Point2D
const & ul)
676 vigra_precondition(img.isInside(ul),
677 "destImage(): ROI rectangle outside image.");
678 return pair<typename BasicImageView<PixelType>::traverser,
679 typename BasicImageView<PixelType>::Accessor>(img.upperLeft() + ul,
683 template <
class PixelType>
684 inline pair< typename BasicImageView<PixelType>::const_traverser,
685 typename BasicImageView<PixelType>::ConstAccessor>
686 maskImage(BasicImageView<PixelType>
const & img)
688 return pair<typename BasicImageView<PixelType>::const_traverser,
689 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft(),
693 template <
class PixelType>
694 inline pair< typename BasicImageView<PixelType>::const_traverser,
695 typename BasicImageView<PixelType>::ConstAccessor>
696 maskImage(BasicImageView<PixelType>
const & img, Point2D
const & ul)
698 vigra_precondition(img.isInside(ul),
699 "maskImage(): ROI rectangle outside image.");
700 return pair<typename BasicImageView<PixelType>::const_traverser,
701 typename BasicImageView<PixelType>::ConstAccessor>(img.upperLeft() + ul,
706 #undef VIGRA_ASSERT_INSIDE