From f4d8c77fc2ebac49bbdb0d0e9bec636313508846 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Janek=20Warcho=C5=82?= Date: Mon, 8 Apr 2013 15:58:08 +0200 Subject: [PATCH] use X-parents to align MMRNumbers, MMRTexts and PercentRepeatCounters It makes more sense to use X-parents than Y-parents for horizontal alignment. To be able to do this, we have to ensure that X-parents of MultiMeasureRestNumber, MultiMeasureRestText and PercentRepeatCounter won't be overwritten by set_bound (these grobs are spanners). We can do this because parents of these grobs are spanners as well. Expected changes in output: none. --- lily/include/self-alignment-interface.hh | 1 - lily/multi-measure-rest-engraver.cc | 1 + lily/percent-repeat-engraver.cc | 1 + lily/self-alignment-interface.cc | 7 ------- lily/spanner.cc | 13 ++++++++++++- scm/define-grobs.scm | 8 ++++---- 6 files changed, 18 insertions(+), 13 deletions(-) diff --git a/lily/include/self-alignment-interface.hh b/lily/include/self-alignment-interface.hh index 2b34b39eff..823556a4c2 100644 --- a/lily/include/self-alignment-interface.hh +++ b/lily/include/self-alignment-interface.hh @@ -41,7 +41,6 @@ struct Self_alignment_interface DECLARE_SCHEME_CALLBACK (centered_on_note_columns, (SCM element)); DECLARE_SCHEME_CALLBACK (centered_on_x_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (centered_on_y_parent, (SCM element)); - DECLARE_SCHEME_CALLBACK (x_centered_on_y_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (aligned_on_x_parent, (SCM element)); DECLARE_SCHEME_CALLBACK (aligned_on_y_parent, (SCM element)); }; diff --git a/lily/multi-measure-rest-engraver.cc b/lily/multi-measure-rest-engraver.cc index 9f460dd981..3b968e654f 100644 --- a/lily/multi-measure-rest-engraver.cc +++ b/lily/multi-measure-rest-engraver.cc @@ -146,6 +146,7 @@ Multi_measure_rest_engraver::process_music () { Side_position_interface::add_support (numbers_[i], mmrest_); numbers_[i]->set_parent (mmrest_, Y_AXIS); + numbers_[i]->set_parent (mmrest_, X_AXIS); } start_measure_ diff --git a/lily/percent-repeat-engraver.cc b/lily/percent-repeat-engraver.cc index 008081f138..98d840e0c7 100644 --- a/lily/percent-repeat-engraver.cc +++ b/lily/percent-repeat-engraver.cc @@ -133,6 +133,7 @@ Percent_repeat_engraver::process_music () percent_counter_->set_bound (LEFT, col); Side_position_interface::add_support (percent_counter_, percent_); percent_counter_->set_parent (percent_, Y_AXIS); + percent_counter_->set_parent (percent_, X_AXIS); } else percent_counter_ = 0; diff --git a/lily/self-alignment-interface.cc b/lily/self-alignment-interface.cc index f04eb19d10..eb51dc7f1b 100644 --- a/lily/self-alignment-interface.cc +++ b/lily/self-alignment-interface.cc @@ -107,13 +107,6 @@ Self_alignment_interface::centered_on_y_parent (SCM smob) return centered_on_object (unsmob_grob (smob)->get_parent (Y_AXIS), Y_AXIS); } -MAKE_SCHEME_CALLBACK (Self_alignment_interface, x_centered_on_y_parent, 1); -SCM -Self_alignment_interface::x_centered_on_y_parent (SCM smob) -{ - return centered_on_object (unsmob_grob (smob)->get_parent (Y_AXIS), X_AXIS); -} - MAKE_SCHEME_CALLBACK (Self_alignment_interface, aligned_on_x_parent, 1); SCM Self_alignment_interface::aligned_on_x_parent (SCM smob) diff --git a/lily/spanner.cc b/lily/spanner.cc index 5d0485f46e..7c36f1755b 100644 --- a/lily/spanner.cc +++ b/lily/spanner.cc @@ -183,6 +183,10 @@ Spanner::get_bound (Direction d) const /* Set the items that this spanner spans. If D == LEFT, we also set the X-axis parent of THIS to S. + + For example, when a slur crosses a line break, it's broken into two + pieces. The second piece shouldn't be positioned relative to the + original NoteColumn, but rather to the PaperColumn after the break. */ void Spanner::set_bound (Direction d, Grob *s) @@ -200,7 +204,14 @@ Spanner::set_bound (Direction d, Grob *s) We check for System to prevent the column -> line_of_score -> column -> line_of_score -> etc situation */ if (d == LEFT && !dynamic_cast (this)) - set_parent (i, X_AXIS); + /* + If the X-parent is a spanner, it will be split across linebreaks, too, + so we shouldn't have to overwrite it with the bound. Also, we need + original parent for alignment. + This happens e.g. for MultiMeasureRestNumbers and PercentRepeatCounters. + */ + if (!dynamic_cast (this->get_parent (X_AXIS))) + set_parent (i, X_AXIS); /* Signal that this column needs to be kept alive. They need to be diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 62473075de..aa3e605aeb 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -787,7 +787,7 @@ (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure - (list ly:self-alignment-interface::centered-on-y-parent)) + (list ly:self-alignment-interface::centered-on-x-parent)) ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))))) (Y-offset . ,side-position-interface::y-aligned-side) @@ -1546,7 +1546,7 @@ ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self)) ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent))))) + (list ly:self-alignment-interface::centered-on-x-parent))))) (Y-offset . ,side-position-interface::y-aligned-side) (vertical-skylines . ,grob::unpure-vertical-skylines-from-stencil) (Y-extent . ,grob::always-Y-extent-from-stencil) @@ -1570,7 +1570,7 @@ (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent)) + (list ly:self-alignment-interface::centered-on-x-parent)) ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))))) (Y-offset . ,side-position-interface::y-aligned-side) @@ -1777,7 +1777,7 @@ (X-offset . ,(ly:make-simple-closure `(,+ ,(ly:make-simple-closure - (list ly:self-alignment-interface::x-centered-on-y-parent)) + (list ly:self-alignment-interface::centered-on-x-parent)) ,(ly:make-simple-closure (list ly:self-alignment-interface::x-aligned-on-self))))) (Y-offset . ,side-position-interface::y-aligned-side) -- 2.39.2