X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpiano-pedal-bracket.cc;h=b47e5e3b6deee146c2f20a51d49c05353064273d;hb=17378a326b64ebeaeb6f9454cde414923785a470;hp=09203303240ccc92ce8857f5f7d34ca2a4455a0d;hpb=1753b1a73742a5b0893037116bb6f2febba277f3;p=lilypond.git diff --git a/lily/piano-pedal-bracket.cc b/lily/piano-pedal-bracket.cc index 0920330324..b47e5e3b6d 100644 --- a/lily/piano-pedal-bracket.cc +++ b/lily/piano-pedal-bracket.cc @@ -1,99 +1,113 @@ -/* - 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 +/* + This file is part of LilyPond, the GNU music typesetter. - Chris Jackson + Copyright (C) 2003--2015 Han-Wen Nienhuys + LilyPond is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. -*/ -/* - 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 __/\__ + LilyPond is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + You should have received a copy of the GNU General Public License + along with LilyPond. If not, see . */ - -/* - 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" +#include "axis-group-interface.hh" struct Piano_pedal_bracket { - DECLARE_SCHEME_CALLBACK(after_line_breaking,(SCM)); - static bool has_interface (Grob*); + DECLARE_SCHEME_CALLBACK (print, (SCM)); }; -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"); - - Direction d = LEFT; - - do + Spanner *me = unsmob (smob); + 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 (me->get_object ("pedal-text")); + + if (textbit) + common = common->common_refpoint (textbit, X_AXIS); + + Interval span_points (0, 0); + for (LEFT_and_RIGHT (d)) { 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; + + span_points[d] + = Axis_group_interface::generic_bound_extent (b, common, X_AXIS)[RIGHT]; + } + else + span_points[d] = b->relative_coordinate (common, X_AXIS); } - 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 " + );