]> git.donarmstrong.com Git - lilypond.git/commitdiff
* lily/vaticana-ligature-engraver.cc: bugfix: insert extra space
authorJürgen Reuter <j@web.de>
Mon, 28 Jul 2003 01:01:56 +0000 (01:01 +0000)
committerJürgen Reuter <j@web.de>
Mon, 28 Jul 2003 01:01:56 +0000 (01:01 +0000)
before flexa

ChangeLog
lily/vaticana-ligature-engraver.cc

index 89bdb8c0a8d23c81cc32b7916bb4d59c5f1a0a71..818b879afbaafe1424fa156d3252794573b045c8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2003-07-28  Juergen Reuter  <reuter@ipd.uka.de>
+
+       * lily/vaticana-ligature-engraver.cc: bugfix: insert extra space
+       before flexa
+
 2003-07-27  Heikki Junes  <hjunes@cc.hut.fi>
 
        * input/test/{ many }: search & fix some typos.
index 3ccc3a861fd768905e24a30cb9b7b904d4384ba4..8343f986c37ec8520420be3104322afbcec042bc 100644 (file)
@@ -91,11 +91,34 @@ Vaticana_ligature_engraver::is_stacked_head (int prefix_set,
       return is_stacked_b;
 }
 
+inline int get_context_info (Item *primitive)
+{
+  SCM context_info_scm = primitive->get_grob_property ("context-info");
+  if (context_info_scm != SCM_EOL)
+    {
+      return gh_scm2int (context_info_scm);
+    }
+  else
+    {
+      primitive->programming_error ("Vaticana_ligature:"
+                                   "context-info undefined -> "
+                                   "ignoring grob");
+      return -1;
+    }
+}
+
 Real
 Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
                                         Real flexa_width,
                                         Real join_thickness)
 {
+  if (!primitives.size ())
+    {
+      programming_error ("Vaticana_ligature: "
+                        "empty ligature [ignored]");
+      return 0.0;
+    }
+
   Item *first_primitive = dynamic_cast<Item*> (primitives[0].grob_);
   Real ligature_width = 0.0;
 
@@ -107,9 +130,38 @@ Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
    */
   Real extra_space = 2.0 * join_thickness;
 
-  for (int i = 0; i < primitives.size(); i++)
+  Item *prev_primitive, *primitive, *next_primitive;
+  int prev_context_info, context_info, next_context_info;
+
+  primitive = 0;
+  context_info = 0;
+
+  next_primitive = first_primitive;
+  if ((next_context_info = get_context_info (next_primitive)) < 0)
+    {
+      return 0.0;
+    }
+
+  for (int i = 0; i < primitives.size (); i++)
     {
-      Item *primitive = dynamic_cast<Item*> (primitives[i].grob_);
+      prev_primitive = primitive;
+      prev_context_info = context_info;
+      context_info = next_context_info;
+      primitive = next_primitive;
+
+      if (i+1 < primitives.size ())
+       {
+         next_primitive = dynamic_cast<Item*> (primitives[i+1].grob_);
+         if ((next_context_info = get_context_info (next_primitive)) < 0)
+           {
+             break;
+           }
+       }
+      else
+       {
+         next_primitive = 0;
+         next_context_info = 0;
+       }
 
       /*
        * Get glyph_name, delta_pitch and context_info for this head.
@@ -121,7 +173,7 @@ Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
          primitive->programming_error ("Vaticana_ligature:"
                                        "undefined glyph-name -> "
                                        "ignoring grob");
-         return 0.0;
+         continue;
        }
       String glyph_name = ly_scm2string (glyph_name_scm);
 
@@ -136,21 +188,7 @@ Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
          primitive->programming_error ("Vaticana_ligature:"
                                        "delta-pitch undefined -> "
                                        "ignoring grob");
-         return 0.0;
-       }
-
-      int context_info;
-      SCM context_info_scm = primitive->get_grob_property ("context-info");
-      if (context_info_scm != SCM_EOL)
-       {
-         context_info = gh_scm2int (context_info_scm);
-       }
-      else
-       {
-         primitive->programming_error ("Vaticana_ligature:"
-                                       "context-info undefined -> "
-                                       "ignoring grob");
-         return 0.0;
+         continue;
        }
 
       /*
@@ -224,7 +262,12 @@ Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
           * shape.
           */
        }
-      else if (context_info & AFTER_VIRGA)
+
+      /* Sometimes, extra space is needed, e.g. to avoid clashing with
+        the appendix of an adjacent notehead or with an adjacent
+        notehead itself if it has the same pitch. */
+
+      if (context_info & AFTER_VIRGA)
        {
          /*
           * After a virga, make a an additional small space such that
@@ -233,6 +276,16 @@ Vaticana_ligature_engraver::align_heads (Array<Grob_info> primitives,
           */
          ligature_width += extra_space;
        }
+      else if ((context_info & FLEXA_LEFT) &&
+              !(prev_context_info & PES_LOWER))
+       {
+         /*
+          * Before a flexa (but not within a torculus), make a an
+          * additional small space such that the appendix on the left
+          * side of the flexa does not touch the this head.
+          */
+         ligature_width += extra_space;
+       }
       else if (delta_pitch == 0)
        {
          /*