X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fvolta-bracket.cc;h=e337a34b34320c6f4a1b18b95edb205688ac399a;hb=b872748c6aa8bb721ced458691b38ac2fac5dfc8;hp=cedc7df6cbb883078b1dea8cd005d5451948eea7;hpb=deabe8e6c21ae6080e13b269bab24901f74a2254;p=lilypond.git diff --git a/lily/volta-bracket.cc b/lily/volta-bracket.cc index cedc7df6cb..e337a34b34 100644 --- a/lily/volta-bracket.cc +++ b/lily/volta-bracket.cc @@ -1,9 +1,20 @@ /* - volta-bracket.cc -- implement Volta_bracket_interface + This file is part of LilyPond, the GNU music typesetter. - source file of the GNU LilyPond music typesetter + Copyright (C) 1997--2015 Jan Nieuwenhuizen - (c) 1997--2007 Jan Nieuwenhuizen + 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. + + 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 . */ #include @@ -20,7 +31,8 @@ using namespace std; #include "side-position-interface.hh" #include "directional-element-interface.hh" #include "lookup.hh" -#include "tuplet-bracket.hh" +#include "bracket.hh" +#include "lily-imports.hh" /* this is too complicated. Yet another version of side-positioning, @@ -35,83 +47,79 @@ MAKE_SCHEME_CALLBACK (Volta_bracket_interface, print, 1); SCM Volta_bracket_interface::print (SCM smob) { - Spanner *me = unsmob_spanner (smob); + Spanner *me = unsmob (smob); Spanner *orig_span = dynamic_cast (me->original ()); bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] - == (Spanner *)me); - + == (Spanner *)me); + Output_def *layout = me->layout (); - Real half_space = 0.5; Item *bound = dynamic_cast (me)->get_bound (LEFT); /* - not a start, but really broken in two + If the volta bracket appears after a line-break, make + it start after the prefatory matter. */ Real left = 0.; if (bound->break_status_dir () == RIGHT) { Paper_column *pc = bound->get_column (); - left = pc->extent (pc, X_AXIS)[RIGHT] - - bound->relative_coordinate (pc, X_AXIS); + left = pc->break_align_width (pc, ly_symbol2scm ("break-alignment"))[RIGHT] + // For some reason, break_align_width is relative to + // the x-parent of the column. + - bound->relative_coordinate (pc->get_parent (X_AXIS), X_AXIS); } else { /* - the volta spanner is attached to the bar-line, which is moved - to the right. We don't need to compensate for the left edge. + the volta spanner is attached to the bar-line, which is moved + to the right. We don't need to compensate for the left edge. */ } modify_edge_height (me); if (!me->is_live ()) return SCM_EOL; - + Drul_array edge_height = robust_scm2interval (me->get_property ("edge-height"), - Interval (1.0, 1.0)); + Interval (1.0, 1.0)); Drul_array flare = robust_scm2interval (me->get_property ("bracket-flare"), - Interval (0, 0)); + Interval (0, 0)); Drul_array shorten = robust_scm2interval (me->get_property ("shorten-pair"), - Interval (0, 0)); - + Interval (0, 0)); - scale_drul (&edge_height, - Real (get_grob_direction (me))); Interval empty; Offset start; - start[X_AXIS] = me->spanner_length () - left - half_space; - - /* - ugh, Tuplet_bracket should use Horizontal_bracket, not the other way around. - */ + start[X_AXIS] = me->spanner_length () - left; + Stencil total - = Tuplet_bracket::make_bracket (me, Y_AXIS, start, - edge_height, empty, flare, shorten); + = Bracket::make_bracket (me, Y_AXIS, start, edge_height, empty, + flare, shorten); if (!orig_span || broken_first_bracket) { SCM text = me->get_property ("text"); SCM properties = me->get_property_alist_chain (SCM_EOL); SCM snum = Text_interface::interpret_markup (layout->self_scm (), - properties, text); - Stencil num = *unsmob_stencil (snum); + properties, text); + Stencil num = *unsmob (snum); num.align_to (Y_AXIS, UP); num.translate_axis (-0.5, Y_AXIS); total.add_at_edge (X_AXIS, LEFT, num, - num.extent (X_AXIS).length () - - 1.0); + - 1.0); } - + total.translate_axis (left, X_AXIS); return total.smobbed_copy (); } - void Volta_bracket_interface::modify_edge_height (Spanner *me) { Spanner *orig_span = dynamic_cast (me->original ()); - + bool broken_first_bracket = orig_span && (orig_span->broken_intos_[0] == (Spanner *)me); bool broken_last_bracket = orig_span && (orig_span->broken_intos_.back () == (Spanner *)me); bool no_vertical_start = orig_span && !broken_first_bracket; @@ -119,7 +127,7 @@ Volta_bracket_interface::modify_edge_height (Spanner *me) extract_grob_set (me, "bars", bars); Grob *endbar = bars.size () ? bars.back () : 0; - SCM glyph = endbar ? endbar->get_property ("glyph") : SCM_EOL; + SCM glyph = endbar ? endbar->get_property ("glyph-name") : SCM_EOL; string str; if (scm_is_string (glyph)) @@ -127,22 +135,18 @@ Volta_bracket_interface::modify_edge_height (Spanner *me) else str = "|"; - no_vertical_end - |= (str != ":|" - && str != "|:" - && str != "|." - && str != ":|:" - && str != ".|"); + no_vertical_end |= ly_scm2bool (Lily::volta_bracket_calc_hook_visibility + (ly_string2scm (str))); if (no_vertical_end || no_vertical_start) { Drul_array edge_height = robust_scm2interval (me->get_property ("edge-height"), - Interval (1.0, 1.0)); + Interval (1.0, 1.0)); if (no_vertical_start) - edge_height[LEFT] = 0.0; + edge_height[LEFT] = 0.0; if (no_vertical_end) - edge_height[RIGHT] = 0.0; + edge_height[RIGHT] = 0.0; me->set_property ("edge-height", ly_interval2scm (edge_height)); } @@ -160,10 +164,12 @@ Volta_bracket_interface::add_bar (Grob *me, Item *b) } ADD_INTERFACE (Volta_bracket_interface, - "Volta bracket with number", - - /* properties */ - "bars " - "thickness " - "height"); + "Volta bracket with number.", + + /* properties */ + "bars " + "thickness " + "height " + "shorten-pair " + );