X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fdynamic-engraver.cc;h=686fbc5a6869f4095ccc091c58d748e04a2b8a3d;hb=90e4d7057f3857da049dfda3d130017d4719bd6b;hp=a4d4e06f5a68fb6d7ceea97e708d3b0950c1ae48;hpb=addcfcc1af97d4aaec0313d92c34316fb952d51f;p=lilypond.git diff --git a/lily/dynamic-engraver.cc b/lily/dynamic-engraver.cc index a4d4e06f5a..686fbc5a68 100644 --- a/lily/dynamic-engraver.cc +++ b/lily/dynamic-engraver.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 2008--2012 Han-Wen Nienhuys + Copyright (C) 2008--2015 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 @@ -33,10 +33,10 @@ class Dynamic_engraver : public Engraver { TRANSLATOR_DECLARATIONS (Dynamic_engraver); - DECLARE_ACKNOWLEDGER (note_column); - DECLARE_TRANSLATOR_LISTENER (absolute_dynamic); - DECLARE_TRANSLATOR_LISTENER (span_dynamic); - DECLARE_TRANSLATOR_LISTENER (break_span); + void acknowledge_note_column (Grob_info); + void listen_absolute_dynamic (Stream_event *); + void listen_span_dynamic (Stream_event *); + void listen_break_span (Stream_event *); protected: virtual void process_music (); @@ -58,7 +58,8 @@ private: bool end_new_spanner_; }; -Dynamic_engraver::Dynamic_engraver () +Dynamic_engraver::Dynamic_engraver (Context *c) + : Engraver (c) { script_event_ = 0; current_span_event_ = 0; @@ -69,14 +70,12 @@ Dynamic_engraver::Dynamic_engraver () end_new_spanner_ = false; } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, absolute_dynamic); void Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev) { ASSIGN_EVENT_ONCE (script_event_, ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, span_dynamic); void Dynamic_engraver::listen_span_dynamic (Stream_event *ev) { @@ -85,7 +84,6 @@ Dynamic_engraver::listen_span_dynamic (Stream_event *ev) ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[d], ev); } -IMPLEMENT_TRANSLATOR_LISTENER (Dynamic_engraver, break_span); void Dynamic_engraver::listen_break_span (Stream_event *event) { @@ -107,7 +105,7 @@ Dynamic_engraver::get_property_setting (Stream_event *evt, char const *ctxprop) { SCM spanner_type = evt->get_property (evprop); - if (spanner_type == SCM_EOL) + if (scm_is_null (spanner_type)) spanner_type = get_property (ctxprop); return spanner_type; } @@ -141,7 +139,7 @@ Dynamic_engraver::process_music () SCM cresc_type = get_property_setting (current_span_event_, "span-type", (start_type + "Spanner").c_str ()); - if (cresc_type == ly_symbol2scm ("text")) + if (scm_is_eq (cresc_type, ly_symbol2scm ("text"))) { current_spanner_ = make_spanner ("DynamicTextSpanner", @@ -156,12 +154,13 @@ Dynamic_engraver::process_music () early: this allows dynamics to be spaced individually instead of being linked together. */ - if (current_spanner_->get_property ("style") == ly_symbol2scm ("none")) + if (scm_is_eq (current_spanner_->get_property ("style"), + ly_symbol2scm ("none"))) current_spanner_->set_property ("spanner-broken", SCM_BOOL_T); } else { - if (cresc_type != ly_symbol2scm ("hairpin")) + if (!scm_is_eq (cresc_type, ly_symbol2scm ("hairpin"))) { string as_string = ly_scm_write_string (cresc_type); current_span_event_ @@ -178,11 +177,11 @@ Dynamic_engraver::process_music () } if (finished_spanner_) { - if (Hairpin::has_interface (finished_spanner_)) + if (has_interface (finished_spanner_)) Pointer_group_interface::add_grob (finished_spanner_, ly_symbol2scm ("adjacent-spanners"), current_spanner_); - if (Hairpin::has_interface (current_spanner_)) + if (has_interface (current_spanner_)) Pointer_group_interface::add_grob (current_spanner_, ly_symbol2scm ("adjacent-spanners"), finished_spanner_); @@ -208,12 +207,12 @@ Dynamic_engraver::stop_translation_timestep () if (finished_spanner_ && !finished_spanner_->get_bound (RIGHT)) finished_spanner_ ->set_bound (RIGHT, - unsmob_grob (get_property ("currentMusicalColumn"))); + unsmob (get_property ("currentMusicalColumn"))); if (current_spanner_ && !current_spanner_->get_bound (LEFT)) current_spanner_ ->set_bound (LEFT, - unsmob_grob (get_property ("currentMusicalColumn"))); + unsmob (get_property ("currentMusicalColumn"))); script_ = 0; script_event_ = 0; accepted_spanevents_drul_.set (0, 0); @@ -244,9 +243,9 @@ Dynamic_engraver::get_spanner_type (Stream_event *ev) string type; SCM start_sym = scm_car (ev->get_property ("class")); - if (start_sym == ly_symbol2scm ("decrescendo-event")) + if (scm_is_eq (start_sym, ly_symbol2scm ("decrescendo-event"))) type = "decrescendo"; - else if (start_sym == ly_symbol2scm ("crescendo-event")) + else if (scm_is_eq (start_sym, ly_symbol2scm ("crescendo-event"))) type = "crescendo"; else programming_error ("unknown dynamic spanner type"); @@ -260,21 +259,15 @@ Dynamic_engraver::acknowledge_note_column (Grob_info info) if (script_ && !script_->get_parent (X_AXIS)) { extract_grob_set (info.grob (), "note-heads", heads); - Grob *stem = unsmob_grob (info.grob ()->get_object ("stem")); /* - Spacing constraints may require dynamics to be aligned on rests, + Spacing constraints may require dynamics to be attached to rests, so check for a rest if this note column has no note heads. */ Grob *x_parent = (heads.size () - ? heads[0] - : unsmob_grob (info.grob ()->get_object ("rest"))); + ? info.grob () + : unsmob (info.grob ()->get_object ("rest"))); if (x_parent) - { - script_->set_parent (x_parent, X_AXIS); - Self_alignment_interface::set_center_parent (script_, X_AXIS); - } - if (stem) - Pointer_group_interface::add_grob (script_, ly_symbol2scm ("potential-X-colliding-grobs"), stem); + script_->set_parent (x_parent, X_AXIS); } if (current_spanner_ && !current_spanner_->get_bound (LEFT)) @@ -283,7 +276,15 @@ Dynamic_engraver::acknowledge_note_column (Grob_info info) finished_spanner_->set_bound (RIGHT, info.grob ()); } -ADD_ACKNOWLEDGER (Dynamic_engraver, note_column); +void +Dynamic_engraver::boot () +{ + ADD_LISTENER (Dynamic_engraver, absolute_dynamic); + ADD_LISTENER (Dynamic_engraver, span_dynamic); + ADD_LISTENER (Dynamic_engraver, break_span); + ADD_ACKNOWLEDGER (Dynamic_engraver, note_column); +} + ADD_TRANSLATOR (Dynamic_engraver, /* doc */ "Create hairpins, dynamic texts and dynamic text spanners.",