X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fline-spanner.cc;h=7d8cea10d6d702977057c59bccaf263285098bd3;hb=d4ce4ffb6c483324393e6427a53db24a73bc60e2;hp=a1fe664c16275205e973c1eeb82f1987456dccbe;hpb=f1b34989c310857f1c6d2710f3b0ffd0f9e405e8;p=lilypond.git diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index a1fe664c16..7d8cea10d6 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -6,19 +6,21 @@ (c) 2000--2007 Jan Nieuwenhuizen */ -#include "spanner.hh" -#include "output-def.hh" -#include "item.hh" -#include "staff-symbol-referencer.hh" -#include "font-interface.hh" -#include "warn.hh" #include "align-interface.hh" +#include "axis-group-interface.hh" +#include "font-interface.hh" +#include "grob-interface.hh" +#include "item.hh" +#include "lily-proto.hh" #include "line-interface.hh" #include "moment.hh" - -#include "lily-proto.hh" -#include "grob-interface.hh" +#include "output-def.hh" +#include "pointer-group-interface.hh" +#include "spanner.hh" +#include "staff-symbol-referencer.hh" +#include "system.hh" #include "text-interface.hh" +#include "warn.hh" class Line_spanner { @@ -32,6 +34,13 @@ public: DECLARE_GROB_INTERFACE (); }; +Spanner *parent_spanner (Grob *g) +{ + if (Spanner::has_interface (g)) + return dynamic_cast (g); + return parent_spanner (g->get_parent (Y_AXIS)); +} + SCM Line_spanner::calc_bound_info (SCM smob, Direction dir) { @@ -79,8 +88,19 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) details, SCM_BOOL_F), CENTER); + Item *bound_item = me->get_bound (dir); + Grob *bound_grob = bound_item; + if (to_boolean (ly_assoc_get (ly_symbol2scm ("end-on-note"), details, SCM_BOOL_F)) + && bound_item->break_status_dir ()) + { + extract_grob_set (me, "note-columns", columns); + if (columns.size ()) + bound_grob = (dir == LEFT) + ? columns[0] : columns.back(); + } + details = scm_acons (ly_symbol2scm ("X"), - scm_from_double (me->get_bound (dir)->extent (commonx, X_AXIS) + scm_from_double (bound_grob->extent (commonx, X_AXIS) .linear_combination (attach)), details); } @@ -92,7 +112,8 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) Real extra_dy = robust_scm2double (me->get_property ("extra-dy"), 0.0); - + + Grob *common_y = me->common_refpoint (me->get_bound (dir), Y_AXIS); if (me->get_bound (dir)->break_status_dir ()) { Spanner *next_sp = me->broken_neighbor (dir); @@ -106,16 +127,39 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) return SCM_EOL; } - Grob *next_common_y = next_sp->common_refpoint (next_bound, X_AXIS); - Interval next_ext = next_bound->extent (next_common_y, Y_AXIS); + Spanner *next_bound_parent = parent_spanner (next_bound); + Interval next_ext = next_bound->extent (next_bound_parent, Y_AXIS); + + /* We want to know what would be the + y-position of the next bound (relative to my y-parent) if it belonged + to the same system as this bound. We rely on the fact that + the y-parent of the next bound is a spanner (probably the + VerticalAxisGroup of a staff) that extends over the break. + */ + Spanner *next_bound_parent_on_this_line = + next_bound_parent->broken_neighbor (other_dir (dir)); - y = next_ext.center (); + if (next_bound_parent_on_this_line) + { + Grob *common = me->common_refpoint (next_bound_parent_on_this_line, Y_AXIS); + Real bound_offset = next_bound_parent_on_this_line->relative_coordinate (common, Y_AXIS); + y = next_ext.center () + bound_offset - me->relative_coordinate (common, Y_AXIS); + } + else + { + /* We fall back to assuming that the distance between staves doesn't + change over line breaks. */ + programming_error ("next-bound's parent doesn't extend to this line"); + Grob *next_system = next_bound->get_system (); + Grob *this_system = me->get_system (); + y = next_ext.center () + next_bound_parent->relative_coordinate (next_system, Y_AXIS) + - me->relative_coordinate (this_system, Y_AXIS); + } } else { - Grob *commony = me->common_refpoint (me->get_bound (dir), Y_AXIS); - y = me->get_bound (dir)->extent (commony, Y_AXIS).center (); - details = scm_acons (ly_symbol2scm ("common-Y"), commony->self_scm (), details); + y = me->get_bound (dir)->extent (common_y, Y_AXIS).center (); + details = scm_acons (ly_symbol2scm ("common-Y"), common_y->self_scm (), details); } y += dir * extra_dy / 2; @@ -200,8 +244,7 @@ Line_spanner::print (SCM smob) do { Offset z (robust_scm2double (ly_assoc_get (ly_symbol2scm ("X"), - bounds[d], SCM_BOOL_F), 0.0) - + commonx->relative_coordinate (commonx, X_AXIS), + bounds[d], SCM_BOOL_F), 0.0), robust_scm2double (ly_assoc_get (ly_symbol2scm ("Y"), bounds[d], SCM_BOOL_F), 0.0)); @@ -243,13 +286,15 @@ Line_spanner::print (SCM smob) Stencil line; do { + span_points[d] += -d * gaps[d] * dz.direction (); + if (stencils[d]) { Stencil s = stencils[d]->translated (span_points[d]); SCM align = ly_assoc_get (ly_symbol2scm ("stencil-align-dir-y"), bounds[d], SCM_BOOL_F); SCM off = ly_assoc_get (ly_symbol2scm ("stencil-offset"), - bounds[d], SCM_BOOL_F); + bounds[d], SCM_BOOL_F); if (scm_is_number (align)) s.align_to (Y_AXIS, scm_to_double (align)); @@ -270,21 +315,23 @@ Line_spanner::print (SCM smob) if (stencils[d]) span_points[d] += dz_dir * (stencils[d]->extent (X_AXIS)[-d] / dz_dir[X_AXIS]); - - span_points[d] += -d * gaps[d] * dz.direction (); } while (flip (&d) != LEFT); Offset adjust = dz.direction() * Staff_symbol_referencer::staff_space (me); - line.add_stencil (Line_interface::line (me, - span_points[LEFT] + (arrows[LEFT] ? adjust*1.4 : Offset(0,0)), - span_points[RIGHT] - (arrows[RIGHT] ? adjust*0.55 : Offset(0,0)))); - line.add_stencil (Line_interface::arrows (me, - span_points[LEFT], - span_points[RIGHT], - arrows[LEFT], - arrows[RIGHT])); + Offset line_left = span_points[LEFT] + (arrows[LEFT] ? adjust*1.4 : Offset (0, 0)); + Offset line_right = span_points[RIGHT] - (arrows[RIGHT] ? adjust*0.55 : Offset (0, 0)); + if (line_right[X_AXIS] > line_left[X_AXIS]) + { + line.add_stencil (Line_interface::line (me, line_left, line_right)); + + line.add_stencil (Line_interface::arrows (me, + span_points[LEFT], + span_points[RIGHT], + arrows[LEFT], + arrows[RIGHT])); + } line.translate (Offset (-me->relative_coordinate (commonx, X_AXIS), -me->relative_coordinate (my_common_y, Y_AXIS))); @@ -300,11 +347,12 @@ ADD_INTERFACE (Line_spanner, "@code{dotted-line} or @code{zigzag}.\n" "\n", + "bound-details " "extra-dy " "gap " - "thickness " - "bound-details " - "left-bound-info " + "left-bound-info " + "note-columns " "right-bound-info " + "thickness " );