X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fpiano-pedal-bracket.cc;h=7d7e13d093d8b5885fc3666609dc6386320d23b0;hb=800b95702ffbb26616fe2e420ae736ac68fd255e;hp=09203303240ccc92ce8857f5f7d34ca2a4455a0d;hpb=1753b1a73742a5b0893037116bb6f2febba277f3;p=lilypond.git diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index 0920330324..7d7e13d093 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -1,99 +1,102 @@ -/* - piano-pedal-bracket.cc -- implement Piano_pedal_bracket - -source file of the GNU LilyPond music typesetter - -(c) 2003 Han-Wen Nienhuys - -based on smouldering remains by - - Chris Jackson - +/* + piano-pedal-bracket.cc -- implement Piano_pedal_bracket -*/ -/* - Piano pedal brackets are a special case of a text spanner. - Pedal up-down (restart) indicated by the angled right and left edges - of consecutive pedals touching exactly to form an __/\__ + source file of the GNU LilyPond music typesetter + (c) 2003--2007 Han-Wen Nienhuys */ - -/* - TODO: this should be moved somewhere else (?). - - Perhaps make separate function for pedal-bracket. - */ -#include "molecule.hh" +#include "stencil.hh" #include "spanner.hh" #include "item.hh" -#include "paper-def.hh" +#include "tuplet-bracket.hh" struct Piano_pedal_bracket { - DECLARE_SCHEME_CALLBACK(after_line_breaking,(SCM)); - static bool has_interface (Grob*); + DECLARE_SCHEME_CALLBACK (print, (SCM)); + DECLARE_GROB_INTERFACE (); }; -ADD_INTERFACE (Piano_pedal_bracket,"piano-pedal-bracket-interface", - "", - "pedal-text"); - -MAKE_SCHEME_CALLBACK(Piano_pedal_bracket,after_line_breaking,1); +MAKE_SCHEME_CALLBACK (Piano_pedal_bracket, print, 1); SCM -Piano_pedal_bracket::after_line_breaking (SCM smob) +Piano_pedal_bracket::print (SCM smob) { - Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *me = dynamic_cast (unsmob_grob (smob)); + Spanner *orig = dynamic_cast (me->original ()); - Drul_array broken; - Drul_array height(0,0), shorten(0,0); + Drul_array broken (false, false); + Drul_array height = robust_scm2drul + (me->get_property ("edge-height"), Interval (0, 0)); + Drul_array shorten = robust_scm2drul + (me->get_property ("shorten-pair"), Interval (0, 0)); + Drul_array flare = robust_scm2drul + (me->get_property ("bracket-flare"), Interval (0, 0)); - SCM eh = me->get_grob_property ("edge-height"); - SCM sp = me->get_grob_property ("shorten-pair"); - - Direction d = LEFT; + Grob *common = me->get_bound (LEFT) + ->common_refpoint (me->get_bound (RIGHT), X_AXIS); + Grob *textbit = unsmob_grob (me->get_object ("pedal-text")); + if (textbit) + common = common->common_refpoint (textbit, X_AXIS); + + Interval span_points (0, 0); + Direction d = LEFT; do { Item *b = me->get_bound (d); broken[d] = b->break_status_dir () != CENTER; - - if (!broken[d] && (is_number_pair (eh))) - height[d] += gh_scm2double (index_get_cell (eh, d)); - if (is_number_pair (sp)) - shorten[d] += gh_scm2double (index_get_cell (sp, d)); + if (broken[d]) + { + if (orig + && ((d == RIGHT + && me->get_break_index () != orig->broken_intos_.size () - 1) + || (d == LEFT && me->get_break_index ()))) + height[d] = 0.0; + else + flare[d] = 0.0; + } + + Interval ext = robust_relative_extent (b, common, X_AXIS); + span_points[d] = ext [broken[d] ? RIGHT : LEFT]; } while (flip (&d) != LEFT); - - /* For 'Mixed' style pedals, i.e. a bracket preceded by text: Ped._____| - need to shorten by the extent of the text grob - - Urg. - why not hang bracket between text items? --hwn + /* For 'Mixed' style pedals, i.e. a bracket preceded by text: Ped._____| + need to shorten by the extent of the text grob */ - if (Grob *textbit = unsmob_grob (me->get_grob_property("pedal-text"))) + if (textbit) { height[LEFT] = 0; - SCM pa = me->get_grob_property ("if-text-padding"); // UGH. - Real padding =0.; - if (gh_number_p (pa)) - padding = gh_scm2double (pa); - - shorten[LEFT] += padding + textbit->extent (textbit, X_AXIS)[RIGHT]; + + Real padding = robust_scm2double (me->get_property ("bound-padding"), 0); + + span_points[LEFT] = padding + + robust_relative_extent (textbit, common, X_AXIS)[RIGHT]; } - - if (broken[LEFT]) + + Stencil m; + if (!span_points.is_empty () + && span_points.length () > 0.001) { - shorten[LEFT] -= me->get_broken_left_end_align () ; + m = Tuplet_bracket::make_bracket (me, Y_AXIS, + Offset (span_points.length (), 0), + height, + Interval (), + flare, shorten); } - - // Also shorten so that it ends just before the spanned note. - Grob *rb = me->get_bound (RIGHT); - shorten[RIGHT] += rb->extent (rb, X_AXIS)[RIGHT]; - - me->set_grob_property ("edge-height", ly_interval2scm (height)); - me->set_grob_property ("shorten-pair", ly_interval2scm (shorten)); - - return SCM_UNSPECIFIED; + m.translate_axis (span_points[LEFT] + - me->relative_coordinate (common, X_AXIS), X_AXIS); + return m.smobbed_copy (); } +ADD_INTERFACE (Piano_pedal_bracket, + "The bracket of the piano pedal. It can be tuned through" + " the regular bracket properties.", + + /* properties */ + "bound-padding " + "edge-height " + "shorten-pair " + "bracket-flare " + "pedal-text " + );