]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-placement.cc
Imported Upstream version 2.14.2
[lilypond.git] / lily / accidental-placement.cc
index 02f0a2a6094c00d30bd2148d624dd82f5da137ff..4a535c785783d937e3112d8221fef5dbbe2381a2 100644 (file)
@@ -1,26 +1,36 @@
 /*
-  accidental-placement.cc -- implement Accidental_placement
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2002--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 2002--2009 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
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
 
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
+*/
 
 #include "accidental-placement.hh"
 
-#include "item.hh"
-#include "rhythmic-head.hh"
 #include "accidental-interface.hh"
+#include "item.hh"
 #include "music.hh"
 #include "note-collision.hh"
 #include "note-column.hh"
 #include "pointer-group-interface.hh"
+#include "rhythmic-head.hh"
 #include "skyline.hh"
 #include "stream-event.hh"
 #include "warn.hh"
 
-static Pitch*
+static Pitch *
 accidental_pitch (Grob *acc)
 {
   SCM cause = acc->get_parent (Y_AXIS)->get_property ("cause");
@@ -66,8 +76,8 @@ Accidental_placement::add_accidental (Grob *me, Grob *a)
 */
 void
 Accidental_placement::split_accidentals (Grob *accs,
-                                        vector<Grob*> *break_reminder,
-                                        vector<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))
@@ -83,18 +93,18 @@ Accidental_placement::split_accidentals (Grob *accs,
       }
 }
 
-vector<Grob*>
-Accidental_placement::get_relevant_accidentals (vector<Grob*> const &elts, Grob *left)
+vector<Grob *>
+Accidental_placement::get_relevant_accidentals (vector<Grob *> const &elts, Grob *left)
 {
-  vector<Grob*> br;
-  vector<Grob*> ra;
-  vector<Grob*> ret;
+  vector<Grob *> br;
+  vector<Grob *> ra;
+  vector<Grob *> ret;
   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 (), ra.begin (), ra.end ());
 
       if (right)
@@ -109,7 +119,7 @@ struct Accidental_placement_entry
   Skyline right_skyline_;
   Interval vertical_extent_;
   vector<Box> extents_;
-  vector<Grob*> grobs_;
+  vector<Grob *> grobs_;
 };
 
 Real ape_priority (Accidental_placement_entry const *a)
@@ -161,15 +171,15 @@ acc_less (Grob *const &a, Grob *const &b)
 /*
   TODO: should favor
 
-  b
-  b
+  *  b
+  b
 
   placement
 */
 void
-stagger_apes (vector<Accidental_placement_entry*> *apes)
+stagger_apes (vector<Accidental_placement_entry *> *apes)
 {
-  vector<Accidental_placement_entry*> asc = *apes;
+  vector<Accidental_placement_entry *> asc = *apes;
 
   vector_sort (asc, &ape_less);
 
@@ -194,10 +204,10 @@ stagger_apes (vector<Accidental_placement_entry*> *apes)
   reverse (*apes);
 }
 
-static vector<Accidental_placement_entry*>
+static vector<Accidental_placement_entry *>
 build_apes (SCM accs)
 {
-  vector<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;
@@ -213,9 +223,9 @@ build_apes (SCM accs)
 
 static void
 set_ape_skylines (Accidental_placement_entry *ape,
-                 Grob **common)
+                 Grob **common, Real padding)
 {
-  vector<Grob*> accs (ape->grobs_);
+  vector<Grob *> accs (ape->grobs_);
   vector_sort (accs, &acc_less);
 
   /* We know that each accidental has the same note name and we assume that
@@ -238,7 +248,7 @@ set_ape_skylines (Accidental_placement_entry *ape,
       if (i == accs.size () - 1 || p->get_octave () != last_octave)
        {
          last_offset = 0;
-         offset = a->extent (a, X_AXIS)[LEFT] - 0.2;
+         offset = a->extent (a, X_AXIS)[LEFT] - padding;
        }
       else if (p->get_alteration () == last_alteration)
        a->translate_axis (last_offset, X_AXIS);
@@ -247,9 +257,8 @@ set_ape_skylines (Accidental_placement_entry *ape,
          Real this_offset = offset - a->extent (a, X_AXIS)[RIGHT];
          a->translate_axis (this_offset, X_AXIS);
 
-         /* FIXME: read the padding from the AccidentalPlacement grob */
          last_offset = this_offset;
-         offset -= a->extent (a, X_AXIS).length () + 0.2;
+         offset -= a->extent (a, X_AXIS).length () + padding;
        }
 
       vector<Box> boxes = Accidental_interface::accurate_boxes (a, common);
@@ -265,11 +274,11 @@ set_ape_skylines (Accidental_placement_entry *ape,
   ape->right_skyline_ = Skyline (ape->extents_, 0, Y_AXIS, RIGHT);
 }
 
-static vector<Grob*>
-extract_heads_and_stems (vector<Accidental_placement_entry*> const &apes)
+static vector<Grob *>
+extract_heads_and_stems (vector<Accidental_placement_entry *> const &apes)
 {
-  vector<Grob*> note_cols;
-  vector<Grob*> ret;
+  vector<Grob *> note_cols;
+  vector<Grob *> ret;
 
   for (vsize i = apes.size (); i--;)
     {
@@ -310,14 +319,13 @@ extract_heads_and_stems (vector<Accidental_placement_entry*> const &apes)
     if (Grob *s = Rhythmic_head::get_stem (ret[i]))
       ret.push_back (s);
 
-
-  vector_sort (ret, less<Grob*> ());
+  vector_sort (ret, less<Grob *> ());
   uniq (ret);
   return ret;
 }
 
-static Grob*
-common_refpoint_of_accidentals (vector<Accidental_placement_entry*> const &apes, Axis a)
+static Grob *
+common_refpoint_of_accidentals (vector<Accidental_placement_entry *> const &apes, Axis a)
 {
   Grob *ret = 0;
 
@@ -334,7 +342,7 @@ common_refpoint_of_accidentals (vector<Accidental_placement_entry*> const &apes,
 }
 
 static Skyline
-build_heads_skyline (vector<Grob*> const &heads_and_stems,
+build_heads_skyline (vector<Grob *> const &heads_and_stems,
                     Grob **common)
 {
   vector<Box> head_extents;
@@ -351,13 +359,13 @@ build_heads_skyline (vector<Grob*> const &heads_and_stems,
 */
 static Interval
 position_apes (Grob *me,
-              vector<Accidental_placement_entry*> const &apes,
+              vector<Accidental_placement_entry *> const &apes,
               Skyline const &heads_skyline)
 {
   Real padding = robust_scm2double (me->get_property ("padding"), 0.2);
   Skyline left_skyline = heads_skyline;
   left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0));
-  
+
   /*
     Add accs entries right-to-left.
   */
@@ -391,7 +399,6 @@ position_apes (Grob *me,
   return width;
 }
 
-
 /*
   This routine computes placements of accidentals. During
   add_accidental (), accidentals are already grouped by note, so that
@@ -404,12 +411,11 @@ position_apes (Grob *me,
   TODO: more advanced placement. Typically, the accs should be placed
   to form a C shape, like this
 
-
-  ##
-  b b
-  # #
-  b
-  b b
+  *     ##
+  *  b b
+  * # #
+  *  b
+  *    b b
 
   The naturals should be left of the C as well; they should
   be separate accs.
@@ -442,23 +448,24 @@ Accidental_placement::calc_positioning_done (SCM smob)
     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;
 
-  vector<Accidental_placement_entry*> apes = build_apes (accs);
+  vector<Accidental_placement_entry *> apes = build_apes (accs);
 
   Grob *common[] = {me, 0};
 
-  vector<Grob*> heads_and_stems = extract_heads_and_stems (apes);
+  vector<Grob *> heads_and_stems = extract_heads_and_stems (apes);
 
   common[Y_AXIS] = common_refpoint_of_accidentals (apes, Y_AXIS);
   common[Y_AXIS] = common_refpoint_of_array (heads_and_stems, common[Y_AXIS], Y_AXIS);
   common[X_AXIS] = common_refpoint_of_array (heads_and_stems, me, X_AXIS);
+  Real padding = robust_scm2double (me->get_property ("padding"), 0.2);
 
   for (vsize i = apes.size (); i--;)
-    set_ape_skylines (apes[i], common);
+    set_ape_skylines (apes[i], common, padding);
   Skyline heads_skyline = build_heads_skyline (heads_and_stems, common);
 
   stagger_apes (&apes);
@@ -478,9 +485,8 @@ ADD_INTERFACE (Accidental_placement,
               /* properties */
               "accidental-grobs "
               "direction "
-              "left-padding "
               "padding "
               "positioning-done "
               "right-padding "
               "script-priority "
-              )
+              );