From 5cb09f71fea59c7bdbcb3c1dcb1151bbf19b4d26 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Benk=C5=91=20P=C3=A1l?= Date: Tue, 23 Oct 2012 20:12:56 +0200 Subject: [PATCH] prevent collision of mensural ligature and next grob compute the actual X extent of a mensural ligature and create a rod of that length through the minimum-length property and the set-spacing-rods mechanism --- lily/mensural-ligature-engraver.cc | 34 ++++++++++++++++++++++++------ scm/define-grobs.scm | 1 + 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lily/mensural-ligature-engraver.cc b/lily/mensural-ligature-engraver.cc index 62799ec55c..8f70fa4e48 100644 --- a/lily/mensural-ligature-engraver.cc +++ b/lily/mensural-ligature-engraver.cc @@ -67,8 +67,10 @@ public: private: void transform_heads (vector const &primitives); void propagate_properties (Spanner *ligature, - vector const &primitives); - void fold_up_primitives (vector const &primitives); + vector const &primitives, + Real &min_length); + void fold_up_primitives (vector const &primitives, + Real &min_length); }; IMPLEMENT_TRANSLATOR_LISTENER (Mensural_ligature_engraver, ligature); @@ -338,7 +340,8 @@ Mensural_ligature_engraver::transform_heads (vector const &primitives */ void Mensural_ligature_engraver::propagate_properties (Spanner *ligature, - vector const &primitives) + vector const &primitives, + Real &min_length) { Real thickness = robust_scm2double (ligature->get_property ("thickness"), 1.3); @@ -352,6 +355,7 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, = Font_interface::get_default_font (ligature)-> find_by_name ("noteheads.sM3ligmensural").extent (X_AXIS).length (); + min_length = 0.0; Item *prev_primitive = NULL; for (vsize i = 0; i < primitives.size (); i++) { @@ -364,9 +368,11 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, { case MLP_BREVIS: case MLP_LONGA: + min_length += head_width; primitive->set_property ("head-width", scm_from_double (head_width)); break; case MLP_MAXIMA: + min_length += maxima_head_width; primitive->set_property ("head-width", scm_from_double (maxima_head_width)); break; @@ -379,6 +385,7 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, { SCM flexa_scm = primitive->get_property ("flexa-width"); Real const flexa_width = robust_scm2double (flexa_scm, 2.0); + min_length += flexa_width + thickness; SCM head_width = scm_from_double (0.5 * (flexa_width + thickness)); primitive->set_property ("head-width", head_width); prev_primitive->set_property ("head-width", head_width); @@ -395,7 +402,8 @@ Mensural_ligature_engraver::propagate_properties (Spanner *ligature, } void -Mensural_ligature_engraver::fold_up_primitives (vector const &primitives) +Mensural_ligature_engraver::fold_up_primitives (vector const &primitives, + Real &min_length) { Item *first = 0; Real distance = 0.0; @@ -418,7 +426,7 @@ Mensural_ligature_engraver::fold_up_primitives (vector const &primiti Real head_width = scm_to_double (current->get_property ("head-width")); distance += head_width - thickness; - if (Rhythmic_head::dot_count (current) > 0) + if (size_t const dot_count = Rhythmic_head::dot_count (current)) /* Move dots above/behind the ligature. dots should also avoid staff lines. @@ -454,6 +462,8 @@ Mensural_ligature_engraver::fold_up_primitives (vector const &primiti else if (delta == 1 || delta == -1) vert_shift -= delta * staff_space; } + else + min_length += head_width * dot_count; dot_gr->translate_axis (vert_shift, Y_AXIS); @@ -470,9 +480,19 @@ void Mensural_ligature_engraver::build_ligature (Spanner *ligature, vector const &primitives) { + /* + the X extent of the actual graphics representing the ligature; + less space than that means collision + */ + Real min_length; + transform_heads (primitives); - propagate_properties (ligature, primitives); - fold_up_primitives (primitives); + propagate_properties (ligature, primitives, min_length); + fold_up_primitives (primitives, min_length); + + if (robust_scm2double (ligature->get_property ("minimum-length"), 0.0) + < min_length) + ligature->set_property ("minimum-length", scm_from_double (min_length)); } ADD_ACKNOWLEDGER (Mensural_ligature_engraver, rest); diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 28bc6d04d4..1ebd9c34e8 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -1343,6 +1343,7 @@ (MensuralLigature . ( + (springs-and-rods . ,ly:spanner::set-spacing-rods) (stencil . ,ly:mensural-ligature::print) (thickness . 1.3) (meta . ((class . Spanner) -- 2.39.2