]> git.donarmstrong.com Git - lilypond.git/commitdiff
Fix #1192.
authorNeil Puttock <n.puttock@gmail.com>
Mon, 26 Jul 2010 00:02:52 +0000 (01:02 +0100)
committerNeil Puttock <n.puttock@gmail.com>
Mon, 26 Jul 2010 00:02:52 +0000 (01:02 +0100)
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

input/regression/system-separator-spaceable-staves.ly [new file with mode: 0644]
lily/system.cc
lily/vertically-spaced-context-engraver.cc [deleted file]
ly/engraver-init.ly
scm/define-context-properties.scm
scm/define-grob-interfaces.scm
scm/define-grob-properties.scm
scm/define-grobs.scm

diff --git a/input/regression/system-separator-spaceable-staves.ly b/input/regression/system-separator-spaceable-staves.ly
new file mode 100644 (file)
index 0000000..7337e5a
--- /dev/null
@@ -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
+  }
+}
+
index 628603fa84921fee160994f3e15271bec6cbdf8d..8571cf35f9c2560231b892fbc6e22bbaa1e4bdf3 100644 (file)
@@ -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 (file)
index 8e5dee0..0000000
+++ /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 "
-               );
index 8522001347483a13b834f34ea04dcc2d21922dac..7b21ff2fef8c43de6195bc6c016d5b6447dc3781 100644 (file)
@@ -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
index 755c9fdf344728213ea2e47201b90efcc401291d..4a2a6736f2c7b4d7be560ca6225507fcb2df6e29 100644 (file)
@@ -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}.
index b73506790db88b41e6a0ba2f226506b7ef0a17de..2949afcfbc3b30bd9742019be0f8bc328bd9648b 100644 (file)
@@ -219,12 +219,6 @@ interesting enough to maintain a hara-kiri staff."
 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."
index b3401d2261db7c3365b4898faa4ea54688df2539..a69a603654b39c0c28c35b3072e7923774312fb1 100644 (file)
@@ -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.")
index 15d0b0d9086f2a7c02d99c8c36d21db634c21808..fc6782775538f09aff113cc8b6e577b793a92e29 100644 (file)
                                      (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
      . (