|  |  | 
|  | //---------------------------------------------------------------------------- | 
|  | // 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 | 
|  | //---------------------------------------------------------------------------- | 
|  | // | 
|  | // vertex_sequence container and vertex_dist struct | 
|  | // | 
|  | //---------------------------------------------------------------------------- | 
|  | #ifndef AGG_VERTEX_SEQUENCE_INCLUDED | 
|  | #define AGG_VERTEX_SEQUENCE_INCLUDED | 
|  | #include "agg_basics.h" | 
|  | #include "agg_array.h" | 
|  | #include "agg_math.h" | 
|  | namespace pdfium | 
|  | { | 
|  | namespace agg | 
|  | { | 
|  | template<class T, unsigned S = 6> | 
|  | class vertex_sequence : public pod_deque<T, S> | 
|  | { | 
|  | public: | 
|  | typedef pod_deque<T, S> base_type; | 
|  | void add(const T& val); | 
|  | void modify_last(const T& val); | 
|  | void close(bool closed); | 
|  | }; | 
|  | template<class T, unsigned S> | 
|  | void vertex_sequence<T, S>::add(const T& val) | 
|  | { | 
|  | if(base_type::size() > 1) { | 
|  | if(!(*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) { | 
|  | base_type::remove_last(); | 
|  | } | 
|  | } | 
|  | base_type::add(val); | 
|  | } | 
|  | template<class T, unsigned S> | 
|  | void vertex_sequence<T, S>::modify_last(const T& val) | 
|  | { | 
|  | base_type::remove_last(); | 
|  | add(val); | 
|  | } | 
|  | template<class T, unsigned S> | 
|  | void vertex_sequence<T, S>::close(bool closed) | 
|  | { | 
|  | while(base_type::size() > 1) { | 
|  | if((*this)[base_type::size() - 2]((*this)[base_type::size() - 1])) { | 
|  | break; | 
|  | } | 
|  | T t = (*this)[base_type::size() - 1]; | 
|  | base_type::remove_last(); | 
|  | modify_last(t); | 
|  | } | 
|  | if(closed) { | 
|  | while(base_type::size() > 1) { | 
|  | if((*this)[base_type::size() - 1]((*this)[0])) { | 
|  | break; | 
|  | } | 
|  | base_type::remove_last(); | 
|  | } | 
|  | } | 
|  | } | 
|  | const float vertex_dist_epsilon = 1e-14f; | 
|  | struct vertex_dist  { | 
|  | float   x; | 
|  | float   y; | 
|  | float   dist; | 
|  | vertex_dist() {} | 
|  | vertex_dist(float x_, float y_) : | 
|  | x(x_), | 
|  | y(y_), | 
|  | dist(0) | 
|  | { | 
|  | } | 
|  | bool operator () (const vertex_dist& val) | 
|  | { | 
|  | bool ret = (dist = calc_distance(x, y, val.x, val.y)) > vertex_dist_epsilon; | 
|  | return ret; | 
|  | } | 
|  | }; | 
|  | struct vertex_dist_cmd : public vertex_dist { | 
|  | unsigned cmd; | 
|  | vertex_dist_cmd() {} | 
|  | vertex_dist_cmd(float x_, float y_, unsigned cmd_) : | 
|  | vertex_dist(x_, y_), | 
|  | cmd(cmd_) | 
|  | { | 
|  | } | 
|  | }; | 
|  | } | 
|  | }  // namespace pdfium | 
|  | #endif |