]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-placement.cc
* lily/ligature-bracket-engraver: Bugfix: Add missing stream event
[lilypond.git] / lily / accidental-placement.cc
index d35089066eecb5223779204bf830f5879840bf1a..199ff98c93f8b219d34465af2ef75d8401e2bfd7 100644 (file)
@@ -7,16 +7,18 @@
 */
 
 
-
 #include "accidental-placement.hh"
-#include "skyline.hh"
+
+#include "rhythmic-head.hh"
+#include "accidental-interface.hh"
 #include "music.hh"
-#include "pitch.hh"
-#include "warn.hh"
+#include "note-collision.hh"
 #include "note-column.hh"
+#include "pitch.hh"
 #include "pointer-group-interface.hh"
-#include "note-collision.hh"
-#include "accidental-interface.hh"
+#include "skyline.hh"
+#include "stream-event.hh"
+#include "warn.hh"
 
 
 void
@@ -26,10 +28,10 @@ Accidental_placement::add_accidental (Grob *me, Grob *a)
   a->set_property ("X-offset", Grob::x_parent_positioning_proc);
   SCM cause = a->get_parent (Y_AXIS)->get_property ("cause");
 
-  Music *mcause = unsmob_music (cause);
+  Stream_event *mcause = unsmob_stream_event (cause);
   if (!mcause)
     {
-      programming_error ("note head has no music cause");
+      programming_error ("note head has no event cause");
       return;
     }
 
@@ -57,8 +59,8 @@ Accidental_placement::add_accidental (Grob *me, Grob *a)
 */
 void
 Accidental_placement::split_accidentals (Grob *accs,
-                                        Link_array<Grob> *break_reminder,
-                                        Link_array<Grob> *real_acc)
+                                        vector<Grob*> *break_reminder,
+                                        vector<Grob*> *real_acc)
 {
   for (SCM acs = accs->get_object ("accidental-grobs"); scm_is_pair (acs);
        acs = scm_cdr (acs))
@@ -82,11 +84,11 @@ Accidental_placement::get_relevant_accidental_extent (Grob *me,
                                                      Item *item_col,
                                                      Grob *left_object)
 {
-  Link_array<Grob> br, ra;
-  Link_array<Grob> *which = 0;
+  vector<Grob*> br, ra;
+  vector<Grob*> *which = 0;
 
   Accidental_placement::split_accidentals (me, &br, &ra);
-  br.concat (ra);
+  concat (br, ra);
 
   if (dynamic_cast<Item *> (left_object)->break_status_dir () == RIGHT)
     which = &br;
@@ -108,11 +110,11 @@ Accidental_placement::get_relevant_accidental_extent (Grob *me,
 
 struct Accidental_placement_entry
 {
-  std::vector<Skyline_entry> left_skyline_;
-  std::vector<Skyline_entry> right_skyline_;
+  vector<Skyline_entry> left_skyline_;
+  vector<Skyline_entry> right_skyline_;
   Interval vertical_extent_;
-  std::vector<Box> extents_;
-  Link_array<Grob> grobs_;
+  vector<Box> extents_;
+  vector<Grob*> grobs_;
   Real offset_;
   int notename_;
   Accidental_placement_entry ()
@@ -134,6 +136,12 @@ int ape_compare (Accidental_placement_entry *const &a,
   return sign (ape_priority (a) - ape_priority (b));
 }
 
+bool ape_less (Accidental_placement_entry *const &a,
+              Accidental_placement_entry *const &b)
+{
+  return ape_priority (a) < ape_priority (b);
+}
+
 int ape_rcompare (Accidental_placement_entry *const &a,
                  Accidental_placement_entry *const &b)
 {
@@ -149,11 +157,11 @@ int ape_rcompare (Accidental_placement_entry *const &a,
   placement
 */
 void
-stagger_apes (Link_array<Accidental_placement_entry> *apes)
+stagger_apes (vector<Accidental_placement_entry*> *apes)
 {
-  Link_array<Accidental_placement_entry> asc = *apes;
+  vector<Accidental_placement_entry*> asc = *apes;
 
-  asc.sort (&ape_compare);
+  vector_sort (asc, &ape_less);
 
   apes->clear ();
 
@@ -162,7 +170,10 @@ stagger_apes (Link_array<Accidental_placement_entry> *apes)
     {
       Accidental_placement_entry *a = 0;
       if (parity)
-       a = asc.pop ();
+       {
+         a = asc.back ();
+         asc.pop_back ();
+       }
       else
        a = asc[i++];
 
@@ -170,7 +181,7 @@ stagger_apes (Link_array<Accidental_placement_entry> *apes)
       parity = !parity;
     }
 
-  apes->reverse ();
+  reverse (*apes);
 }
 
 /*
@@ -230,7 +241,7 @@ Accidental_placement::calc_positioning_done (SCM smob)
     TODO: there is a bug in this code. If two accs are on the same
     Y-position, they share an Ape, and will be printed in overstrike.
   */
-  Link_array<Accidental_placement_entry> apes;
+  vector<Accidental_placement_entry*> apes;
   for (SCM s = accs; scm_is_pair (s); s = scm_cdr (s))
     {
       Accidental_placement_entry *ape = new Accidental_placement_entry;
@@ -248,7 +259,7 @@ Accidental_placement::calc_positioning_done (SCM smob)
     First we must extract *all* pointers. We can only determine
     extents if we're sure that we've found the right common refpoint
   */
-  Link_array<Grob> note_cols, heads;
+  vector<Grob*> note_cols, heads;
   for (vsize i = apes.size (); i--;)
     {
       Accidental_placement_entry *ape = apes[i];
@@ -282,15 +293,15 @@ Accidental_placement::calc_positioning_done (SCM smob)
        {
          extract_grob_set (c, "elements", gs);
 
-         note_cols.concat (gs);
+         concat (note_cols, gs);
        }
     }
 
   for (vsize i = note_cols.size (); i--;)
-    heads.concat (extract_grob_array (note_cols[i], "note-heads"));
+    concat (heads, extract_grob_array (note_cols[i], "note-heads"));
 
-  heads.default_sort ();
-  heads.uniq ();
+  vector_sort (heads, less<Grob*> ());
+  uniq (heads);
   common[Y_AXIS] = common_refpoint_of_array (heads, common[Y_AXIS], Y_AXIS);
 
   for (vsize i = apes.size (); i--;)
@@ -303,7 +314,7 @@ Accidental_placement::calc_positioning_done (SCM smob)
        {
          Grob *a = apes[i]->grobs_[j];
 
-         std::vector<Box> boxes = Accidental_interface::accurate_boxes (a, common);
+         vector<Box> boxes = Accidental_interface::accurate_boxes (a, common);
 
          ape->extents_.insert (ape->extents_.end (), boxes.begin (), boxes.end ());
          for (vsize j = boxes.size (); j--;)
@@ -329,8 +340,9 @@ Accidental_placement::calc_positioning_done (SCM smob)
 
   Accidental_placement_entry *head_ape = new Accidental_placement_entry;
   common[X_AXIS] = common_refpoint_of_array (heads, common[X_AXIS], X_AXIS);
-  std::vector<Skyline_entry> head_skyline (empty_skyline (LEFT));
-  std::vector<Box> head_extents;
+  vector<Skyline_entry> head_skyline (empty_skyline (LEFT));
+  
+  vector<Box> head_extents;
   for (vsize i = heads.size (); i--;)
     {
       Box b (heads[i]->extent (common[X_AXIS], X_AXIS),
@@ -339,12 +351,31 @@ Accidental_placement::calc_positioning_done (SCM smob)
       insert_extent_into_skyline (&head_skyline, b, Y_AXIS, LEFT);
     }
 
+  vector<Grob *> stems;
+  for (vsize i = 0; i < heads.size  (); i++)
+    {
+      if (Grob *s = Rhythmic_head::get_stem (heads[i]))
+       stems.push_back (s);
+    }
+  
+  vector_sort (stems, less<Grob*> ());
+  uniq (stems);
+  for (vsize i = 0; i < stems.size (); i ++)
+    {
+      int very_large = INT_MAX;
+      
+      Box b (heads[i]->extent (common[X_AXIS], X_AXIS),
+            heads[i]->pure_height (common[Y_AXIS], 0, very_large));
+
+      insert_extent_into_skyline (&head_skyline, b, Y_AXIS, LEFT);
+    }
+  
   head_ape->left_skyline_ = head_skyline;
   head_ape->offset_ = 0.0;
 
   Real padding = robust_scm2double (me->get_property ("padding"), 0.2);
 
-  std::vector<Skyline_entry> left_skyline = head_ape->left_skyline_;
+  vector<Skyline_entry> left_skyline = head_ape->left_skyline_;
   heighten_skyline (&left_skyline,
                    -robust_scm2double (me->get_property ("right-padding"), 0));
   /*
@@ -361,7 +392,7 @@ Accidental_placement::calc_positioning_done (SCM smob)
 
       apes[i]->offset_ = offset;
 
-      std::vector<Skyline_entry> new_left_skyline = apes[i]->left_skyline_;
+      vector<Skyline_entry> new_left_skyline = apes[i]->left_skyline_;
       heighten_skyline (&new_left_skyline, apes[i]->offset_);
       merge_skyline (&new_left_skyline, left_skyline, LEFT);
       left_skyline = new_left_skyline;