]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-placement.cc
Run `make grand-replace'.
[lilypond.git] / lily / accidental-placement.cc
index 6aaf49b2e6ea12c11ab32370de72453f9a9f85ed..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,7 +68,8 @@ 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);
@@ -76,54 +77,23 @@ Accidental_placement::split_accidentals (Grob *accs,
 }
 
 vector<Grob*>
-Accidental_placement::get_break_reminder_accidentals (vector<Grob*> const &elts, Grob *left)
+Accidental_placement::get_relevant_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*> ();
+  bool right = dynamic_cast<Item *> (left)->break_status_dir () == RIGHT;
 
   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.
-*/
-Interval
-Accidental_placement::get_relevant_accidental_extent (Grob *me,
-                                                     Item *item_col,
-                                                     Grob *left_object)
-{
-  vector<Grob*> br, ra;
-  vector<Grob*> *which = 0;
-
-  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));
+      
+      ret.insert (ret.end (), ra.begin (), ra.end ());
 
-  if (!extent.is_empty ())
-    {
-      Real p = robust_scm2double (me->get_property ("left-padding"), 0.2);
-      extent[LEFT] -= p;
+      if (right)
+       ret.insert (ret.end (), br.begin (), br.end ());
     }
-
-  return extent;
+  return ret;
 }
 
 struct Accidental_placement_entry
@@ -243,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)
 {
@@ -251,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;
@@ -397,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.
   */
@@ -406,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;
 
@@ -442,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;
 }