X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Ftie.cc;h=dcc53ad44e61c7af5ee5522ce3d8b18a19b56eb4;hb=77267b700c377fd170abcbf4863728937038eb5e;hp=47c5a1c9cfb9809b1d58b6f0186a069dff9bcc9d;hpb=0694f44d61203d9e8d26cd9bc83b46f2addb2c7f;p=lilypond.git diff --git a/lily/tie.cc b/lily/tie.cc index 47c5a1c9cf..dcc53ad44e 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -42,9 +42,23 @@ #include "semi-tie-column.hh" bool -Tie::less (Grob *const &s1, Grob *const &s2) +Tie::less (Grob *g1, Grob *g2) { - return get_position_generic (s1) < get_position_generic (s2); + Spanner *s1 = dynamic_cast (g1); + if (!s1) + { + g1->programming_error ("grob is not a tie"); + return false; + } + + Spanner *s2 = dynamic_cast (g2); + if (!s2) + { + g2->programming_error ("grob is not a tie"); + return true; + } + + return get_position (s1) < get_position (s2); } void @@ -57,7 +71,7 @@ Item * Tie::head (Spanner *me, Direction d) { Item *it = me->get_bound (d); - return Note_head::has_interface (it) ? it : 0; + return has_interface (it) ? it : 0; } int @@ -86,21 +100,6 @@ Tie::get_position (Spanner *me) return 0; } -int -Tie::get_position_generic (Grob *me) // TODO: do away with this -{ - Spanner *spanner = dynamic_cast (me); - if (spanner) - return get_position (spanner); - - Item *item = dynamic_cast (me); - if (item) - return Semi_tie::get_position (item); - - programming_error ("grob is neither a tie nor a semi-tie"); - return 0; -} - /* Default: Put the tie oppositie of the stem [Wanske p231] @@ -112,20 +111,14 @@ Tie::get_position_generic (Grob *me) // TODO: do away with this (what about linebreaks? ) */ Direction -Tie::get_default_dir (Grob *me) +Tie::get_default_dir (Spanner *me) { Drul_array stems; for (LEFT_and_RIGHT (d)) { - Grob *one_head = 0; - if (Spanner *spanner = dynamic_cast (me)) - { - one_head = head (spanner, d); - if (!one_head) - one_head = head (spanner->broken_neighbor (d), d); - } - else if (Item *item = dynamic_cast (me)) - one_head = Semi_tie::head (item); + Grob *one_head = head (me, d); + if (!one_head) + one_head = head (me->broken_neighbor (d), d); Grob *stem = one_head ? Rhythmic_head::get_stem (one_head) : 0; stems[d] = (stem && !Stem::is_invisible (stem)) ? stem : 0; @@ -146,7 +139,7 @@ Tie::get_default_dir (Grob *me) return -get_grob_direction (stems[LEFT]); else if (stems[RIGHT]) return -get_grob_direction (stems[RIGHT]); - else if (int p = get_position_generic (me)) + else if (int p = get_position (me)) return Direction (sign (p)); return to_dir (me->get_property ("neutral-direction")); @@ -156,10 +149,12 @@ MAKE_SCHEME_CALLBACK (Tie, calc_direction, 1); SCM Tie::calc_direction (SCM smob) { + // In this method, Tie and Semi_tie require the same logic with different + // types. It might be clearer to use a template. Grob *me = unsmob (smob); Grob *yparent = me->get_parent (Y_AXIS); - if ((Tie_column::has_interface (yparent) - || Semi_tie_column::has_interface (yparent)) + if ((has_interface (yparent) + || has_interface (yparent)) && unsmob (yparent->get_object ("ties")) // && unsmob (yparent->get_object ("ties"))->size () > 1 ) @@ -169,8 +164,10 @@ Tie::calc_direction (SCM smob) return me->get_property_data ("direction"); } - else - return scm_from_int (Tie::get_default_dir (me)); + + programming_error ("no Tie_column or Semi_tie_column. Killing grob."); + me->suicide (); + return scm_from_int (CENTER); } SCM @@ -219,8 +216,8 @@ Tie::calc_control_points (SCM smob) Spanner *me = LY_ASSERT_SMOB(Spanner, smob, 1); Grob *yparent = me->get_parent (Y_AXIS); - if ((Tie_column::has_interface (yparent) - || Semi_tie_column::has_interface (yparent)) + if ((has_interface (yparent) + || has_interface (yparent)) && unsmob (yparent->get_object ("ties"))) { extract_grob_set (yparent, "ties", ties);