xref: /haiku/headers/libs/agg/agg_trans_single_path.h (revision 2e7da8455a92f61db667fdaf602308344c4426d6)
1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4 //
5 // Permission to copy, use, modify, sell and distribute this software
6 // is granted provided this copyright notice appears in all copies.
7 // This software is provided "as is" without express or implied
8 // warranty, and with no claim as to its suitability for any purpose.
9 //
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 //          mcseemagg@yahoo.com
13 //          http://www.antigrain.com
14 //----------------------------------------------------------------------------
15 
16 #ifndef AGG_TRANS_SINGLE_PATH_INCLUDED
17 #define AGG_TRANS_SINGLE_PATH_INCLUDED
18 
19 #include "agg_basics.h"
20 #include "agg_vertex_sequence.h"
21 
22 namespace agg
23 {
24 
25     // See also: agg_trans_single_path.cpp
26     //
27     //-------------------------------------------------------trans_single_path
28     class trans_single_path
29     {
30         enum status_e
31         {
32             initial,
33             making_path,
34             ready
35         };
36 
37     public:
38         typedef vertex_sequence<vertex_dist, 6> vertex_storage;
39 
40         trans_single_path();
41 
42         //--------------------------------------------------------------------
base_length(double v)43         void   base_length(double v)  { m_base_length = v; }
base_length()44         double base_length() const { return m_base_length; }
45 
46         //--------------------------------------------------------------------
preserve_x_scale(bool f)47         void preserve_x_scale(bool f) { m_preserve_x_scale = f;    }
preserve_x_scale()48         bool preserve_x_scale() const { return m_preserve_x_scale; }
49 
50         //--------------------------------------------------------------------
51         void reset();
52         void move_to(double x, double y);
53         void line_to(double x, double y);
54         void finalize_path();
55 
56         //--------------------------------------------------------------------
57         template<class VertexSource>
58         void add_path(VertexSource& vs, unsigned path_id=0)
59         {
60             double x;
61             double y;
62 
63             unsigned cmd;
64             vs.rewind(path_id);
65             while(!is_stop(cmd = vs.vertex(&x, &y)))
66             {
67                 if(is_move_to(cmd))
68                 {
69                     move_to(x, y);
70                 }
71                 else
72                 {
73                     if(is_vertex(cmd))
74                     {
75                         line_to(x, y);
76                     }
77                 }
78             }
79             finalize_path();
80         }
81 
82         //--------------------------------------------------------------------
83         double total_length() const;
84         void transform(double *x, double *y) const;
85 
86     private:
87         vertex_storage m_src_vertices;
88         double         m_base_length;
89         double         m_kindex;
90         status_e       m_status;
91         bool           m_preserve_x_scale;
92     };
93 
94 
95 }
96 
97 #endif
98