
//----------------------------------------------------------------------------
// Anti-Grain Geometry - Version 2.3
// Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
//
// Permission to copy, use, modify, sell and distribute this software
// is granted provided this copyright notice appears in all copies.
// This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
//
//----------------------------------------------------------------------------
// Contact: mcseem@antigrain.com
//          mcseemagg@yahoo.com
//          http://www.antigrain.com
//----------------------------------------------------------------------------
#ifndef AGG_SHORTEN_PATH_INCLUDED
#define AGG_SHORTEN_PATH_INCLUDED
#include "agg_basics.h"
#include "agg_vertex_sequence.h"
namespace agg
{
template<class VertexSequence>
void shorten_path(VertexSequence& vs, FX_FLOAT s, unsigned closed = 0)
{
    typedef typename VertexSequence::value_type vertex_type;
    if(s > 0 && vs.size() > 1) {
        FX_FLOAT d;
        int n = int(vs.size() - 2);
        while(n) {
            d = vs[n].dist;
            if(d > s) {
                break;
            }
            vs.remove_last();
            s -= d;
            --n;
        }
        if(vs.size() < 2) {
            vs.remove_all();
        } else {
            n = vs.size() - 1;
            vertex_type& prev = vs[n - 1];
            vertex_type& last = vs[n];
            d = (prev.dist - s) / prev.dist;
            FX_FLOAT x = prev.x + (last.x - prev.x) * d;
            FX_FLOAT y = prev.y + (last.y - prev.y) * d;
            last.x = x;
            last.y = y;
            if(!prev(last)) {
                vs.remove_last();
            }
            vs.close(closed != 0);
        }
    }
}
}
#endif
