btrfs: [] on the end of a struct field is a variable length array.
[haiku.git] / headers / libs / agg / agg_trans_double_path.h
blobc645a7f86902afe6414e9afb047a76217d6962bd
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 //----------------------------------------------------------------------------
16 #ifndef AGG_TRANS_DOUBLE_PATH_INCLUDED
17 #define AGG_TRANS_DOUBLE_PATH_INCLUDED
19 #include "agg_basics.h"
20 #include "agg_vertex_sequence.h"
22 namespace agg
25 // See also: agg_trans_double_path.cpp
27 //-------------------------------------------------------trans_double_path
28 class trans_double_path
30 enum status_e
32 initial,
33 making_path,
34 ready
37 public:
38 typedef vertex_sequence<vertex_dist, 6> vertex_storage;
40 trans_double_path();
42 //--------------------------------------------------------------------
43 void base_length(double v) { m_base_length = v; }
44 double base_length() const { return m_base_length; }
46 //--------------------------------------------------------------------
47 void base_height(double v) { m_base_height = v; }
48 double base_height() const { return m_base_height; }
50 //--------------------------------------------------------------------
51 void preserve_x_scale(bool f) { m_preserve_x_scale = f; }
52 bool preserve_x_scale() const { return m_preserve_x_scale; }
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();
62 //--------------------------------------------------------------------
63 template<class VertexSource1, class VertexSource2>
64 void add_paths(VertexSource1& vs1, VertexSource2& vs2,
65 unsigned path1_id=0, unsigned path2_id=0)
67 double x;
68 double y;
70 unsigned cmd;
72 vs1.rewind(path1_id);
73 while(!is_stop(cmd = vs1.vertex(&x, &y)))
75 if(is_move_to(cmd))
77 move_to1(x, y);
79 else
81 if(is_vertex(cmd))
83 line_to1(x, y);
88 vs2.rewind(path2_id);
89 while(!is_stop(cmd = vs2.vertex(&x, &y)))
91 if(is_move_to(cmd))
93 move_to2(x, y);
95 else
97 if(is_vertex(cmd))
99 line_to2(x, y);
103 finalize_paths();
106 //--------------------------------------------------------------------
107 double total_length1() const;
108 double total_length2() const;
109 void transform(double *x, double *y) const;
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;
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;
131 #endif