]> git.donarmstrong.com Git - lilypond.git/commitdiff
fix conditional-elements in horizontal-spacing skylines
authorJoe Neeman <joeneeman@gmail.com>
Sun, 17 Dec 2006 21:35:37 +0000 (23:35 +0200)
committerJoe Neeman <joeneeman@gmail.com>
Sun, 17 Dec 2006 21:35:37 +0000 (23:35 +0200)
lily/accidental-placement.cc
lily/include/accidental-placement.hh
lily/separation-item.cc

index f6bfefff5d944ca100b370bb9e1cdcb9133166ea..6aaf49b2e6ea12c11ab32370de72453f9a9f85ed 100644 (file)
@@ -75,6 +75,24 @@ Accidental_placement::split_accidentals (Grob *accs,
       }
 }
 
+vector<Grob*>
+Accidental_placement::get_break_reminder_accidentals (vector<Grob*> const &elts, Grob *left)
+{
+  vector<Grob*> br;
+  vector<Grob*> ra;
+  vector<Grob*> ret;
+
+  if (dynamic_cast<Item *> (left)->break_status_dir () != RIGHT)
+    return vector<Grob*> ();
+
+  for (vsize i = 0; i < elts.size (); i++)
+    {
+      split_accidentals (elts[i], &br, &ra);
+      ret.insert (ret.end (), br.begin (), br.end ());
+    }
+  return ret;
+}
+
 /*
   Accidentals are special, because they appear and disappear after
   ties at will.
index c34fc0b76615ca275e21bd36a18abf2f52ebb5ae..5d09bdc2df699cfbd555051536c434db5b39d589 100644 (file)
@@ -18,6 +18,8 @@ public:
   DECLARE_SCHEME_CALLBACK (alignment_callback, (SCM element));
   static void add_accidental (Grob *, Grob *);
 
+  static vector<Grob*> get_break_reminder_accidentals (vector<Grob*> const &elts,
+                                                      Grob *left);
   static Interval get_relevant_accidental_extent (Grob *me,
                                                  Item *item_col,
                                                  Grob *acc);
index 0f1d4610213b14c0734688c3ac5279512ffcef87..0a6c085afcf41a7f1f433f9f4b1a2cf319c0792a 100644 (file)
@@ -35,7 +35,7 @@ Separation_item::set_skyline_distance (Drul_array<Item *> items,
                                   Skyline_pair::unsmob (items[RIGHT]->get_property ("skylines")));
   Skyline right = conditional_skyline (items[RIGHT], items[LEFT]);
   right.merge ((*lines[RIGHT])[LEFT]);
-
+  
   Real dist = padding + (*lines[LEFT])[RIGHT].distance (right);
   if (dist > 0)
     {
@@ -91,7 +91,13 @@ Separation_item::boxes (Grob *me, Grob *left)
   int very_large = INT_MAX;
   Paper_column *pc = item->get_column ();
   vector<Box> out;
-  extract_grob_set (me, left ? "conditional-elements" : "elements", elts);
+  extract_grob_set (me, left ? "conditional-elements" : "elements", read_only_elts);
+  vector<Grob*> elts;
+
+  if (left)
+    elts = Accidental_placement::get_break_reminder_accidentals (read_only_elts, left);
+  else
+    elts = read_only_elts;
 
   Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS);
   
@@ -107,18 +113,11 @@ Separation_item::boxes (Grob *me, Grob *left)
        continue;
 
       Interval y (il->pure_height (ycommon, 0, very_large));
-      Interval x;
-      
-      if (!left)
-       x = il->extent (pc, X_AXIS);
-      else if (Accidental_placement::has_interface (il))
-       x = Accidental_placement::get_relevant_accidental_extent (il, pc, left);
-      else
-       continue;
+      Interval x (il->extent (pc, X_AXIS));
 
       SCM padding = elts[i]->get_property ("padding");
       x.widen (robust_scm2double (padding, 0));
-
       out.push_back (Box (x, y));
     }