X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpiano-pedal-bracket.cc;h=e1c07623e4bf9193f61a76c11fa5ad5a7f02a9a6;hb=c7be17948fb3aec4e57e21027a0eb98f05be43bb;hp=09203303240ccc92ce8857f5f7d34ca2a4455a0d;hpb=1753b1a73742a5b0893037116bb6f2febba277f3;p=lilypond.git diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index 0920330324..e1c07623e4 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -3,97 +3,97 @@ source file of the GNU LilyPond music typesetter -(c) 2003 Han-Wen Nienhuys - -based on smouldering remains by - - Chris Jackson - - -*/ -/* - 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 __/\__ +(c) 2003--2004 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)); + DECLARE_SCHEME_CALLBACK (print,(SCM)); static bool has_interface (Grob*); }; -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)); - - Drul_array broken; - Drul_array height(0,0), shorten(0,0); - - SCM eh = me->get_grob_property ("edge-height"); - SCM sp = me->get_grob_property ("shorten-pair"); + Spanner *orig = dynamic_cast (me->original_); + 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)); + + Grob *common = me->get_bound (LEFT) + ->common_refpoint (me->get_bound (RIGHT), X_AXIS); + Grob *textbit = unsmob_grob (me->get_property ("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 */ - 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); } + m.translate_axis (span_points[LEFT] + - me->relative_coordinate (common, X_AXIS), X_AXIS); + return m.smobbed_copy (); +} - // 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; -} +ADD_INTERFACE (Piano_pedal_bracket,"piano-pedal-bracket-interface", + "The bracket of the piano pedal. It can be tuned through the regular " + "bracket properties.", + "bound-padding edge-height shorten-pair bracket-flare pedal-text");