X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fhairpin.cc;h=a03a57595d5a7e586c98f14d506f6534b215d4dc;hb=9806dbae3ff6491b74fce957d0574935360ea121;hp=de83f6a3b869eb96d9247fda99f63f04f1055e2d;hpb=c659cb200486c2f908703696a1b2873e78c8160a;p=lilypond.git diff --git a/lily/hairpin.cc b/lily/hairpin.cc index de83f6a3b8..a03a57595d 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -3,7 +3,7 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ #include "hairpin.hh" @@ -17,15 +17,38 @@ #include "warn.hh" #include "paper-column.hh" #include "lookup.hh" -#include "text-item.hh" +#include "text-interface.hh" +#include "pointer-group-interface.hh" + +MAKE_SCHEME_CALLBACK (Hairpin, after_line_breaking, 1); +SCM +Hairpin::after_line_breaking (SCM smob) +{ + Spanner *me = dynamic_cast (unsmob_grob (smob)); + + Drul_array broken; + Drul_array bounds; + Direction d = LEFT; + do + { + bounds[d] = me->get_bound (d); + broken[d] = bounds[d]->break_status_dir () != CENTER; + } + while (flip (&d) != LEFT); + + if (broken[LEFT] + && ly_is_equal (bounds[RIGHT]->get_column ()->get_property ("when"), + bounds[LEFT]->get_property ("when"))) + me->suicide (); + return SCM_UNSPECIFIED; +} MAKE_SCHEME_CALLBACK (Hairpin, print, 1); SCM -Hairpin::print (SCM smob) +Hairpin::print (SCM smob) { - Grob *me= unsmob_grob (smob); - Spanner *spanner = dynamic_cast (me); + Spanner *me = dynamic_cast (unsmob_grob (smob)); SCM s = me->get_property ("grow-direction"); if (!is_direction (s)) @@ -33,23 +56,23 @@ Hairpin::print (SCM smob) me->suicide (); return SCM_EOL; } - + Direction grow_dir = to_dir (s); Real padding = robust_scm2double (me->get_property ("bound-padding"), 0.5); Drul_array broken; - Drul_array bounds ; + Drul_array bounds; Direction d = LEFT; do { - bounds[d] = spanner->get_bound (d); + bounds[d] = me->get_bound (d); broken[d] = bounds[d]->break_status_dir () != CENTER; } while (flip (&d) != LEFT); Grob *common = bounds[LEFT]->common_refpoint (bounds[RIGHT], X_AXIS); - Drul_array x_points ; - + Drul_array x_points; + do { Item *b = bounds[d]; @@ -57,7 +80,7 @@ Hairpin::print (SCM smob) if (broken [d]) { if (d == LEFT) - x_points[d] = b->extent (common,X_AXIS)[RIGHT] ; + x_points[d] = b->extent (common, X_AXIS)[RIGHT]; } else { @@ -65,41 +88,40 @@ Hairpin::print (SCM smob) { Interval e = b->extent (common, X_AXIS); if (!e.is_empty ()) - x_points[d] = e[-d] - d*padding; + x_points[d] = e[-d] - d * padding; } else { bool neighbor_found = false; - for (SCM adj = me->get_property ("adjacent-hairpins"); - scm_is_pair (adj); adj = scm_cdr (adj)) + extract_grob_set (me, "adjacent-hairpins", pins); + for (int i = 0; i < pins.size (); i++) { /* FIXME: this will fuck up in case of polyphonic notes in other voices. Need to look at note-columns in the current staff/voice. */ - - Spanner *pin = unsmob_spanner (scm_car (adj)); + + Spanner *pin = dynamic_cast (pins[i]); if (pin - && (pin->get_bound (LEFT)->get_column() == b->get_column () - || pin->get_bound (RIGHT)->get_column() == b->get_column() )) - neighbor_found = true; + && (pin->get_bound (LEFT)->get_column () == b->get_column () + || pin->get_bound (RIGHT)->get_column () == b->get_column ())) + neighbor_found = true; } - + /* If we're hung on a paper column, that means we're not adjacent to a text-dynamic, and we may move closer. We make the padding a little smaller, here. */ Interval e = robust_relative_extent (b, common, X_AXIS); - x_points[d] = - neighbor_found ? e.center() - d * padding / 3 : e[d]; + x_points[d] + = neighbor_found ? e.center () - d * padding / 3 : e[d]; } } } while (flip (&d) != LEFT); - Real width = x_points[RIGHT] - x_points[LEFT]; if (width < 0) { @@ -116,11 +138,11 @@ Hairpin::print (SCM smob) if (grow_dir < 0) { starth = height; - endh = continued ? height/2 : 0.0; + endh = continued ? height / 2 : 0.0; } else { - starth = continued ? height/2 : 0.0; + starth = continued ? height / 2 : 0.0; endh = height; } @@ -129,7 +151,7 @@ Hairpin::print (SCM smob) */ Stencil mol; - mol = Line_interface::line (me, Offset (0, starth), Offset (width, endh)); + mol = Line_interface::line (me, Offset (0, starth), Offset (width, endh)); mol.add_stencil (Line_interface::line (me, Offset (0, -starth), Offset (width, -endh))); @@ -140,9 +162,11 @@ Hairpin::print (SCM smob) return mol.smobbed_copy (); } - - ADD_INTERFACE (Hairpin, "hairpin-interface", - "A hairpin (de)crescendo.", - "grow-direction height bound-padding adjacent-hairpins"); + "A hairpin crescendo/decrescendo.", + "adjacent-hairpins " + "bound-padding " + "grow-direction " + "height " + );