]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dynamic-engraver.cc
Issue 5167/6: Changes: show \markup xxx = ... \etc assignments
[lilypond.git] / lily / dynamic-engraver.cc
index cd7db644a66f409ebdc46f3ee151a76f870fc010..686fbc5a6869f4095ccc091c58d748e04a2b8a3d 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2008--2012 Han-Wen Nienhuys <hanwen@lilypond.org>
+  Copyright (C) 2008--2015 Han-Wen Nienhuys <hanwen@lilypond.org>
 
   LilyPond is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
 
 #include "translator.icc"
 
-class New_dynamic_engraver : public Engraver
+class Dynamic_engraver : public Engraver
 {
-  TRANSLATOR_DECLARATIONS (New_dynamic_engraver);
-  DECLARE_ACKNOWLEDGER (note_column);
-  DECLARE_TRANSLATOR_LISTENER (absolute_dynamic);
-  DECLARE_TRANSLATOR_LISTENER (span_dynamic);
-  DECLARE_TRANSLATOR_LISTENER (break_span);
+  TRANSLATOR_DECLARATIONS (Dynamic_engraver);
+  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_;
 };
 
-New_dynamic_engraver::New_dynamic_engraver ()
+Dynamic_engraver::Dynamic_engraver (Context *c)
+  : Engraver (c)
 {
   script_event_ = 0;
   current_span_event_ = 0;
@@ -69,25 +70,22 @@ New_dynamic_engraver::New_dynamic_engraver ()
   end_new_spanner_ = false;
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (New_dynamic_engraver, absolute_dynamic);
 void
-New_dynamic_engraver::listen_absolute_dynamic (Stream_event *ev)
+Dynamic_engraver::listen_absolute_dynamic (Stream_event *ev)
 {
   ASSIGN_EVENT_ONCE (script_event_, ev);
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (New_dynamic_engraver, span_dynamic);
 void
-New_dynamic_engraver::listen_span_dynamic (Stream_event *ev)
+Dynamic_engraver::listen_span_dynamic (Stream_event *ev)
 {
   Direction d = to_dir (ev->get_property ("span-direction"));
 
   ASSIGN_EVENT_ONCE (accepted_spanevents_drul_[d], ev);
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (New_dynamic_engraver, break_span);
 void
-New_dynamic_engraver::listen_break_span (Stream_event *event)
+Dynamic_engraver::listen_break_span (Stream_event *event)
 {
   if (event->in_event_class ("break-dynamic-span-event"))
     {
@@ -102,18 +100,18 @@ New_dynamic_engraver::listen_break_span (Stream_event *event)
 }
 
 SCM
-New_dynamic_engraver::get_property_setting (Stream_event *evt,
-                                            char const *evprop,
-                                            char const *ctxprop)
+Dynamic_engraver::get_property_setting (Stream_event *evt,
+                                        char const *evprop,
+                                        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;
 }
 
 void
-New_dynamic_engraver::process_music ()
+Dynamic_engraver::process_music ()
 {
   if (current_spanner_
       && (accepted_spanevents_drul_[STOP]
@@ -141,7 +139,7 @@ New_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 @@ New_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 @@ New_dynamic_engraver::process_music ()
         }
       if (finished_spanner_)
         {
-          if (Hairpin::has_interface (finished_spanner_))
+          if (has_interface<Hairpin> (finished_spanner_))
             Pointer_group_interface::add_grob (finished_spanner_,
                                                ly_symbol2scm ("adjacent-spanners"),
                                                current_spanner_);
-          if (Hairpin::has_interface (current_spanner_))
+          if (has_interface<Hairpin> (current_spanner_))
             Pointer_group_interface::add_grob (current_spanner_,
                                                ly_symbol2scm ("adjacent-spanners"),
                                                finished_spanner_);
@@ -203,17 +202,17 @@ New_dynamic_engraver::process_music ()
 }
 
 void
-New_dynamic_engraver::stop_translation_timestep ()
+Dynamic_engraver::stop_translation_timestep ()
 {
   if (finished_spanner_ && !finished_spanner_->get_bound (RIGHT))
     finished_spanner_
     ->set_bound (RIGHT,
-                 unsmob_grob (get_property ("currentMusicalColumn")));
+                 unsmob<Grob> (get_property ("currentMusicalColumn")));
 
   if (current_spanner_ && !current_spanner_->get_bound (LEFT))
     current_spanner_
     ->set_bound (LEFT,
-                 unsmob_grob (get_property ("currentMusicalColumn")));
+                 unsmob<Grob> (get_property ("currentMusicalColumn")));
   script_ = 0;
   script_event_ = 0;
   accepted_spanevents_drul_.set (0, 0);
@@ -222,7 +221,7 @@ New_dynamic_engraver::stop_translation_timestep ()
 }
 
 void
-New_dynamic_engraver::finalize ()
+Dynamic_engraver::finalize ()
 {
   if (current_spanner_
       && !current_spanner_->is_live ())
@@ -239,14 +238,14 @@ New_dynamic_engraver::finalize ()
 }
 
 string
-New_dynamic_engraver::get_spanner_type (Stream_event *ev)
+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");
@@ -255,26 +254,20 @@ New_dynamic_engraver::get_spanner_type (Stream_event *ev)
 }
 
 void
-New_dynamic_engraver::acknowledge_note_column (Grob_info info)
+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<Grob> (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,8 +276,16 @@ New_dynamic_engraver::acknowledge_note_column (Grob_info info)
     finished_spanner_->set_bound (RIGHT, info.grob ());
 }
 
-ADD_ACKNOWLEDGER (New_dynamic_engraver, note_column);
-ADD_TRANSLATOR (New_dynamic_engraver,
+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.",