2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 LilyPond is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
12 LilyPond is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
21 #include "tie-configuration.hh"
24 #include "tie-formatting-problem.hh"
28 Tie_configuration::compare (Tie_configuration
const &a
,
29 Tie_configuration
const &b
)
31 if (a
.position_
- b
.position_
)
32 return sign (a
.position_
- b
.position_
);
33 return sign (a
.dir_
- b
.dir_
);
37 Tie_configuration::Tie_configuration ()
44 column_ranks_
= Drul_array
<int> (0, 0);
49 Tie_configuration::center_tie_vertically (Tie_details
const &details
)
51 Bezier b
= get_untransformed_bezier (details
);
52 Offset middle
= b
.curve_point (0.5);
53 Offset edge
= b
.curve_point (0.0);
54 Real center
= (edge
[Y_AXIS
] + middle
[Y_AXIS
])/2.0;
56 delta_y_
= - dir_
* center
;
61 Tie_configuration::get_transformed_bezier (Tie_details
const &details
) const
63 Bezier
b (get_untransformed_bezier (details
));
66 b
.translate (Offset (attachment_x_
[LEFT
],
67 delta_y_
+ details
.staff_space_
* 0.5 * position_
));
73 Get bezier with left control at (0,0)
76 Tie_configuration::get_untransformed_bezier (Tie_details
const &details
) const
78 Real l
= attachment_x_
.length ();
79 if (isinf (l
) || isnan (l
))
81 programming_error ("Inf or NaN encountered");
85 details
.height_limit_
,
90 Tie_configuration::column_span_length () const
92 return column_ranks_
[RIGHT
] - column_ranks_
[LEFT
];
96 Tie_configuration::distance (Tie_configuration
const &a
,
97 Tie_configuration
const &b
)
100 Real d
= 3 * (a
.position_
- b
.position_
);
102 return d
+ (2 + (b
.dir_
- a
.dir_
));
104 return d
+ (2 + (a
.dir_
- b
.dir_
));
109 Tie_configuration::add_score (Real s
, string desc
)
114 score_card_
+= to_string ("%s=%.2f ", desc
.c_str (), s
);
118 Tie_configuration::height (Tie_details
const &details
) const
120 Real l
= attachment_x_
.length ();
122 return slur_shape (l
,
123 details
.height_limit_
,
124 details
.ratio_
).curve_point (0.5)[Y_AXIS
];
127 Ties_configuration::Ties_configuration ()
134 Ties_configuration::reset_score ()
139 tie_score_cards_
.clear ();
143 Ties_configuration::add_tie_score (Real s
, int i
, string desc
)
149 while (tie_score_cards_
.size () < size ())
150 tie_score_cards_
.push_back ("");
152 tie_score_cards_
[i
] += to_string ("%s=%.2f ", desc
.c_str (), s
);
157 Ties_configuration::add_score (Real s
, string desc
)
162 score_card_
+= to_string ("%s=%.2f ", desc
.c_str (), s
);
166 Ties_configuration::score () const
173 Ties_configuration::complete_tie_card (vsize i
) const
176 s
+= to_string ("%d (%.2f) %c: ", (*this)[i
].position_
, (*this)[i
].delta_y_
,
177 ((*this)[i
].dir_
== UP
? 'u' : 'd'))
178 + (*this)[i
].card () + (*this).tie_card (i
);
181 this is a little awkward, but we must decide where to put
187 if (i
+ 1 == size ())
188 s
+= to_string ("TOTAL=%.2f", score ());
193 /* for use inside GDB */
195 Ties_configuration::complete_score_card () const
198 for (vsize i
= 0; i
< size (); i
++)
200 s
+= complete_tie_card (i
);
209 Ties_configuration::card () const