From: Dan Eble Date: Sun, 12 Jul 2015 23:20:23 +0000 (-0400) Subject: Issue 4503 (2/4) Let Tie::get_default_dir take a Spanner X-Git-Tag: release/2.19.24-1~5^2~9 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=0f51786ea76c51bf5a788c748066a85bd7943a15;p=lilypond.git Issue 4503 (2/4) Let Tie::get_default_dir take a Spanner --- diff --git a/lily/include/semi-tie.hh b/lily/include/semi-tie.hh index 8c52dc64d6..d56caf7e32 100644 --- a/lily/include/semi-tie.hh +++ b/lily/include/semi-tie.hh @@ -27,7 +27,6 @@ struct Semi_tie { DECLARE_GROB_INTERFACE (); - DECLARE_SCHEME_CALLBACK (calc_direction, (SCM)); DECLARE_SCHEME_CALLBACK (calc_control_points, (SCM)); static bool less (Grob *s1, Grob *s2); static int get_column_rank (Item *); diff --git a/lily/include/tie.hh b/lily/include/tie.hh index a6b3bf59a7..f349ddd612 100644 --- a/lily/include/tie.hh +++ b/lily/include/tie.hh @@ -33,7 +33,7 @@ public: static int get_column_rank (Spanner *, Direction); static int get_position (Spanner *); static int get_position_generic (Grob *); - static Direction get_default_dir (Grob *); + static Direction get_default_dir (Spanner *); static SCM get_control_points (Grob *, Grob *, Tie_configuration const &, Tie_details const &); diff --git a/lily/semi-tie.cc b/lily/semi-tie.cc index 1930087514..17520daf70 100644 --- a/lily/semi-tie.cc +++ b/lily/semi-tie.cc @@ -68,6 +68,7 @@ Semi_tie::calc_control_points (SCM smob) me->suicide (); } + // TODO: Even if me->suicide() was called? return me->get_property_data ("control-points"); } diff --git a/lily/tie.cc b/lily/tie.cc index 72855687e3..57cbf6e3f4 100644 --- a/lily/tie.cc +++ b/lily/tie.cc @@ -119,20 +119,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; @@ -153,7 +147,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")); @@ -163,6 +157,8 @@ 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) @@ -176,8 +172,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