From 1d3e2b0d973503e7ff7a18717e059ff826d30f1b Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 31 Jan 2007 18:55:54 +0100 Subject: [PATCH] Fix #259. Change attach dir for left bound if we start on a text dynamic. --- .../dynamics-text-spanner-abs-dynamic.ly | 16 +++++++++ lily/dynamic-engraver.cc | 10 ++++++ lily/grob-property.cc | 35 +++++++++++++++++++ lily/include/grob.hh | 3 ++ 4 files changed, 64 insertions(+) create mode 100644 input/regression/dynamics-text-spanner-abs-dynamic.ly diff --git a/input/regression/dynamics-text-spanner-abs-dynamic.ly b/input/regression/dynamics-text-spanner-abs-dynamic.ly new file mode 100644 index 0000000000..199320eb40 --- /dev/null +++ b/input/regression/dynamics-text-spanner-abs-dynamic.ly @@ -0,0 +1,16 @@ +\header +{ + + texidoc = "left attach dir for text crescendi starting on an + absolute dynamic is changed, so cresc. and the absolute dynamic + don't overstrike." + +} + +\version "2.11.14" +\paper { ragged-right = ##t } + +\relative c' { + \setTextCresc + c4\p\< c c c\! +} diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index caef2ce4c4..7a5b576278 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -259,6 +259,16 @@ Dynamic_engraver::process_music () context ()->set_property ((start_type + "Text").c_str (), SCM_EOL); } + + if (script_) + { + set_nested_property (cresc_, + scm_list_3 (ly_symbol2scm ("attach-dir"), + ly_symbol2scm ("left"), + ly_symbol2scm ("bound-details") + ), + scm_from_int (RIGHT)); + } } if (script_) diff --git a/lily/grob-property.cc b/lily/grob-property.cc index 702206186f..7bf13062a5 100644 --- a/lily/grob-property.cc +++ b/lily/grob-property.cc @@ -280,3 +280,38 @@ call_pure_function (SCM unpure, SCM args, int start, int end) return scm_apply_0 (scm_call_pure_function, scm_list_4 (unpure, args, scm_from_int (start), scm_from_int (end))); } + + +/* + PROP_PATH should be big-to-small ordering + */ +SCM +nested_property_alist (SCM alist, SCM prop_path, SCM value) +{ + SCM new_value = SCM_BOOL_F; + if (scm_is_pair (scm_cdr (prop_path))) + { + SCM sub_alist = ly_assoc_get (scm_car (prop_path), alist, SCM_EOL); + new_value = nested_property_alist (sub_alist, scm_cdr (prop_path), value); + } + else + { + new_value = value; + } + + return scm_acons (scm_car (prop_path), new_value, alist); +} + + +void +set_nested_property (Grob *me, SCM property_path, SCM value) +{ + SCM big_to_small = scm_reverse (property_path); + SCM alist = me->get_property (scm_car (big_to_small)); + + alist = nested_property_alist (alist, scm_cdr (big_to_small), value); + + me->set_property (scm_car (big_to_small), + alist); +} + diff --git a/lily/include/grob.hh b/lily/include/grob.hh index 3b5f19d97e..d134068568 100644 --- a/lily/include/grob.hh +++ b/lily/include/grob.hh @@ -150,4 +150,7 @@ SCM axis_parent_positioning (Axis a); SCM call_pure_function (SCM unpure, SCM args, int start, int end); +void set_nested_property (Grob *, SCM property_path, SCM value); + + #endif /* GROB_HH */ -- 2.39.2