X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fchord-name-engraver.cc;h=0057176a9f761c5f6bce9bc17ff419d2a3459c46;hb=95d09add006f3b951eb1448060f15722a0595724;hp=e2281400d01007ac9f14173a51dad0f9c9515b4b;hpb=ea4fdf1afa3e6bb9a7c586f5a533be93ff3312d3;p=lilypond.git diff --git a/lily/chord-name-engraver.cc b/lily/chord-name-engraver.cc index e2281400d0..0057176a9f 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--2011 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 @@ -39,14 +39,12 @@ protected: void stop_translation_timestep (); void process_music (); virtual void finalize (); - virtual void derived_mark () const; DECLARE_TRANSLATOR_LISTENER (note); DECLARE_TRANSLATOR_LISTENER (rest); private: Item *chord_name_; vector notes_; - SCM last_chord_; Stream_event *rest_event_; }; @@ -55,28 +53,30 @@ Chord_name_engraver::finalize () { } -void -Chord_name_engraver::derived_mark () const -{ - scm_gc_mark (last_chord_); -} - Chord_name_engraver::Chord_name_engraver () { chord_name_ = 0; - last_chord_ = SCM_EOL; rest_event_ = 0; } 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 +85,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 +126,25 @@ 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_)) + SCM last_chord = get_property ("lastChord"); + if (to_boolean (chord_changes) && scm_is_pair (last_chord) + && ly_is_equal (markup, last_chord)) chord_name_->set_property ("begin-of-line-visible", SCM_BOOL_T); - last_chord_ = chord_as_scm; + context ()->set_property ("lastChord", markup); } IMPLEMENT_TRANSLATOR_LISTENER (Chord_name_engraver, note); @@ -185,9 +187,10 @@ ADD_TRANSLATOR (Chord_name_engraver, "chordNoteNamer " "chordRootNamer " "chordNameExceptions " + "lastChord " "majorSevenSymbol " "noChordSymbol ", /* write */ - "" + "lastChord " );