]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/accidental-engraver.cc
* lily/open-type-font.cc (load_scheme_table): new function
[lilypond.git] / lily / accidental-engraver.cc
index 3380a6ee0d2e89e81e48dfe17765e5ce89a6b831..c99d2014505d452213d1a93b93c47136bdd8f0be 100644 (file)
 #include "arpeggio.hh"
 #include "context.hh"
 #include "engraver.hh"
-#include "event.hh"
-#include "item.hh"
 #include "protected-scm.hh"
 #include "rhythmic-head.hh"
 #include "side-position-interface.hh"
-#include "spanner.hh"
 #include "tie.hh"
 #include "warn.hh"
 
-
 class Accidental_entry
 {
 public:
@@ -90,9 +86,9 @@ static void
 set_property_on_children (Context *trans, char const *sym, SCM val)
 {
   trans->set_property (sym, ly_deep_copy (val));
-  for (SCM p = trans->children_contexts (); ly_c_pair_p (p); p = ly_cdr (p))
+  for (SCM p = trans->children_contexts (); scm_is_pair (p); p = scm_cdr (p))
     {
-      Context *trg = unsmob_context (ly_car (p));
+      Context *trg = unsmob_context (scm_car (p));
       set_property_on_children (trg, sym, ly_deep_copy (val));
     }
 }
@@ -145,10 +141,10 @@ static bool
 recent_enough (int bar_number, SCM alteration_def, SCM laziness)
 {
   if (scm_is_number (alteration_def)
-      || laziness== SCM_BOOL_T)
+      || laziness == SCM_BOOL_T)
     return true;
   
-  return (bar_number <= scm_to_int (ly_cdr (alteration_def)) + scm_to_int (laziness));
+  return (bar_number <= scm_to_int (scm_cdr (alteration_def)) + scm_to_int (laziness));
 }
 
 static int
@@ -156,8 +152,8 @@ extract_alteration (SCM alteration_def)
 {
   if (scm_is_number (alteration_def))
     return scm_to_int (alteration_def);
-  else if (ly_c_pair_p (alteration_def))
-    return scm_to_int (ly_car (alteration_def));
+  else if (scm_is_pair (alteration_def))
+    return scm_to_int (scm_car (alteration_def));
   else if (alteration_def == SCM_BOOL_F)
     return 0;
   else
@@ -165,6 +161,13 @@ extract_alteration (SCM alteration_def)
   return 0;
 }
 
+bool
+is_tied (SCM alteration_def)
+{
+  return (alteration_def == SCM_BOOL_T)
+    || (scm_is_pair (alteration_def) && scm_car (alteration_def) == SCM_BOOL_T);
+}
+
 static int
 number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch,
                             int bar_number, SCM laziness, bool ignore_octave)
@@ -179,12 +182,12 @@ number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch,
                                                     scm_int2num (n)), sig, SCM_BOOL_F);
   SCM from_key_signature = ly_assoc_get (scm_int2num (n), sig, SCM_BOOL_F);
   SCM from_other_octaves = SCM_BOOL_F;
-  for (SCM s = sig ; ly_c_pair_p (s); s = ly_cdr (s))
+  for (SCM s = sig ; scm_is_pair (s); s = scm_cdr (s))
     {
-      SCM entry = ly_car (s);
-      if (ly_c_pair_p (ly_car (entry))
-         && ly_cdar (entry) == scm_int2num (n))
-       from_other_octaves = ly_cdr (entry); 
+      SCM entry = scm_car (s);
+      if (scm_is_pair (scm_car (entry))
+         && scm_cdar (entry) == scm_int2num (n))
+       from_other_octaves = scm_cdr (entry); 
     }
   
 
@@ -204,17 +207,23 @@ number_accidentals_from_sig (bool *different, SCM sig, Pitch *pitch,
       previous_alteration = from_key_signature;
     }
   
-  /* UGH. prev_acc can be #t in case of ties. What is this for?  */
-
-  int prev = extract_alteration (previous_alteration);
-  int alter = pitch->get_alteration ();
   int num = 1;
-  if (alter == prev)
-    num = 0;
-  else if ((abs (alter) < abs (prev) || prev*alter < 0) && alter != 0)
-    num = 2;
-
-  *different = (alter != prev);
+  if (is_tied (previous_alteration))
+    {
+      num = 1;
+      *different = true;
+    }
+  else
+    {
+      int prev =  extract_alteration (previous_alteration);
+      int alter = pitch->get_alteration ();
+      
+      if (alter == prev)
+       num = 0;
+      else if ((abs (alter) < abs (prev) || prev*alter < 0) && alter != 0)
+       num = 2;
+      *different = (alter != prev);
+    }
   return num;
 }
 
@@ -226,19 +235,19 @@ number_accidentals (bool *different,
   int number = 0;
 
   *different = false;
-  if (ly_c_pair_p (accidentals) && !scm_is_symbol (ly_car (accidentals)))
+  if (scm_is_pair (accidentals) && !scm_is_symbol (scm_car (accidentals)))
     warning (_f ("Accidental typesetting list must begin with context-name: %s", 
-                ly_scm2string (ly_car (accidentals)).to_str0 ()));
+                ly_scm2string (scm_car (accidentals)).to_str0 ()));
   
-  for (; ly_c_pair_p (accidentals) && origin;
-       accidentals = ly_cdr (accidentals))
+  for (; scm_is_pair (accidentals) && origin;
+       accidentals = scm_cdr (accidentals))
     {
       // If pair then it is a new accidentals typesetting rule to be checked
-      SCM rule = ly_car (accidentals);
-      if (ly_c_pair_p (rule))
+      SCM rule = scm_car (accidentals);
+      if (scm_is_pair (rule))
        {
-         SCM type = ly_car (rule);
-         SCM laziness = ly_cdr (rule);
+         SCM type = scm_car (rule);
+         SCM laziness = scm_cdr (rule);
          SCM localsig = origin->get_property ("localKeySignature");
          
          bool same_octave_b = 
@@ -287,7 +296,7 @@ Accidental_engraver::get_bar_number ()
 
   int bn = robust_scm2int (barnum, 0);
   
-  Moment mp = (unsmob_moment (smp)) ? *unsmob_moment (smp) : Moment (0);
+  Moment mp = robust_scm2moment (smp,  Moment (0));
   if (mp.main_part_ < Rational (0))
     bn--;
   
@@ -355,7 +364,9 @@ Accidental_engraver::process_acknowledged_grobs ()
              Grob *a
                = make_item_from_properties (accidentals_[i].origin_trans_,
                                             ly_symbol2scm ("Accidental"),
-                                            note->self_scm ());
+                                            note->self_scm (),
+                                            "Accidental"
+                                            );
              a->set_parent (support, Y_AXIS);
 
              if (!accidental_placement_)
@@ -517,7 +528,7 @@ Accidental_engraver::process_music ()
     update_local_key_signature ();
 }
 
-ENTER_DESCRIPTION (Accidental_engraver,
+ADD_TRANSLATOR (Accidental_engraver,
                   "Make accidentals.  "
                   "Catch note heads, ties and notices key-change events.  "
                   "This engraver usually lives at Staff level, but "