From: Jürgen Reuter Date: Mon, 28 Jul 2003 01:01:56 +0000 (+0000) Subject: * lily/vaticana-ligature-engraver.cc: bugfix: insert extra space X-Git-Tag: release/1.7.30~54 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=a99825fd312fc1cd48316accff7f8499ff425f87;p=lilypond.git * lily/vaticana-ligature-engraver.cc: bugfix: insert extra space before flexa --- diff --git a/ChangeLog b/ChangeLog index 89bdb8c0a8..818b879afb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2003-07-28 Juergen Reuter + + * lily/vaticana-ligature-engraver.cc: bugfix: insert extra space + before flexa + 2003-07-27 Heikki Junes * input/test/{ many }: search & fix some typos. diff --git a/lily/vaticana-ligature-engraver.cc b/lily/vaticana-ligature-engraver.cc index 3ccc3a861f..8343f986c3 100644 --- a/lily/vaticana-ligature-engraver.cc +++ b/lily/vaticana-ligature-engraver.cc @@ -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 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 (primitives[0].grob_); Real ligature_width = 0.0; @@ -107,9 +130,38 @@ Vaticana_ligature_engraver::align_heads (Array 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 (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 (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 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 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 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 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) { /*