xref: /haiku/headers/libs/agg/agg_trans_double_path.h (revision c90684742e7361651849be4116d0e5de3a817194)
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_DOUBLE_PATH_INCLUDED
17 #define AGG_TRANS_DOUBLE_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_double_path.cpp
26     //
27     //-------------------------------------------------------trans_double_path
28     class trans_double_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_double_path();
41 
42         //--------------------------------------------------------------------
43         void   base_length(double v)  { m_base_length = v; }
44         double base_length() const { return m_base_length; }
45 
46         //--------------------------------------------------------------------
47         void   base_height(double v)  { m_base_height = v; }
48         double base_height() const { return m_base_height; }
49 
50         //--------------------------------------------------------------------
51         void preserve_x_scale(bool f) { m_preserve_x_scale = f;    }
52         bool preserve_x_scale() const { return m_preserve_x_scale; }
53 
54         //--------------------------------------------------------------------
55         void reset();
56         void move_to1(double x, double y);
57         void line_to1(double x, double y);
58         void move_to2(double x, double y);
59         void line_to2(double x, double y);
60         void finalize_paths();
61 
62         //--------------------------------------------------------------------
63         template<class VertexSource1, class VertexSource2>
64         void add_paths(VertexSource1& vs1, VertexSource2& vs2,
65                        unsigned path1_id=0, unsigned path2_id=0)
66         {
67             double x;
68             double y;
69 
70             unsigned cmd;
71 
72             vs1.rewind(path1_id);
73             while(!is_stop(cmd = vs1.vertex(&x, &y)))
74             {
75                 if(is_move_to(cmd))
76                 {
77                     move_to1(x, y);
78                 }
79                 else
80                 {
81                     if(is_vertex(cmd))
82                     {
83                         line_to1(x, y);
84                     }
85                 }
86             }
87 
88             vs2.rewind(path2_id);
89             while(!is_stop(cmd = vs2.vertex(&x, &y)))
90             {
91                 if(is_move_to(cmd))
92                 {
93                     move_to2(x, y);
94                 }
95                 else
96                 {
97                     if(is_vertex(cmd))
98                     {
99                         line_to2(x, y);
100                     }
101                 }
102             }
103             finalize_paths();
104         }
105 
106         //--------------------------------------------------------------------
107         double total_length1() const;
108         double total_length2() const;
109         void transform(double *x, double *y) const;
110 
111     private:
112         double finalize_path(vertex_storage& vertices);
113         void transform1(const vertex_storage& vertices,
114                         double kindex, double kx,
115                         double *x, double* y) const;
116 
117         vertex_storage m_src_vertices1;
118         vertex_storage m_src_vertices2;
119         double         m_base_length;
120         double         m_base_height;
121         double         m_kindex1;
122         double         m_kindex2;
123         status_e       m_status1;
124         status_e       m_status2;
125         bool           m_preserve_x_scale;
126     };
127 
128 }
129 
130 
131 #endif
132