]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/new-fingering-engraver.cc
Doc: run makelsr locally
[lilypond.git] / lily / new-fingering-engraver.cc
index 76ec02d69d37b4b83cc5fb2911fd0bf49439028f..0ad31ec1265d4d30cb8724c7a3bf0aacb2ca707b 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1998--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1998--2012 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
@@ -63,6 +63,7 @@ class New_fingering_engraver : public Engraver
   vector<Finger_tuple> string_numbers_;
 
   vector<Grob *> heads_;
+  vector<Grob *> accidentals_;
   Grob *stem_;
 
   void position_all ();
@@ -71,6 +72,7 @@ public:
 protected:
   void stop_translation_timestep ();
   DECLARE_ACKNOWLEDGER (rhythmic_head);
+  DECLARE_ACKNOWLEDGER (inline_accidental);
   DECLARE_ACKNOWLEDGER (stem);
   void add_fingering (Grob *, SCM,
                       vector<Finger_tuple> *,
@@ -80,6 +82,12 @@ protected:
   void position_scripts (SCM orientations, vector<Finger_tuple> *);
 };
 
+void
+New_fingering_engraver::acknowledge_inline_accidental (Grob_info inf)
+{
+  accidentals_.push_back (inf.grob ());
+}
+
 void
 New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf)
 {
@@ -106,15 +114,15 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf)
       else if (ev->in_event_class ("script-event"))
         add_script (inf.grob (), ev, note_ev);
       else if (ev->in_event_class ("string-number-event"))
-        {    
+        {
           // String numbers are used in calculating harmonics even
           // when we don't want them displayed.  So don't make space
           // for them if 'stencil is #f
           Grob *g = make_item ("StringNumber", ev->self_scm ());
           if (g->get_property ("stencil") != SCM_BOOL_F)
             add_fingering (inf.grob (),
-                            ly_symbol2scm ("StringNumber"), &string_numbers_,
-                            ev, note_ev);
+                           ly_symbol2scm ("StringNumber"), &string_numbers_,
+                           ev, note_ev);
           g->suicide (); // Kill grob created to check stencil
         }
       else if (ev->in_event_class ("stroke-finger-event"))
@@ -283,9 +291,8 @@ New_fingering_engraver::position_scripts (SCM orientations,
       f->set_property ("direction", scm_from_int (hordir));
     }
 
-  Direction d = DOWN;
   Drul_array< vector<Finger_tuple> > vertical (down, up);
-  do
+  for (DOWN_and_UP (d))
     {
       for (vsize i = 0; i < vertical[d].size (); i++)
         {
@@ -303,7 +310,6 @@ New_fingering_engraver::position_scripts (SCM orientations,
           f->set_property ("direction", scm_from_int (d));
         }
     }
-  while (flip (&d) != DOWN);
 }
 
 void
@@ -342,6 +348,10 @@ New_fingering_engraver::position_all ()
     {
       Grob *script = articulations_[i].script_;
 
+      for (vsize j = 0; j < accidentals_.size (); j++)
+        Side_position_interface::add_support (script, accidentals_[j]);
+
+      accidentals_.resize (0);
       for (vsize j = heads_.size (); j--;)
         Side_position_interface::add_support (script, heads_[j]);
 
@@ -360,6 +370,7 @@ New_fingering_engraver::New_fingering_engraver ()
 }
 
 ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head);
+ADD_ACKNOWLEDGER (New_fingering_engraver, inline_accidental);
 ADD_ACKNOWLEDGER (New_fingering_engraver, stem);
 
 ADD_TRANSLATOR (New_fingering_engraver,