]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-placement.cc
Run `make grand-replace'.
[lilypond.git] / lily / accidental-placement.cc
index f6bfefff5d944ca100b370bb9e1cdcb9133166ea..1c7d356cc93f1b17ce289277f99520745de6cc87 100644 (file)
@@ -3,7 +3,7 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2002--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  (c) 2002--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 
@@ -68,44 +68,32 @@ Accidental_placement::split_accidentals (Grob *accs,
       {
        Grob *a = unsmob_grob (scm_car (s));
 
-       if (unsmob_grob (a->get_object ("tie")))
+       if (unsmob_grob (a->get_object ("tie"))
+           && !to_boolean (a->get_property ("forced")))
          break_reminder->push_back (a);
        else
          real_acc->push_back (a);
       }
 }
 
-/*
-  Accidentals are special, because they appear and disappear after
-  ties at will.
-*/
-Interval
-Accidental_placement::get_relevant_accidental_extent (Grob *me,
-                                                     Item *item_col,
-                                                     Grob *left_object)
+vector<Grob*>
+Accidental_placement::get_relevant_accidentals (vector<Grob*> const &elts, Grob *left)
 {
-  vector<Grob*> br, ra;
-  vector<Grob*> *which = 0;
+  vector<Grob*> br;
+  vector<Grob*> ra;
+  vector<Grob*> ret;
+  bool right = dynamic_cast<Item *> (left)->break_status_dir () == RIGHT;
 
-  Accidental_placement::split_accidentals (me, &br, &ra);
-  concat (br, ra);
-
-  if (dynamic_cast<Item *> (left_object)->break_status_dir () == RIGHT)
-    which = &br;
-  else
-    which = &ra;
-
-  Interval extent;
-  for (vsize i = 0; i < which->size (); i++)
-    extent.unite (which->at (i)->extent (item_col, X_AXIS));
-
-  if (!extent.is_empty ())
+  for (vsize i = 0; i < elts.size (); i++)
     {
-      Real p = robust_scm2double (me->get_property ("left-padding"), 0.2);
-      extent[LEFT] -= p;
-    }
+      split_accidentals (elts[i], &br, &ra);
+      
+      ret.insert (ret.end (), ra.begin (), ra.end ());
 
-  return extent;
+      if (right)
+       ret.insert (ret.end (), br.begin (), br.end ());
+    }
+  return ret;
 }
 
 struct Accidental_placement_entry
@@ -225,7 +213,7 @@ stagger_apes (vector<Accidental_placement_entry*> *apes)
 
 */
 
-MAKE_SCHEME_CALLBACK(Accidental_placement, calc_positioning_done, 1);
+MAKE_SCHEME_CALLBACK (Accidental_placement, calc_positioning_done, 1);
 SCM
 Accidental_placement::calc_positioning_done (SCM smob)
 {
@@ -233,6 +221,8 @@ Accidental_placement::calc_positioning_done (SCM smob)
   if (!me->is_live ())
     return SCM_BOOL_T;
 
+  me->set_property ("positioning-done", SCM_BOOL_T);
+  
   SCM accs = me->get_object ("accidental-grobs");
   if (!scm_is_pair (accs))
     return SCM_BOOL_T;
@@ -379,8 +369,8 @@ Accidental_placement::calc_positioning_done (SCM smob)
   Real padding = robust_scm2double (me->get_property ("padding"), 0.2);
 
   Skyline left_skyline = head_ape->left_skyline_;
-  left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0))
-;
+  left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0));
+  
   /*
     Add accs entries right-to-left.
   */
@@ -388,7 +378,7 @@ Accidental_placement::calc_positioning_done (SCM smob)
     {
       Real offset = -apes[i]->right_skyline_.distance (left_skyline);
       if (isinf (offset))
-       offset = (i < apes.size () - 1) ? apes[i + 1]->offset_ : 0.0;
+       offset = (i + 1 < apes.size ()) ? apes[i + 1]->offset_ : 0.0;
       else
        offset -= padding;
 
@@ -424,9 +414,10 @@ Accidental_placement::calc_positioning_done (SCM smob)
   me->flush_extent_cache (X_AXIS);
   me->set_property ("X-extent", scm_width);
 
-  for (vsize i = apes.size (); i--;)
-    delete apes[i];
+  junk_pointers (apes);
 
+  delete head_ape;
+  
   return SCM_BOOL_T;
 }