synfig-core  1.0.3
blinepoint.h
Go to the documentation of this file.
1 /* === S Y N F I G ========================================================= */
21 /* ========================================================================= */
22 
23 /* === S T A R T =========================================================== */
24 
25 #ifndef __SYNFIG_BLINEPOINT_H
26 #define __SYNFIG_BLINEPOINT_H
27 
28 /* === H E A D E R S ======================================================= */
29 
30 #include "vector.h"
31 #include "uniqueid.h"
32 #include <algorithm>
33 
34 /* === M A C R O S ========================================================= */
35 
36 /* === T Y P E D E F S ===================================================== */
37 
38 /* === C L A S S E S & S T R U C T S ======================================= */
39 
40 namespace synfig {
41 
42 class BLinePoint : public UniqueID
43 {
44 private:
45  Point vertex_;
46  Vector tangent_[2];
47  float width_;
48  float origin_;
49  bool split_tangent_radius_;
50  bool split_tangent_angle_;
51  bool boned_vertex_;
52  Point vertex_setup_;
53 
54  // True if split_tangent_radius == split_tangent_angle == true otherwise false
55  bool split_tangent_both_;
56  // True if split_tangent_radius == split_tangent_angle == false otherwise false
57  bool merge_tangent_both_;
58 
59  // Used to store the tangent2 when split_radius=true && split_angle==false
60  Vector tangent2_radius_split_;
61  // Used to store the tangent2 when split_radius=false && split_angle==true
62  Vector tangent2_angle_split_;
63 
64  void update_flags();
65  void update_tangent2();
66 
67 public:
68 
70  vertex_(Point(0,0)),
71  width_(1),
72  origin_(0.0),
73  split_tangent_radius_(true),
74  split_tangent_angle_(false),
75  boned_vertex_(false),
76  vertex_setup_(vertex_)
77  {
78  tangent_[0] = Point(0,0);
79  tangent_[1] = Point(0,0);
80  update_flags();
81  }
82 
83  const Point& get_vertex()const { return vertex_; }
84  void set_vertex(const Point& x) { vertex_=x; vertex_setup_=vertex_;}
85 
86  const Vector& get_tangent1()const { return tangent_[0]; }
87  const Vector& get_tangent2()const
88  {
89  if(merge_tangent_both_)
90  return tangent_[0];
91  if(split_tangent_both_)
92  return tangent_[1];
93  if(split_tangent_radius_)
94  return tangent2_radius_split_;
95  return tangent2_angle_split_;
96  }
97  void set_tangent(const Vector& x) { tangent_[0]=tangent_[1]=x; update_tangent2(); }
98  void set_tangent1(const Vector& x) { tangent_[0]=x; update_tangent2(); }
99  void set_tangent2(const Vector& x) { tangent_[1]=x; update_tangent2(); }
100 
101  const float& get_width()const { return width_; }
102  void set_width(float x) { width_=x; }
103 
104  // We store the origin offset by 0.5 so that
105  // can have the origin set to the default by zeroing
106  // out the structure.
107  float get_origin()const { return origin_+0.5f; }
108  void set_origin(float x) { origin_=x-0.5f; }
109 
110 
111  const bool& get_split_tangent_both()const { return split_tangent_both_; }
113 
114  const bool& get_merge_tangent_both()const { return merge_tangent_both_; }
116 
117 
118  const bool& get_split_tangent_radius()const { return split_tangent_radius_; }
119  void set_split_tangent_radius(bool x=true)
120  {
121  split_tangent_radius_=x;
122  update_tangent2();
123  update_flags();
124  }
125 
126  const bool& get_split_tangent_angle()const { return split_tangent_angle_; }
127  void set_split_tangent_angle(bool x=true)
128  {
129  split_tangent_angle_=x;
130  update_tangent2();
131  update_flags();
132  }
133  const bool& get_boned_vertex_flag()const { return boned_vertex_; }
134  void set_boned_vertex_flag(bool x=true) { boned_vertex_=x; }
135 
136  const Vector& get_vertex_setup()const { return vertex_setup_; }
137  void set_vertex_setup(Vector& x) { vertex_setup_=x; }
138 
139  void reverse();
140 
141 }; // END of class BLinePoint
142 
143 }; // END of namespace synfig
144 
145 /* === E N D =============================================================== */
146 
147 #endif