std::vector< Projection::MappedPoint >
ScaledProjection::cut_region_of_interest_( const ROISpecification& r ) const
{
    std::vector< MappedPoint > rv;
    Bounds bb = get_region_of_interest_( r );

    if ( r.guaranteed_row_width ) {
        quantity< camera::length, int > 
            one =1 * camera::pixel, width = bb.width(Direction_X),
            lower = bb.get_lower_edge( Direction_X ), upper = bb.get_upper_edge( Direction_X );
        if ( width < *r.guaranteed_row_width ) { 
            lower -= one; width += one; 
            if ( width < *r.guaranteed_row_width ) 
                { upper += one; width += one; }
        } else if ( width > *r.guaranteed_row_width ) {
            upper -= one; width -= one;
        }
        assert( width == *r.guaranteed_row_width );
        while ( upper >= size.x() )
            { upper -= one; lower -= one; }
        while ( lower < 0 * camera::pixel )
            { lower += one; upper += one; }
        if ( upper >= size.x() )
            throw std::runtime_error("Image is too small for desired ROI");

        bb.set_range( lower, upper, Direction_X );
    }

    ImagePosition pos;
    typedef ImagePosition::Scalar Pixel;
    rv.reserve( bb.volume().value() );
    SamplePosition sample;
    for ( Bounds::const_iterator i = bb.begin(); i != bb.end(); ++i ) {
        rv.push_back( MappedPoint( *i, pixel_in_sample_space(*i) ) );
    }
    return rv;
}