From: Joe Neeman Date: Mon, 18 Jun 2007 05:58:44 +0000 (+1000) Subject: ensure that we get the right separation items for min distance X-Git-Tag: release/2.11.28-1~21^2~33 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=174ce6f58aaa1b34a481fa22b9dde9b6040347b2;p=lilypond.git ensure that we get the right separation items for min distance --- diff --git a/lily/spacing-interface.cc b/lily/spacing-interface.cc index 856eee1e73..82f6fccdb7 100644 --- a/lily/spacing-interface.cc +++ b/lily/spacing-interface.cc @@ -23,26 +23,46 @@ Real Spacing_interface::minimum_distance (Grob *me) { + /* the logic here is a little convoluted. + A {Staff,Note}_spacing doesn't copy {left-,right-}items when it clones, + so in order to find the separation items, we need to use the original + spacing grob. But once we find the separation items, we need to get back + the broken piece. + + FIXME: this only works for the left column. There is only one spacing + grob for the original and non-original right column and we have no way + to tell which one we need */ + + Grob *orig = me->original () ? me->original () : me; + Direction break_dir = dynamic_cast (me)->break_status_dir (); Drul_array skylines = Drul_array (Skyline (RIGHT), Skyline (LEFT)); - Drul_array > items (ly_scm2link_array (me->get_object ("left-items")), - ly_scm2link_array (me->get_object ("right-items"))); + Drul_array > items (ly_scm2link_array (orig->get_object ("left-items")), + ly_scm2link_array (orig->get_object ("right-items"))); Direction d = LEFT; do { for (vsize i = 0; i < items[d].size (); i++) - if (Separation_item::has_interface (items[d][i])) - { - SCM sky_scm = items[d][i]->get_property ("horizontal-skylines"); - Skyline_pair *sky = Skyline_pair::unsmob (sky_scm); - if (sky) - skylines[d].merge ((*sky)[-d]); - else - programming_error ("separation item has no skyline"); + { + Grob *g = items[d][i]; + if (d == LEFT) + if (Item *it = dynamic_cast (g)) + if (Grob *piece = it->find_prebroken_piece (break_dir)) + g = piece; + + if (Separation_item::has_interface (g)) + { + SCM sky_scm = g->get_property ("horizontal-skylines"); + Skyline_pair *sky = Skyline_pair::unsmob (sky_scm); + if (sky) + skylines[d].merge ((*sky)[-d]); + else + programming_error ("separation item has no skyline"); - if (d == RIGHT && items[LEFT].size ()) - skylines[d].merge (Separation_item::conditional_skyline (items[d][i], items[LEFT][0])); - } + if (d == RIGHT && items[LEFT].size ()) + skylines[d].merge (Separation_item::conditional_skyline (items[d][i], items[LEFT][0])); + } + } } while (flip (&d) != LEFT);