X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fnew-fingering-engraver.cc;h=9ae9a9998aa9717145d8ea0c3379df1f1f12ee29;hb=ffb2d00dbc64ad3a8702a98e8d7d2e0c31890e9a;hp=6444a06bff056609c20e93652587c85604c86957;hpb=bb8a0a5387af94dd2702877256334b160575a730;p=lilypond.git diff --git a/lily/new-fingering-engraver.cc b/lily/new-fingering-engraver.cc index 6444a06bff..9ae9a9998a 100644 --- a/lily/new-fingering-engraver.cc +++ b/lily/new-fingering-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2011 Han-Wen Nienhuys + Copyright (C) 1998--2012 Han-Wen Nienhuys LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -63,6 +63,7 @@ class New_fingering_engraver : public Engraver vector string_numbers_; vector heads_; + vector accidentals_; Grob *stem_; void position_all (); @@ -71,6 +72,7 @@ public: protected: void stop_translation_timestep (); DECLARE_ACKNOWLEDGER (rhythmic_head); + DECLARE_ACKNOWLEDGER (inline_accidental); DECLARE_ACKNOWLEDGER (stem); void add_fingering (Grob *, SCM, vector *, @@ -80,6 +82,12 @@ protected: void position_scripts (SCM orientations, vector *); }; +void +New_fingering_engraver::acknowledge_inline_accidental (Grob_info inf) +{ + accidentals_.push_back(inf.grob ()); +} + void New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) { @@ -106,9 +114,17 @@ New_fingering_engraver::acknowledge_rhythmic_head (Grob_info inf) else if (ev->in_event_class ("script-event")) add_script (inf.grob (), ev, note_ev); else if (ev->in_event_class ("string-number-event")) - add_fingering (inf.grob (), - ly_symbol2scm ("StringNumber"), &string_numbers_, - ev, note_ev); + { + // String numbers are used in calculating harmonics even + // when we don't want them displayed. So don't make space + // for them if 'stencil is #f + Grob *g = make_item ("StringNumber", ev->self_scm ()); + if (g->get_property ("stencil") != SCM_BOOL_F) + add_fingering (inf.grob (), + ly_symbol2scm ("StringNumber"), &string_numbers_, + ev, note_ev); + g->suicide (); // Kill grob created to check stencil + } else if (ev->in_event_class ("stroke-finger-event")) add_fingering (inf.grob (), ly_symbol2scm ("StrokeFinger"), &stroke_fingerings_, @@ -259,7 +275,7 @@ New_fingering_engraver::position_scripts (SCM orientations, Grob *f = ft.script_; f->set_parent (ft.head_, X_AXIS); f->set_parent (ft.head_, Y_AXIS); - f->set_property ("avoid-slur", SCM_BOOL_F); + f->set_property ("avoid-slur", ly_symbol2scm ("inside")); if (hordir == LEFT && unsmob_grob (ft.head_->get_object ("accidental-grob"))) Side_position_interface::add_support (f, @@ -334,6 +350,10 @@ New_fingering_engraver::position_all () { Grob *script = articulations_[i].script_; + for (vsize j = 0; j < accidentals_.size (); j++) + Side_position_interface::add_support (script, accidentals_[j]); + + accidentals_.resize (0); for (vsize j = heads_.size (); j--;) Side_position_interface::add_support (script, heads_[j]); @@ -352,6 +372,7 @@ New_fingering_engraver::New_fingering_engraver () } ADD_ACKNOWLEDGER (New_fingering_engraver, rhythmic_head); +ADD_ACKNOWLEDGER (New_fingering_engraver, inline_accidental); ADD_ACKNOWLEDGER (New_fingering_engraver, stem); ADD_TRANSLATOR (New_fingering_engraver,