From 4a30b1420605775b0119fef7663c4bc6bb89c204 Mon Sep 17 00:00:00 2001 From: Jan Nieuwenhuizen Date: Tue, 27 Feb 2001 17:02:18 +0100 Subject: [PATCH] patch::: 1.3.132.jcn3 1.3.132.jcn3 ============ * Another attempt af fixing accidentals, still no luck. --- CHANGES | 5 ++++ VERSION | 2 +- lily/include/local-key-item.hh | 5 ++-- lily/local-key-engraver.cc | 38 +++++++++++--------------- lily/local-key-item.cc | 49 +++++++++++++++++++++++++++++++++- scm/grob-description.scm | 1 + 6 files changed, 73 insertions(+), 27 deletions(-) diff --git a/CHANGES b/CHANGES index 6e0a021df9..8a8a97caae 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,8 @@ +1.3.132.jcn3 +============ + +* Another attempt af fixing accidentals, still no luck. + 1.3.132.jcn2 ============ diff --git a/VERSION b/VERSION index eafe9e8a39..f3ad2741c8 100644 --- a/VERSION +++ b/VERSION @@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond MAJOR_VERSION=1 MINOR_VERSION=3 PATCH_LEVEL=132 -MY_PATCH_LEVEL=jcn2 +MY_PATCH_LEVEL=jcn3 # use the above to send patches: MY_PATCH_LEVEL is always empty for a # released version. diff --git a/lily/include/local-key-item.hh b/lily/include/local-key-item.hh index e0f781c881..e1372cf175 100644 --- a/lily/include/local-key-item.hh +++ b/lily/include/local-key-item.hh @@ -15,8 +15,9 @@ class Local_key_item { static Molecule parenthesize (Grob*me, Molecule) ; public: - DECLARE_SCHEME_CALLBACK(brew_molecule, (SCM )); - static void add_pitch (Grob*me, Pitch, bool cautionary, bool natural); + DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); + DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM)); + static void add_pitch (Grob*me, Pitch, bool cautionary, bool natural, Grob *tie_break_cautionary); static bool has_interface (Grob*); static void set_interface (Grob*); }; diff --git a/lily/local-key-engraver.cc b/lily/local-key-engraver.cc index e473c5a5ab..7a80d7a6c2 100644 --- a/lily/local-key-engraver.cc +++ b/lily/local-key-engraver.cc @@ -98,40 +98,31 @@ Local_key_engraver::create_grobs () bool different = !gh_equal_p(prev_acc , gh_int2scm(a)); int p = gh_number_p(prev_acc) ? gh_scm2int(prev_acc) : 0; - /* - Find if we're - a. at right end of a tie -> tie_changes := different - b. at right end of broken tie -> tie_broken - - Ugh: we're never case b., even when tie should be broken, - are we maybe called *before* line breaking? - */ - bool tie_broken = false; + Grob *tie_break_cautionary = 0; bool tie_changes = false; for (int i=0; i < tie_l_arr_.size (); i++) if (support_l == Tie::head (tie_l_arr_[i], RIGHT)) { tie_changes = different; - Spanner *sp = dynamic_cast (tie_l_arr_[i]); - if (!Tie::head (tie_l_arr_[i], LEFT) - || (sp && sp->broken_into_l_arr_.size () - && !Tie::head (sp->broken_into_l_arr_[0], LEFT))) - tie_broken = true; +#if 0 + // don't do this, yet. the accidentals can't be + // deleted, yet. + tie_break_cautionary = tie_l_arr_[i]; +#endif break; } - /* - Some comment here. - When do we want ties: + /* When do we want accidentals: - 1. when property force-accidental is set, and not tie_changes - 2. when different and not tie-changes - 3. always after a line break -> why doesn't this work? - */ + 1. when property force-accidental is set, and not + tie_changes + 2. when different and not tie-changes + 3. maybe when at end of a tie: we must later see if + we're after a line break */ if (((to_boolean (note_l->get_mus_property ("force-accidental")) || different) && !tie_changes) - || tie_broken) + || tie_break_cautionary) { if (!key_item_p_) { @@ -151,7 +142,8 @@ Local_key_engraver::create_grobs () Local_key_item::add_pitch (key_item_p_, *unsmob_pitch (note_l->get_mus_property ("pitch")), to_boolean (note_l->get_mus_property ("cautionary")), - extra_natural); + extra_natural, + tie_break_cautionary); Side_position::add_support (key_item_p_,support_l); } diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index e815098eff..e2a9ead6cb 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -13,6 +13,8 @@ #include "musical-request.hh" #include "rhythmic-head.hh" #include "misc.hh" +#include "spanner.hh" +#include "tie.hh" #include "lookup.hh" static SCM @@ -33,7 +35,8 @@ ADD_SCM_INIT_FUNC(lkpitch,init_pitch_funcs); void -Local_key_item::add_pitch (Grob*me, Pitch p, bool cautionary, bool natural) +Local_key_item::add_pitch (Grob*me, Pitch p, bool cautionary, bool natural, + Grob* tie_break_cautionary) { SCM acs = me->get_grob_property ("accidentals"); SCM pitch = p.smobbed_copy (); @@ -42,6 +45,12 @@ Local_key_item::add_pitch (Grob*me, Pitch p, bool cautionary, bool natural) opts = gh_cons (ly_symbol2scm ("cautionary"), opts); if (natural) opts = gh_cons (ly_symbol2scm ("natural"), opts); + if (tie_break_cautionary) + { + /* Ugh, these 'options' can't have a value, faking... */ + opts = gh_cons (tie_break_cautionary->self_scm (), opts); + opts = gh_cons (ly_symbol2scm ("tie-break-cautionary"), opts); + } pitch = gh_cons (pitch, opts); acs = scm_merge_x (acs, gh_cons (pitch, SCM_EOL), pitch_less_proc); @@ -60,6 +69,41 @@ Local_key_item::parenthesize (Grob*me, Molecule m) return m; } +/* + HW says: move to tie.cc + + Ugh: this doesn't work: brew_molecule is called before line-breaking + */ +MAKE_SCHEME_CALLBACK (Local_key_item, after_line_breaking, 1); +SCM +Local_key_item::after_line_breaking (SCM smob) +{ + Grob *me = unsmob_grob (smob); + + SCM accs = me->get_grob_property ("accidentals"); + for (SCM s = accs; + gh_pair_p (s); s = gh_cdr (s)) + { + SCM opts = gh_cdar (s); + + SCM t = scm_memq (ly_symbol2scm ("tie-break-cautionary"), opts); + if (t != SCM_BOOL_F) + { + Grob *tie = unsmob_grob (gh_cadr (t)); + Spanner *sp = dynamic_cast (tie); + if (!sp->broken_into_l_arr_.size ()) + { + /* there should be a better way to delete me */ + scm_set_car_x (s, gh_list (gh_caar (s), + ly_symbol2scm ("deleted"), + SCM_UNDEFINED)); + } + } + } + + return SCM_UNSPECIFIED; +} + /* UGH. clean me, revise placement routine (See Ross & Wanske; accidental placement is more complicated than this. @@ -85,6 +129,9 @@ Local_key_item::brew_molecule (SCM smob) Pitch p (*unsmob_pitch (gh_caar (s))); SCM opts = gh_cdar (s); + if (scm_memq (ly_symbol2scm ("deleted"), opts) != SCM_BOOL_F) + continue; + // do one octave if (p.octave_i () != lastoct) { diff --git a/scm/grob-description.scm b/scm/grob-description.scm index 5c9e37c151..f9bbfab167 100644 --- a/scm/grob-description.scm +++ b/scm/grob-description.scm @@ -251,6 +251,7 @@ (Accidentals . ( (molecule-callback . ,Local_key_item::brew_molecule) (X-offset-callbacks . (,Side_position::aligned_side)) + (after-line-breaking-callback . ,Local_key_item::after_line_breaking) (direction . -1) (left-padding . 0.2) (right-padding . 0.4) -- 2.39.5