]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/gregorian-ligature-engraver.cc
* configure.in: Test for and accept lmodern if EC fonts not found.
[lilypond.git] / lily / gregorian-ligature-engraver.cc
index 7b79ac258ff373cd2c397e98ccc01aaaeea1604c..7b623cc2efbed02f5db434b9635274032649b64a 100644 (file)
@@ -3,12 +3,12 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c)  2003 Juergen Reuter <reuter@ipd.uka.de>
+  (c) 2003 Juergen Reuter <reuter@ipd.uka.de>
  */
 
 #include "gregorian-ligature-engraver.hh"
+
 #include "gregorian-ligature.hh"
-#include "item.hh"
 #include "warn.hh"
 #include "staff-symbol-referencer.hh"
 #include "spanner.hh"
@@ -85,24 +85,24 @@ void fix_prefix_set (int *current_set, int min_set, int max_set, Grob *primitive
 void check_and_fix_all_prefixes (Array<Grob_info> primitives)
 {
   /* Check for illegal head modifier combinations */
-  for (int i = 0; i < primitives.size(); i++)
+  for (int i = 0; i < primitives.size (); i++)
     {
     Grob *primitive = primitives[i].grob_;
 
     /* compute head prefix set by inspecting primitive grob properties */
     int prefix_set =
-      (VIRGA * to_boolean (primitive->get_grob_property ("virga"))) |
-      (STROPHA * to_boolean (primitive->get_grob_property ("stropha"))) |
-      (INCLINATUM * to_boolean (primitive->get_grob_property ("inclinatum"))) |
-      (AUCTUM * to_boolean (primitive->get_grob_property ("auctum"))) |
-      (DESCENDENS * to_boolean (primitive->get_grob_property ("descendens"))) |
-      (ASCENDENS * to_boolean (primitive->get_grob_property ("ascendens"))) |
-      (ORISCUS * to_boolean (primitive->get_grob_property ("oriscus"))) |
-      (QUILISMA * to_boolean (primitive->get_grob_property ("quilisma"))) |
-      (DEMINUTUM * to_boolean (primitive->get_grob_property ("deminutum"))) |
-      (CAVUM * to_boolean (primitive->get_grob_property ("cavum"))) |
-      (LINEA * to_boolean (primitive->get_grob_property ("linea"))) |
-      (PES_OR_FLEXA * to_boolean (primitive->get_grob_property ("pes-or-flexa")));
+      (VIRGA * to_boolean (primitive->get_property ("virga"))) |
+      (STROPHA * to_boolean (primitive->get_property ("stropha"))) |
+      (INCLINATUM * to_boolean (primitive->get_property ("inclinatum"))) |
+      (AUCTUM * to_boolean (primitive->get_property ("auctum"))) |
+      (DESCENDENS * to_boolean (primitive->get_property ("descendens"))) |
+      (ASCENDENS * to_boolean (primitive->get_property ("ascendens"))) |
+      (ORISCUS * to_boolean (primitive->get_property ("oriscus"))) |
+      (QUILISMA * to_boolean (primitive->get_property ("quilisma"))) |
+      (DEMINUTUM * to_boolean (primitive->get_property ("deminutum"))) |
+      (CAVUM * to_boolean (primitive->get_property ("cavum"))) |
+      (LINEA * to_boolean (primitive->get_property ("linea"))) |
+      (PES_OR_FLEXA * to_boolean (primitive->get_property ("pes-or-flexa")));
 
     /* check: ascendens and descendens exclude each other; same with
        auctum and deminutum */
@@ -186,7 +186,7 @@ void check_and_fix_all_prefixes (Array<Grob_info> primitives)
     /* all other combinations should be valid (unless I made a
        mistake) */
 
-    primitive->set_grob_property ("prefix-set", gh_int2scm (prefix_set));
+    primitive->set_property ("prefix-set", scm_int2num (prefix_set));
   }
 }
 
@@ -200,15 +200,20 @@ provide_context_info (Array<Grob_info> primitives)
   int prev_prefix_set = 0;
   int prev_context_info = 0;
   int prev_pitch = 0;
-  for (int i = 0; i < primitives.size(); i++) {
+  for (int i = 0; i < primitives.size (); i++) {
     Grob *primitive = primitives[i].grob_;
     Music *music_cause = primitives[i].music_cause ();
     int context_info = 0;
-    int pitch = unsmob_pitch (music_cause->get_mus_property ("pitch"))->steps ();
-    int prefix_set = gh_scm2int (primitive->get_grob_property ("prefix-set"));
+    int pitch = unsmob_pitch (music_cause->get_property ("pitch"))->steps ();
+    int prefix_set = scm_to_int (primitive->get_property ("prefix-set"));
 
     if (prefix_set & PES_OR_FLEXA)
-      if (pitch > prev_pitch) // pes
+      if (!i) // ligature may not start with 2nd head of pes or flexa
+         {
+           primitive->warning ("may not apply `\\~' on first head of "
+                               "ligature; ignoring `\\~'");
+         }
+      else if (pitch > prev_pitch) // pes
        {
          prev_context_info |= PES_LOWER;
          context_info |= PES_UPPER;
@@ -223,26 +228,22 @@ provide_context_info (Array<Grob_info> primitives)
          primitive->warning ("may not apply `\\~' on heads with "
                              "identical pitch; ignoring `\\~'");
        }
-    if (prev_prefix_set & VIRGA)
-      {
-       context_info |= AFTER_VIRGA;
-      }
     if (prev_prefix_set & DEMINUTUM)
       {
        context_info |= AFTER_DEMINUTUM;
       }
 
     if (prev_primitive)
-      prev_primitive->set_grob_property ("context-info",
-                                        gh_int2scm (prev_context_info));
+      prev_primitive->set_property ("context-info",
+                                        scm_int2num (prev_context_info));
     prev_primitive = primitive;
     prev_prefix_set = prefix_set;
     prev_context_info = context_info;
     prev_pitch = pitch;
   }
   if (prev_primitive)
-    prev_primitive->set_grob_property ("context-info",
-                                      gh_int2scm (prev_context_info));
+    prev_primitive->set_property ("context-info",
+                                      scm_int2num (prev_context_info));
 }
 
 void
@@ -267,16 +268,16 @@ Gregorian_ligature_engraver::build_ligature (Spanner *ligature,
 }
 
 void
-Gregorian_ligature_engraver::start_translation_timestep ()
+Gregorian_ligature_engraver::stop_translation_timestep ()
 {
-  Ligature_engraver::start_translation_timestep ();
+  Ligature_engraver::stop_translation_timestep ();
   pes_or_flexa_req_ = 0;
 }
 
 ENTER_DESCRIPTION (Gregorian_ligature_engraver,
 /* descr */       "This is an abstract class.  Subclasses such as Vaticana_ligature_engraver handle ligatures by glueing special ligature heads together.",
 /* creats*/       "",
-/* accepts */     "ligature-event abort-event",
+/* accepts */     "ligature-event",
 /* acks  */      "note-head-interface rest-interface",
 /* reads */       "",
 /* write */       "");