From: Joe Neeman <joeneeman@gmail.com>
Date: Thu, 5 Jul 2007 03:24:39 +0000 (+1000)
Subject: move extremal_break_aligned_grob to Spacing_interface
X-Git-Tag: release/2.11.28-1~21^2~14
X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=fd4e16ed62c2a7769fcb5ed2c84697808fbad50a;p=lilypond.git

move extremal_break_aligned_grob to Spacing_interface
---

diff --git a/lily/include/spacing-interface.hh b/lily/include/spacing-interface.hh
index 14b8c2bf03..135b31ae6e 100644
--- a/lily/include/spacing-interface.hh
+++ b/lily/include/spacing-interface.hh
@@ -19,6 +19,7 @@ struct Spacing_interface
   static Item* right_column (Grob *me);
   static Item* left_column (Grob *me);
   static Drul_array<Skyline> skylines (Grob *me, Grob *right_col);
+  static Grob* extremal_break_aligned_grob (Grob *me, Direction, Direction, Interval*);
 
   DECLARE_GROB_INTERFACE();
 };
diff --git a/lily/note-spacing.cc b/lily/note-spacing.cc
index 61af354f4c..c434e633c3 100644
--- a/lily/note-spacing.cc
+++ b/lily/note-spacing.cc
@@ -116,6 +116,12 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
   Direction d = LEFT;
   bool acc_right = false;
 
+  Grob *bar = Spacing_interface::extremal_break_aligned_grob (me, RIGHT,
+							      rcolumn->break_status_dir (),
+							      &bar_xextent);
+  if (bar)
+    bar_yextent = Staff_spacing::bar_y_positions (bar);
+
   do
     {
       vector<Grob*> const &items (ly_scm2link_array (props [d]));
@@ -129,22 +135,7 @@ Note_spacing::stem_dir_correction (Grob *me, Item *rcolumn,
 	  Grob *stem = Note_column::get_stem (it);
 
 	  if (!stem || !stem->is_live ())
-	    {
-	      if (d == RIGHT && Separation_item::has_interface (it))
-		{
-		  if (it->get_column () != rcolumn)
-		    it = it->find_prebroken_piece (rcolumn->break_status_dir ());
-
-		  Grob *last = Separation_item::extremal_break_aligned_grob (it, LEFT, &bar_xextent);
-
-		  if (last)
-		    bar_yextent = Staff_spacing::bar_y_positions (last);
-
-		  break;
-		}
-
-	      return;
-	    }
+	    return;
 
 	  if (Stem::is_invisible (stem))
 	    {
diff --git a/lily/separating-line-group-engraver.cc b/lily/separating-line-group-engraver.cc
index 31bd53a2d5..aafb49399e 100644
--- a/lily/separating-line-group-engraver.cc
+++ b/lily/separating-line-group-engraver.cc
@@ -49,8 +49,11 @@ protected:
   Spacings last_spacings_;
 
   DECLARE_ACKNOWLEDGER (item);
+  DECLARE_ACKNOWLEDGER (break_aligned);
   void stop_translation_timestep ();
   void start_translation_timestep ();
+
+  vector<Grob*> break_aligned_;
 public:
   TRANSLATOR_DECLARATIONS (Separating_line_group_engraver);
 };
@@ -101,6 +104,12 @@ Separating_line_group_engraver::acknowledge_item (Grob_info i)
     }
 }
 
+void
+Separating_line_group_engraver::acknowledge_break_aligned (Grob_info gi)
+{
+  break_aligned_.push_back (gi.grob ());
+}
+
 void
 Separating_line_group_engraver::start_translation_timestep ()
 {
@@ -110,6 +119,18 @@ Separating_line_group_engraver::start_translation_timestep ()
 void
 Separating_line_group_engraver::stop_translation_timestep ()
 {
+  for (vsize i = 0; i < break_aligned_.size (); i++)
+    {
+      SCM smob = break_aligned_[i]->self_scm ();
+
+      if (Item *sp = current_spacings_.staff_spacing_)
+	Pointer_group_interface::add_grob (sp, ly_symbol2scm ("left-break-aligned"), smob);
+
+      for (vsize j = 0; j < last_spacings_.note_spacings_.size (); j++)
+	Pointer_group_interface::add_grob (last_spacings_.note_spacings_[j],
+					   ly_symbol2scm ("right-break-aligned"), smob);
+    }
+
   if (!current_spacings_.is_empty ())
     last_spacings_ = current_spacings_;
 
@@ -118,9 +139,12 @@ Separating_line_group_engraver::stop_translation_timestep ()
       Pointer_group_interface::add_grob (sp, ly_symbol2scm ("right-items"), col);
 
   current_spacings_.clear ();
+  break_aligned_.clear ();
 }
 
 ADD_ACKNOWLEDGER (Separating_line_group_engraver, item);
+ADD_ACKNOWLEDGER (Separating_line_group_engraver, break_aligned);
+
 ADD_TRANSLATOR (Separating_line_group_engraver,
 		/* doc */ "Generates objects for computing spacing parameters.",
 
diff --git a/lily/separation-item.cc b/lily/separation-item.cc
index a692fc0b9b..00103c31d4 100644
--- a/lily/separation-item.cc
+++ b/lily/separation-item.cc
@@ -128,45 +128,6 @@ Separation_item::boxes (Grob *me, Grob *left)
   return out;      
 }
 
-/*
-  Try to find the break-aligned symbol in SEPARATION_ITEM that is
-  sticking out at direction D. The x size is put in LAST_EXT
-*/
-Grob *
-Separation_item::extremal_break_aligned_grob (Grob *me,
-					      Direction d,
-					      Interval *last_ext)
-{
-  Grob *col = dynamic_cast<Item *> (me)->get_column ();
-  last_ext->set_empty ();
-  Grob *last_grob = 0;
-
-  extract_grob_set (me, "elements", elts);
-  for (vsize i = elts.size (); i--;)
-    {
-      Grob *break_item = elts[i];
-      if (!scm_is_symbol (break_item->get_property ("break-align-symbol")))
-	continue;
-
-      if (!scm_is_pair (break_item->get_property ("space-alist")))
-	continue;
-
-      Interval ext = break_item->extent (col, X_AXIS);
-
-      if (ext.is_empty ())
-	continue;
-
-      if (!last_grob
-	  || (last_grob && d * (ext[d]- (*last_ext)[d]) > 0))
-	{
-	  *last_ext = ext;
-	  last_grob = break_item;
-	}
-    }
-
-  return last_grob;
-}
-
 extern bool debug_skylines;
 MAKE_SCHEME_CALLBACK (Separation_item, print, 1)
 SCM
diff --git a/lily/spacing-interface.cc b/lily/spacing-interface.cc
index dbfe4e43c6..93bd1c2cfa 100644
--- a/lily/spacing-interface.cc
+++ b/lily/spacing-interface.cc
@@ -168,6 +168,52 @@ Spacing_interface::left_note_columns (Grob *me)
   return get_note_columns (elts);
 }
 
+/*
+  Try to find the break-aligned symbol that belongs on the D-side
+  of ME, sticking out in direction -D. The x size is put in LAST_EXT
+*/
+Grob *
+Spacing_interface::extremal_break_aligned_grob (Grob *me,
+						Direction d,
+						Direction break_dir,
+						Interval *last_ext)
+{
+  Grob *col = 0;
+  last_ext->set_empty ();
+  Grob *last_grob = 0;
+
+  extract_grob_set (me, d == LEFT ? "left-break-aligned" : "right-break-aligned", elts);
+
+  for (vsize i = elts.size (); i--;)
+    {
+      Item *break_item = dynamic_cast<Item*> (elts[i]);
+
+      if (break_item->break_status_dir () != break_dir)
+	break_item = break_item->find_prebroken_piece (break_dir);
+
+      if (!break_item || !scm_is_pair (break_item->get_property ("space-alist")))
+	continue;
+
+      if (!col)
+	col = dynamic_cast<Item*> (elts[0])->get_column ()->find_prebroken_piece (break_dir);
+
+      Interval ext = break_item->extent (col, X_AXIS);
+
+      if (ext.is_empty ())
+	continue;
+
+      if (!last_grob
+	  || (last_grob && d * (ext[-d]- (*last_ext)[-d]) < 0))
+	{
+	  *last_ext = ext;
+	  last_grob = break_item;
+	}
+    }
+
+  return last_grob;
+}
+
+
 ADD_INTERFACE (Spacing_interface,
 	       "This object calculates the desired and minimum distances between two columns.",
 
diff --git a/lily/staff-spacing.cc b/lily/staff-spacing.cc
index 8a8822a803..72b997514c 100644
--- a/lily/staff-spacing.cc
+++ b/lily/staff-spacing.cc
@@ -119,8 +119,10 @@ Staff_spacing::get_spacing (Grob *me, Grob *right_col)
   Grob *left_col = me_item->get_column ();
 
   Interval last_ext;
-  Grob *last_grob = Separation_item::extremal_break_aligned_grob (left_col, RIGHT,
-								  &last_ext);
+  Direction break_dir = me_item->break_status_dir ();
+  Grob *last_grob = Spacing_interface::extremal_break_aligned_grob (me, LEFT,
+								    break_dir,
+								    &last_ext);
   if (!last_grob)
     {
       /*