/*
- 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--2012 Jan Nieuwenhuizen <janneke@gnu.org>
- (c) 1997--2007 Jan Nieuwenhuizen <janneke@gnu.org>
+ 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 <http://www.gnu.org/licenses/>.
*/
#include <cstring>
Spanner *me = unsmob_spanner (smob);
Spanner *orig_span = dynamic_cast<Spanner *> (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<Spanner *> (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<Real> edge_height = robust_scm2interval (me->get_property ("edge-height"),
- Interval (1.0, 1.0));
+ Interval (1.0, 1.0));
Drul_array<Real> flare = robust_scm2interval (me->get_property ("bracket-flare"),
- Interval (0, 0));
+ Interval (0, 0));
Drul_array<Real> 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.
+ ugh, Tuplet_bracket should use Horizontal_bracket, not the other way around.
*/
Stencil total
- = Tuplet_bracket::make_bracket (me, Y_AXIS, start,
- edge_height, empty, flare, shorten);
+ = Tuplet_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);
+ properties, text);
Stencil num = *unsmob_stencil (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<Spanner *> (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;
str = "|";
no_vertical_end
- |= (str != ":|"
- && str != "|:"
- && str != "|."
- && str != ":|:"
- && str != ":|.|:"
- && str != ":|.:"
- && str != ".|");
+ |= (str != ":|"
+ && str != "|:"
+ && str != "|."
+ && str != ":|:"
+ && str != ":|.|:"
+ && str != ":|.:"
+ && str != ".|");
if (no_vertical_end || no_vertical_start)
{
Drul_array<Real> 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));
}
}
ADD_INTERFACE (Volta_bracket_interface,
- "Volta bracket with number.",
+ "Volta bracket with number.",
- /* properties */
- "bars "
- "thickness "
- "height "
- );
+ /* properties */
+ "bars "
+ "thickness "
+ "height "
+ );