]> git.donarmstrong.com Git - lilypond.git/blob - lily/tie-configuration.cc
* lily/tie-column.cc (calc_positioning_done): support for
[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 }
33
34
35 void
36 Tie_configuration::center_tie_vertically (Tie_details const &details)
37 {
38   Bezier b = get_untransformed_bezier (details);
39   Offset middle = b.curve_point (0.5);
40   Offset edge = b.curve_point (0.0);
41   Real center = (edge[Y_AXIS] + middle[Y_AXIS])/2.0;
42
43   delta_y_ = - dir_ * center;
44 }
45
46
47 Bezier
48 Tie_configuration::get_transformed_bezier (Tie_details const &details) const
49 {
50   Bezier b (get_untransformed_bezier (details));
51
52   b.scale (1, dir_);
53   b.translate (Offset (attachment_x_[LEFT],
54                        delta_y_ + details.staff_space_ * 0.5 * position_));
55
56   return b;
57 }
58
59 /*
60   Get bezier with left control at (0,0)
61  */
62 Bezier
63 Tie_configuration::get_untransformed_bezier (Tie_details const &details) const
64 {
65   Real l = attachment_x_.length();
66   if (isinf (l) || isnan (l))
67     {
68       programming_error ("Inf or NaN encountered");
69       l = 1.0;
70     }
71   return slur_shape (l,
72                      details.height_limit_,
73                      details.ratio_);
74 }
75
76 Real
77 Tie_configuration::distance (Tie_configuration const &a,
78                              Tie_configuration const &b)
79 {
80
81   Real d = 3 * (a.position_ - b.position_);
82   if (d < 0)
83     return d + (2 + (b.dir_ - a.dir_));
84   else
85     return d + (2 + (a.dir_ - b.dir_));
86 }
87
88
89 void
90 Tie_configuration::add_score (Real s, string desc)
91 {
92   assert (!scored_);
93   score_ += s;
94   if (s)
95     score_card_ += to_string ("%s=%.2f ", desc.c_str (), s);
96 }
97
98 Real
99 Tie_configuration::height (Tie_details const &details) const
100 {
101   Real l = attachment_x_.length();
102
103   return slur_shape (l,
104                      details.height_limit_,
105                      details.ratio_).curve_point (0.5)[Y_AXIS]; 
106 }
107
108 Ties_configuration::Ties_configuration()
109 {
110   score_ = 0.0;
111   scored_ = false;
112 }
113
114 void
115 Ties_configuration::reset_score ()
116 {
117   score_ = 0.0;
118   scored_ = false;
119   score_card_ = "";
120   tie_score_cards_.clear ();
121 }
122
123 void
124 Ties_configuration::add_tie_score (Real s, int i, string desc)
125 {
126   assert (!scored_);
127   score_ += s;
128   if (s)
129     {
130       while (tie_score_cards_.size () < size ())
131         tie_score_cards_.push_back ("");
132
133       tie_score_cards_[i] += to_string ("%s=%.2f ", desc.c_str (), s);
134     }
135 }
136
137 void
138 Ties_configuration::add_score (Real s, string desc)
139 {
140   assert (!scored_);
141   score_ += s;
142   if (s)
143     score_card_ += to_string ("%s=%.2f ", desc.c_str (), s);
144 }
145
146 Real
147 Ties_configuration::score () const
148 {
149   return score_;
150 }
151
152 string
153 Ties_configuration::card () const
154 {
155   return score_card_;
156 }