X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fchord-name-engraver.cc;h=59efe683541c8b42ef41dc16d5cbb2c1bbae89cc;hb=0b544cfb7332615ef809b71b57ab656741311ae1;hp=eab4d94d075c52ef95f0ae09449d6d9d184585c5;hpb=08560a1b8076630c4fc6cb9b902614d8b74fd6fc;p=lilypond.git diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index eab4d94d07..59efe68354 100644 --- a/lily/chord-name-engraver.cc +++ b/lily/chord-name-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1998--2012 Jan Nieuwenhuizen + Copyright (C) 1998--2014 Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -71,12 +71,21 @@ Chord_name_engraver::Chord_name_engraver () void Chord_name_engraver::process_music () { + if (!rest_event_ && !notes_.size ()) + return; + + chord_name_ = make_item ("ChordName", + rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ()); + + SCM maybe_markup = chord_name_->get_property_data ("text"); + + bool make_markup = !(Text_interface::is_markup (maybe_markup) + || ly_is_procedure (maybe_markup)); + SCM markup; - SCM bass = SCM_EOL; - SCM inversion = SCM_EOL; - SCM pitches = SCM_EOL; - if (rest_event_) + if (rest_event_ && !make_markup) { } + else if (rest_event_) { SCM no_chord_markup = get_property ("noChordSymbol"); if (!Text_interface::is_markup (no_chord_markup)) @@ -85,8 +94,9 @@ Chord_name_engraver::process_music () } else { - if (!notes_.size ()) - return; + SCM bass = SCM_EOL; + SCM inversion = SCM_EOL; + SCM pitches = SCM_EOL; Stream_event *inversion_event = 0; for (vsize i = 0; i < notes_.size (); i++) @@ -125,24 +135,24 @@ Chord_name_engraver::process_music () pitches = scm_sort_list (pitches, Pitch::less_p_proc); SCM name_proc = get_property ("chordNameFunction"); - markup = scm_call_4 (name_proc, pitches, bass, inversion, - context ()->self_scm ()); + if (make_markup) + markup = scm_call_4 (name_proc, pitches, bass, inversion, + context ()->self_scm ()); } /* Ugh. */ - SCM chord_as_scm = scm_cons (pitches, scm_cons (bass, inversion)); - - chord_name_ = make_item ("ChordName", - rest_event_ ? rest_event_->self_scm () : notes_[0]->self_scm ()); - chord_name_->set_property ("text", markup); + if (make_markup) + chord_name_->set_property ("text", markup); + else if (Text_interface::is_markup (maybe_markup)) + markup = maybe_markup; SCM chord_changes = get_property ("chordChanges"); if (to_boolean (chord_changes) && scm_is_pair (last_chord_) - && ly_is_equal (chord_as_scm, last_chord_)) + && ly_is_equal (markup, last_chord_)) chord_name_->set_property ("begin-of-line-visible", SCM_BOOL_T); - last_chord_ = chord_as_scm; + last_chord_ = markup; } IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note);