summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Puttock <n.puttock@gmail.com>2010-07-26 01:02:52 +0100
committerNeil Puttock <n.puttock@gmail.com>2010-07-26 01:02:52 +0100
commite65a2fb4c6e0e2e75f457531cab49aaf74364015 (patch)
tree55fd69fc2c17cacffc0734b39aec3194b02d0bbe
parent95a0132b69f0d9d0d3cef870c1e4548a4d68b5c7 (diff)
Fix #1192.
System separator positioning depends on correct calculation of the paper-system property 'staff-refpoint-extent, but this is incorrect for systems which include Staff-like contexts since the Vertically_spaced_contexts_engraver fails to acknowledge axis-groups whose origin context is aliased to Staff. Though it's simple to enhance the axis-group acknowledger to detect aliased contexts, a better solution is to remove the Vertically_spaced_context_engraver: spaceability is now determined by 'staff-affinity, so the engraver's more limited functionality can be folded into System::get_paper_system (). * lily/system.cc (get_paper_system): calculate 'staff-refpoint-extent via VerticalAlignment and Page_layout_problem::is_spaceable () remove 'spaceable-staves * lily/vertically-spaced-context-engraver.cc: delete * ly/engraver-init.ly: remove Vertically_spaced_context_engraver and verticallySpacedContexts * scm/define-context-properties.scm (all-user-translation-properties): remove verticallySpacedContexts definition * scm/define-grob-interfaces.scm: remove vertically-spaceable-interface * scm/define-grob-properties.scm (all-internal-grob-properties): remove 'spaceable-staves definition * scm/define-grobs.scm (all-grob-descriptions): remove vertically-spaceable-interface from VerticalAxisGroup
-rw-r--r--input/regression/system-separator-spaceable-staves.ly31
-rw-r--r--lily/system.cc87
-rw-r--r--lily/vertically-spaced-context-engraver.cc81
-rw-r--r--ly/engraver-init.ly2
-rw-r--r--scm/define-context-properties.scm3
-rw-r--r--scm/define-grob-interfaces.scm6
-rw-r--r--scm/define-grob-properties.scm2
-rw-r--r--scm/define-grobs.scm3
8 files changed, 75 insertions, 140 deletions
diff --git a/input/regression/system-separator-spaceable-staves.ly b/input/regression/system-separator-spaceable-staves.ly
new file mode 100644
index 0000000000..7337e5a706
--- /dev/null
+++ b/input/regression/system-separator-spaceable-staves.ly
@@ -0,0 +1,31 @@
+\version "2.13.29"
+
+\header {
+ texidoc = "System separator positioning works with all spaceable
+staff contexts."
+}
+
+
+\paper {
+ system-separator-markup = \slashSeparator
+ indent = 0
+}
+
+\book {
+ \new TabStaff {
+ c'1
+ }
+
+ \new Staff {
+ c'1
+ }
+
+ \new DrumStaff {
+ c'1
+ }
+
+ \new RhythmicStaff {
+ c'1
+ }
+}
+
diff --git a/lily/system.cc b/lily/system.cc
index 628603fa84..8571cf35f9 100644
--- a/lily/system.cc
+++ b/lily/system.cc
@@ -119,7 +119,7 @@ System::derived_mark () const
}
static void
-fixup_refpoints (vector<Grob*> const &grobs)
+fixup_refpoints (vector<Grob *> const &grobs)
{
for (vsize i = grobs.size (); i--;)
grobs[i]->fixup_refpoint ();
@@ -183,7 +183,7 @@ System::do_break_substitution_and_fixup_refpoints ()
that no duplicates are in the list. */
for (vsize i = 0; i < broken_intos_.size (); i++)
{
- System *child = dynamic_cast<System*> (broken_intos_[i]);
+ System *child = dynamic_cast<System *> (broken_intos_[i]);
child->all_elements_->remove_duplicates ();
for (vsize j = 0; j < child->all_elements_->size (); j++)
{
@@ -234,7 +234,7 @@ System::break_into_pieces (vector<Column_x_positions> const &breaking)
System *system = dynamic_cast<System *> (clone ());
system->rank_ = broken_intos_.size ();
- vector<Grob*> c (breaking[i].cols_);
+ vector<Grob *> c (breaking[i].cols_);
pscore_->typeset_system (system);
int st = Paper_column::get_rank (c[0]);
@@ -255,7 +255,7 @@ System::break_into_pieces (vector<Column_x_positions> const &breaking)
system_labels = scm_append (scm_list_2 (col_labels, system_labels));
}
system->set_property ("labels", system_labels);
-
+
set_loose_columns (system, &breaking[i]);
broken_intos_.push_back (system);
}
@@ -324,8 +324,8 @@ System::post_processing ()
This might seem inefficient, but Stencils are cached per grob
anyway. */
- vector<Grob*> all_elts_sorted (all_elements_->array ());
- vector_sort (all_elts_sorted, std::less<Grob*> ());
+ vector<Grob *> all_elts_sorted (all_elements_->array ());
+ vector_sort (all_elts_sorted, std::less<Grob *> ());
uniq (all_elts_sorted);
this->get_stencil ();
for (vsize i = all_elts_sorted.size (); i--;)
@@ -348,7 +348,6 @@ operator< (Layer_entry const &a,
return a.layer_ < b.layer_;
}
-
SCM
System::get_paper_system ()
{
@@ -363,8 +362,8 @@ System::get_paper_system ()
Layer_entry e;
e.grob_ = all_elements_->grob (j);
e.layer_ = robust_scm2int (e.grob_->get_property ("layer"), 1);
-
- entries.push_back (e);
+
+ entries.push_back (e);
}
vector_sort (entries, std::less<Layer_entry> ());
@@ -375,7 +374,7 @@ System::get_paper_system ()
if (st.expr () == SCM_EOL)
continue;
-
+
Offset o;
for (int a = X_AXIS; a < NO_AXES; a++)
o[Axis (a)] = g->relative_coordinate (this, Axis (a));
@@ -429,26 +428,30 @@ System::get_paper_system ()
pl->set_property ("page-turn-penalty", right_bound->get_property ("page-turn-penalty"));
Interval staff_refpoints;
- extract_grob_set (this, "spaceable-staves", staves);
- for (vsize i = 0; i < staves.size (); i++)
- if (staves[i]->is_live ())
- staff_refpoints.add_point (staves[i]->relative_coordinate (this, Y_AXIS));
+ if (Grob *align = get_vertical_alignment ())
+ {
+ extract_grob_set (align, "elements", staves);
+ for (vsize i = 0; i < staves.size (); i++)
+ if (staves[i]->is_live ()
+ && Page_layout_problem::is_spaceable (staves[i]))
+ staff_refpoints.add_point (staves[i]->relative_coordinate (this,
+ Y_AXIS));
+ }
pl->set_property ("staff-refpoint-extent", ly_interval2scm (staff_refpoints));
- pl->set_property ("system-grob", this->self_scm ());
+ pl->set_property ("system-grob", this->self_scm ());
return pl->unprotect ();
}
-vector<Item*>
+vector<Item *>
System::broken_col_range (Item const *left, Item const *right) const
{
- vector<Item*> ret;
+ vector<Item *> ret;
left = left->get_column ();
right = right->get_column ();
-
extract_grob_set (this, "columns", cols);
vsize i = Paper_column::get_rank (left);
@@ -468,10 +471,9 @@ System::broken_col_range (Item const *left, Item const *right) const
return ret;
}
-
/** Return all columns, but filter out any unused columns , since they might
disrupt the spacing problem. */
-vector<Grob*>
+vector<Grob *>
System::used_columns () const
{
extract_grob_set (this, "columns", ro_columns);
@@ -484,7 +486,7 @@ System::used_columns () const
break;
}
- vector<Grob*> columns;
+ vector<Grob *> columns;
for (int i = 0; i <= last_breakable; i++)
{
if (Paper_column::is_used (ro_columns[i]))
@@ -500,11 +502,11 @@ System::column (vsize which) const
extract_grob_set (this, "columns", columns);
if (which >= columns.size ())
return 0;
-
- return dynamic_cast<Paper_column*> (columns[which]);
+
+ return dynamic_cast<Paper_column *> (columns[which]);
}
-Paper_score*
+Paper_score *
System::paper_score () const
{
return pscore_;
@@ -517,14 +519,14 @@ System::get_rank () const
}
System *
-get_root_system (Grob *me)
+get_root_system (Grob *me)
{
Grob *system_grob = me;
-
+
while (system_grob->get_parent (Y_AXIS))
system_grob = system_grob->get_parent (Y_AXIS);
- return dynamic_cast<System*> (system_grob);
+ return dynamic_cast<System *> (system_grob);
}
Grob *
@@ -575,27 +577,25 @@ System::part_of_line_pure_height (vsize start, vsize end, bool begin)
{
Grob *alignment = get_vertical_alignment ();
if (!alignment)
- {
- programming_error("system does not have a vertical alignment");
- return Interval();
- }
+ return Interval ();
+
extract_grob_set (alignment, "elements", staves);
vector<Real> offsets = Align_interface::get_minimum_translations (alignment, staves, Y_AXIS, true, start, end);
Interval ret;
- for (vsize i = 0; i < staves.size(); ++i)
+ for (vsize i = 0; i < staves.size (); ++i)
{
- Interval iv = begin ?
- Axis_group_interface::begin_of_line_pure_height (staves[i], start) :
- Axis_group_interface::rest_of_line_pure_height (staves[i], start, end);
- if (i<offsets.size())
- iv.translate (offsets[i]);
+ Interval iv = begin
+ ? Axis_group_interface::begin_of_line_pure_height (staves[i], start)
+ : Axis_group_interface::rest_of_line_pure_height (staves[i], start, end);
+ if (i < offsets.size ())
+ iv.translate (offsets[i]);
ret.unite (iv);
}
- Interval other_elements = begin ?
- Axis_group_interface::begin_of_line_pure_height (this, start) :
- Axis_group_interface::rest_of_line_pure_height (this, start, end);
+ Interval other_elements = begin
+ ? Axis_group_interface::begin_of_line_pure_height (this, start)
+ : Axis_group_interface::rest_of_line_pure_height (this, start, end);
ret.unite (other_elements);
@@ -624,7 +624,7 @@ System::calc_pure_relevant_grobs (SCM smob)
Grob *me = unsmob_grob (smob);
extract_grob_set (me, "elements", elts);
- vector<Grob*> relevant_grobs;
+ vector<Grob *> relevant_grobs;
SCM pure_relevant_p = ly_lily_module_constant ("pure-relevant?");
for (vsize i = 0; i < elts.size (); ++i)
@@ -651,7 +651,7 @@ MAKE_SCHEME_CALLBACK (System, calc_pure_height, 3);
SCM
System::calc_pure_height (SCM smob, SCM start_scm, SCM end_scm)
{
- System *me = dynamic_cast<System*> (unsmob_grob (smob));
+ System *me = dynamic_cast<System *> (unsmob_grob (smob));
int start = scm_to_int (start_scm);
int end = scm_to_int (end_scm);
@@ -672,7 +672,6 @@ ADD_INTERFACE (System,
"columns "
"labels "
"pure-Y-extent "
- "spaceable-staves "
"skyline-distance "
"skyline-horizontal-padding "
- )
+ );
diff --git a/lily/vertically-spaced-context-engraver.cc b/lily/vertically-spaced-context-engraver.cc
deleted file mode 100644
index 8e5dee0ca7..0000000000
--- a/lily/vertically-spaced-context-engraver.cc
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- This file is part of LilyPond, the GNU music typesetter.
-
- Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
- 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 "engraver.hh"
-#include "grob.hh"
-#include "axis-group-interface.hh"
-#include "context.hh"
-#include "pointer-group-interface.hh"
-
-class Vertically_spaced_contexts_engraver : public Engraver
-{
- TRANSLATOR_DECLARATIONS (Vertically_spaced_contexts_engraver);
-protected:
- virtual void initialize ();
- DECLARE_ACKNOWLEDGER (vertically_spaceable);
-
-private:
- Grob *system_;
-};
-
-Vertically_spaced_contexts_engraver::Vertically_spaced_contexts_engraver ()
-{
- system_ = 0;
-}
-
-void
-Vertically_spaced_contexts_engraver::initialize ()
-{
- system_ = unsmob_grob (get_property ("rootSystem"));
-}
-
-void
-Vertically_spaced_contexts_engraver::acknowledge_vertically_spaceable (Grob_info gi)
-{
- if (Axis_group_interface::has_interface (gi.grob ()))
- {
- SCM spaceable = get_property ("verticallySpacedContexts");
- Context *orig = gi.origin_contexts (this)[0];
-
- if (scm_memq (ly_symbol2scm (orig->context_name ().c_str ()),
- spaceable) != SCM_BOOL_F)
- {
- Pointer_group_interface::add_unordered_grob (system_,
- ly_symbol2scm ("spaceable-staves"),
- gi.grob ());
- }
- }
-}
-
-#include "translator.icc"
-
-ADD_ACKNOWLEDGER (Vertically_spaced_contexts_engraver, vertically_spaceable);
-ADD_TRANSLATOR (Vertically_spaced_contexts_engraver,
- /* doc */
- "",
-
- /* create */
- "",
-
- /* read */
- "verticallySpacedContexts ",
-
- /* write */
- "verticallySpacedContexts "
- );
diff --git a/ly/engraver-init.ly b/ly/engraver-init.ly
index 8522001347..7b21ff2fef 100644
--- a/ly/engraver-init.ly
+++ b/ly/engraver-init.ly
@@ -478,7 +478,6 @@ automatically when an output definition (a @code{\score} or
@code{\layout} block) is processed."
\consists "Paper_column_engraver"
- \consists "Vertically_spaced_contexts_engraver"
\consists "Repeat_acknowledge_engraver"
\consists "Staff_collecting_engraver"
@@ -672,7 +671,6 @@ automatically when an output definition (a @code{\score} or
tuplet-span-event)
instrumentTransposition = #(ly:make-pitch 0 0 0)
- verticallySpacedContexts = #'(Staff)
topLevelAlignment = ##t
timing = ##t
diff --git a/scm/define-context-properties.scm b/scm/define-context-properties.scm
index 755c9fdf34..4a2a6736f2 100644
--- a/scm/define-context-properties.scm
+++ b/scm/define-context-properties.scm
@@ -503,9 +503,6 @@ setting this property, you can make brackets last shorter.
(useBassFigureExtenders ,boolean? "Whether to use extender lines
for repeated bass figures.")
- (verticallySpacedContexts ,list? "List of symbols, containing
-context names whose vertical axis groups should be taken into account
-for vertical spacing of systems.")
(vocalName ,markup? "Name of a vocal line.")
(voltaSpannerDuration ,ly:moment? "This specifies the maximum
duration to use for the brackets printed for @code{\\alternative}.
diff --git a/scm/define-grob-interfaces.scm b/scm/define-grob-interfaces.scm
index b73506790d..2949afcfbc 100644
--- a/scm/define-grob-interfaces.scm
+++ b/scm/define-grob-interfaces.scm
@@ -220,12 +220,6 @@ with @code{breakable=##t}."
'(breakable))
(ly:add-interface
- 'vertically-spaceable-interface
- "Objects that should be kept at constant vertical distances. Typically:
-@rinternals{VerticalAxisGroup} objects of @rinternals{Staff} contexts."
- '())
-
-(ly:add-interface
'volta-interface
"A volta repeat."
'())
diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm
index b3401d2261..a69a603654 100644
--- a/scm/define-grob-properties.scm
+++ b/scm/define-grob-properties.scm
@@ -981,8 +981,6 @@ relevant for finding the @code{pure-Y-extent}.")
(side-support-elements ,ly:grob-array? "The side support, an array of
grobs.")
(slur ,ly:grob? "A pointer to a @code{Slur} object.")
- (spaceable-staves ,ly:grob-array? "Objects to be spaced during page
-layout.")
(spacing ,ly:grob? "The spacing spanner governing this section.")
(spacing-wishes ,ly:grob-array? "An array of note spacing or staff spacing
objects.")
diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm
index 15d0b0d908..fc67827755 100644
--- a/scm/define-grobs.scm
+++ b/scm/define-grobs.scm
@@ -2300,8 +2300,7 @@
(pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
(interfaces . (axis-group-interface
- hara-kiri-group-spanner-interface
- vertically-spaceable-interface))))))
+ hara-kiri-group-spanner-interface))))))
(VoiceFollower
. (