]> git.donarmstrong.com Git - lilypond.git/blob - lily/tie-configuration.cc
use staff-position/direction property from single ties. This fixes
[lilypond.git] / lily / tie-configuration.cc
1 /*
2   tie-configuration.cc -- implement Tie_configuration
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7
8 */
9
10 #include "tie-configuration.hh"
11 #include "warn.hh"
12 #include "tie-formatting-problem.hh"
13 #include "bezier.hh"
14
15 int
16 Tie_configuration::compare (Tie_configuration const &a,
17                             Tie_configuration const &b)
18 {
19   if (a.position_ - b.position_)
20     return sign (a.position_ - b.position_);
21   return sign (a.dir_ - b.dir_);
22 }
23                             
24
25 Tie_configuration::Tie_configuration ()
26 {
27   dir_ = CENTER;
28   position_ = 0;
29   delta_y_ = 0.0;
30   score_ = 0.0;
31   scored_ = false;
32   column_ranks_ = Drul_array<int> (0, 0);
33 }
34
35
36 void
37 Tie_configuration::center_tie_vertically (Tie_details const &details)
38 {
39   Bezier b = get_untransformed_bezier (details);
40   Offset middle = b.curve_point (0.5);
41   Offset edge = b.curve_point (0.0);
42   Real center = (edge[Y_AXIS] + middle[Y_AXIS])/2.0;
43
44   delta_y_ = - dir_ * center;
45 }
46
47
48 Bezier
49 Tie_configuration::get_transformed_bezier (Tie_details const &details) const
50 {
51   Bezier b (get_untransformed_bezier (details));
52
53   b.scale (1, dir_);
54   b.translate (Offset (attachment_x_[LEFT],
55                        delta_y_ + details.staff_space_ * 0.5 * position_));
56
57   return b;
58 }
59
60 /*
61   Get bezier with left control at (0,0)
62  */
63 Bezier
64 Tie_configuration::get_untransformed_bezier (Tie_details const &details) const
65 {
66   Real l = attachment_x_.length();
67   if (isinf (l) || isnan (l))
68     {
69       programming_error ("Inf or NaN encountered");
70       l = 1.0;
71     }
72   return slur_shape (l,
73                      details.height_limit_,
74                      details.ratio_);
75 }
76
77 int
78 Tie_configuration::column_span_length () const
79 {
80   return column_ranks_[RIGHT] - column_ranks_[LEFT];
81 }
82
83 Real
84 Tie_configuration::distance (Tie_configuration const &a,
85                              Tie_configuration const &b)
86 {
87
88   Real d = 3 * (a.position_ - b.position_);
89   if (d < 0)
90     return d + (2 + (b.dir_ - a.dir_));
91   else
92     return d + (2 + (a.dir_ - b.dir_));
93 }
94
95
96 void
97 Tie_configuration::add_score (Real s, string desc)
98 {
99   assert (!scored_);
100   score_ += s;
101   if (s)
102     score_card_ += to_string ("%s=%.2f ", desc.c_str (), s);
103 }
104
105 Real
106 Tie_configuration::height (Tie_details const &details) const
107 {
108   Real l = attachment_x_.length();
109
110   return slur_shape (l,
111                      details.height_limit_,
112                      details.ratio_).curve_point (0.5)[Y_AXIS]; 
113 }
114
115 Ties_configuration::Ties_configuration()
116 {
117   score_ = 0.0;
118   scored_ = false;
119 }
120
121 void
122 Ties_configuration::reset_score ()
123 {
124   score_ = 0.0;
125   scored_ = false;
126   score_card_ = "";
127   tie_score_cards_.clear ();
128 }
129
130 void
131 Ties_configuration::add_tie_score (Real s, int i, string desc)
132 {
133   assert (!scored_);
134   score_ += s;
135   if (s)
136     {
137       while (tie_score_cards_.size () < size ())
138         tie_score_cards_.push_back ("");
139
140       tie_score_cards_[i] += to_string ("%s=%.2f ", desc.c_str (), s);
141     }
142 }
143
144 void
145 Ties_configuration::add_score (Real s, string desc)
146 {
147   assert (!scored_);
148   score_ += s;
149   if (s)
150     score_card_ += to_string ("%s=%.2f ", desc.c_str (), s);
151 }
152
153 Real
154 Ties_configuration::score () const
155 {
156   return score_;
157 }
158
159 string
160 Ties_configuration::card () const
161 {
162   return score_card_;
163 }