From: Mike Solomon Date: Tue, 5 Jul 2011 07:08:14 +0000 (+0200) Subject: Moves calculations for simple Y to line-spanner.cc. X-Git-Tag: release/2.15.5-1~21^2~1 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;ds=sidebyside;h=0c258f3f339573d25080dadd0a1a5078ec35b09a;p=lilypond.git Moves calculations for simple Y to line-spanner.cc. This avoids resetting the bound-info alist and fixes any bugs where the Y coordinates of the last glissando in a piece are transmitted to all glissandi. --- diff --git a/lily/line-spanner.cc b/lily/line-spanner.cc index d50b94834a..d55c01ff45 100644 --- a/lily/line-spanner.cc +++ b/lily/line-spanner.cc @@ -125,48 +125,59 @@ Line_spanner::calc_bound_info (SCM smob, Direction dir) 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); - Item *next_bound = next_sp->get_bound (dir); - - if (next_bound->break_status_dir ()) + if (to_boolean (me->get_property ("simple-Y"))) { - programming_error ("no note heads for the line spanner on neighbor line?" - " Confused."); - me->suicide (); - return SCM_EOL; + Spanner *orig = dynamic_cast(me->original ()); + Spanner *extreme = dir == LEFT ? orig->broken_intos_.front () : orig->broken_intos_.back (); + Grob *e_bound = extreme->get_bound (dir); + Grob *e_common_y = extreme->common_refpoint (e_bound, Y_AXIS); + y = e_bound->extent (e_common_y, Y_AXIS).center (); } + else + { + Spanner *next_sp = me->broken_neighbor (dir); + Item *next_bound = next_sp->get_bound (dir); + + if (next_bound->break_status_dir ()) + { + programming_error ("no note heads for the line spanner on neighbor line?" + " Confused."); + me->suicide (); + return SCM_EOL; + } + + Spanner *next_bound_parent = parent_spanner (next_bound); + Interval next_ext = next_bound->extent (next_bound_parent, 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)); - - 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. + 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. */ - 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); - } + Spanner *next_bound_parent_on_this_line = + next_bound_parent->broken_neighbor (other_dir (dir)); + + 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 { diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 9a8d14a1c3..a5c13d5195 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -938,7 +938,7 @@ (left-bound-info . ,ly:line-spanner::calc-left-bound-info) (normalized-endpoints . ,ly:spanner::calc-normalized-endpoints) (right-bound-info . ,ly:line-spanner::calc-right-bound-info) - (simple-Y . ,glissando::make-simple-y) + (simple-Y . #t) (stencil . ,ly:line-spanner::print) (style . line) (X-extent . #f) diff --git a/scm/output-lib.scm b/scm/output-lib.scm index 01953a9412..1081377907 100644 --- a/scm/output-lib.scm +++ b/scm/output-lib.scm @@ -792,40 +792,6 @@ between the two text elements." (ly:grob-property grob 'dot-placement-list)))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; glissando - -(define-public (glissando::make-simple-y grob) - "Establishes the Y terminus points of the glissando based on the -pre-broken positions of its left and right bounds." - (let* ((siblings (ly:spanner-broken-into (ly:grob-original grob))) - (bound-details (ly:grob-property grob 'bound-details)) - (extra-dy (ly:grob-property grob 'extra-dy 0.0))) - - (and (pair? siblings) - (for-each (lambda (dir-sym) - (let* ((details (assoc-get dir-sym bound-details)) - (dir (if (eq? dir-sym 'left) LEFT RIGHT)) - (good-grob (if (eq? dir-sym 'left) - (first siblings) - (last siblings))) - (bound (ly:spanner-bound good-grob dir)) - (common-y (ly:grob-common-refpoint good-grob - bound - Y)) - (y (+ (interval-center (ly:grob-extent bound - common-y - Y)) - (/ (* dir extra-dy) - 2)))) - (if (not (assoc-get 'Y details)) - (set! bound-details (assoc-set! bound-details dir-sym - (acons 'Y y details)))))) - '(left right)) - - (set! (ly:grob-property grob 'bound-details) bound-details)))) - - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; scripts