]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
lilypond-manuals.css: edit color scheme and some spacing
[lilypond.git] / lily / figured-bass-engraver.cc
index 711537ec413967e2db56c2ea4cb87d36877991b3..b2a79262bb64727f7b4421dfb54981032f01e278 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 2005--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
 
   LilyPond is free software: you can redistribute it and/or modify
@@ -110,7 +110,7 @@ struct Figured_bass_engraver : public Engraver
   void add_brackets ();
   void create_grobs ();
 
-  void center_continuations (vector<Spanner*> const &consecutive_lines);
+  void center_continuations (vector<Spanner *> const &consecutive_lines);
   void center_repeated_continuations ();
 protected:
   vector<Figure_group> groups_;
@@ -122,8 +122,8 @@ protected:
   Moment stop_moment_;
   bool have_rest_;
 
-  DECLARE_TRANSLATOR_LISTENER (rest);
-  DECLARE_TRANSLATOR_LISTENER (bass_figure);
+  void listen_rest (Stream_event *);
+  void listen_bass_figure (Stream_event *);
 
   virtual void derived_mark () const;
 
@@ -132,7 +132,8 @@ protected:
   void process_music ();
 };
 
-Figured_bass_engraver::Figured_bass_engraver ()
+Figured_bass_engraver::Figured_bass_engraver (Context *c)
+  : Engraver (c)
 {
   alignment_ = 0;
   continuation_ = false;
@@ -154,7 +155,7 @@ Figured_bass_engraver::start_translation_timestep ()
 {
   if (now_mom ().main_part_ < stop_moment_.main_part_
       || now_mom ().grace_part_ < Rational (0))
-    return ;
+    return;
 
   have_rest_ = 0;
   new_events_.clear ();
@@ -170,29 +171,27 @@ Figured_bass_engraver::stop_translation_timestep ()
   if (groups_.empty ()
       || now_mom ().main_part_ < stop_moment_.main_part_
       || now_mom ().grace_part_ < Rational (0))
-    return ;
+    return;
 
   bool found = false;
   for (vsize i = 0; !found && i < groups_.size (); i++)
-    found  = found  || groups_[i].current_event_;
+    found = found || groups_[i].current_event_;
 
   if (!found)
     clear_spanners ();
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, rest);
 void
 Figured_bass_engraver::listen_rest (Stream_event *)
 {
   have_rest_ = true;
 }
 
-IMPLEMENT_TRANSLATOR_LISTENER (Figured_bass_engraver, bass_figure);
 void
 Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
 {
   new_event_found_ = true;
-  Moment stop  = now_mom () + get_event_length (ev, now_mom ());
+  Moment stop = now_mom () + get_event_length (ev, now_mom ());
   stop_moment_ = max (stop_moment_, stop);
 
   // Handle no-continuation here, don't even add it to the already existing
@@ -215,27 +214,24 @@ Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
 }
 
 void
-Figured_bass_engraver::center_continuations (vector<Spanner*> const &consecutive_lines)
+Figured_bass_engraver::center_continuations (vector<Spanner *> const &consecutive_lines)
 {
-  if (consecutive_lines.size () == 2)
-    {
-      vector<Grob*> left_figs;
-      for (vsize j = consecutive_lines.size (); j--;)
-        left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
+  vector<Grob *> left_figs;
+  for (vsize j = consecutive_lines.size (); j--;)
+    left_figs.push_back (consecutive_lines[j]->get_bound (LEFT));
 
-      SCM  ga = Grob_array::make_array ();
-      unsmob_grob_array (ga)->set_array (left_figs);
+  SCM ga = Grob_array::make_array ();
+  unsmob<Grob_array> (ga)->set_array (left_figs);
 
-      for (vsize j = consecutive_lines.size (); j--;)
-        consecutive_lines[j]->set_object ("figures",
-                                          unsmob_grob_array (ga)->smobbed_copy ());
-    }
+  for (vsize j = consecutive_lines.size (); j--;)
+    consecutive_lines[j]->set_object ("figures",
+                                      unsmob<Grob_array> (ga)->smobbed_copy ());
 }
 
 void
 Figured_bass_engraver::center_repeated_continuations ()
 {
-  vector<Spanner*> consecutive_lines;
+  vector<Spanner *> consecutive_lines;
   for (vsize i = 0; i <= groups_.size (); i++)
     {
       if (i < groups_.size ()
@@ -270,13 +266,13 @@ Figured_bass_engraver::clear_spanners ()
     {
       if (groups_[i].group_)
         {
-          announce_end_grob (groups_[i].group_ , SCM_EOL);
+          announce_end_grob (groups_[i].group_, SCM_EOL);
           groups_[i].group_ = 0;
         }
 
       if (groups_[i].continuation_line_)
         {
-          announce_end_grob (groups_[i].continuation_line_ , SCM_EOL);
+          announce_end_grob (groups_[i].continuation_line_, SCM_EOL);
           groups_[i].continuation_line_ = 0;
         }
     }
@@ -293,8 +289,8 @@ Figured_bass_engraver::process_music ()
 
   // If we have a rest, or we have no new or continued events, clear all spanners
   bool ignore_rest = to_boolean (get_property ("ignoreFiguredBassRest"));
-  if ((ignore_rest && have_rest_) ||
-      (!continuation_ && new_events_.empty ()))
+  if ((ignore_rest && have_rest_)
+      || (!continuation_ && new_events_.empty ()))
     {
       clear_spanners ();
       groups_.clear ();
@@ -358,9 +354,9 @@ Figured_bass_engraver::process_music ()
             {
               if (!group.continuation_line_)
                 {
-                  Spanner * line
+                  Spanner *line
                     = make_spanner ("BassFigureContinuation", SCM_EOL);
-                  Item * item = group.figure_item_;
+                  Item *item = group.figure_item_;
                   group.continuation_line_ = line;
                   line->set_bound (LEFT, item);
 
@@ -381,13 +377,13 @@ Figured_bass_engraver::process_music ()
       /*
         Ugh, repeated code.
        */
-      vector<Spanner*> consecutive;
+      vector<Spanner *> consecutive;
       if (to_boolean (get_property ("figuredBassCenterContinuations")))
         {
           for (vsize i = 0; i <= junk_continuations.size (); i++)
             {
               if (i < junk_continuations.size ()
-                  && (i == 0 || junk_continuations[i-1] == junk_continuations[i] - 1))
+                  && (i == 0 || junk_continuations[i - 1] == junk_continuations[i] - 1))
                 consecutive.push_back (groups_[junk_continuations[i]].continuation_line_);
               else
                 {
@@ -410,7 +406,7 @@ void
 Figured_bass_engraver::create_grobs ()
 {
   Grob *muscol
-    = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+    = unsmob<Item> (get_property ("currentMusicalColumn"));
   if (!alignment_)
     {
       alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
@@ -436,7 +432,7 @@ Figured_bass_engraver::create_grobs ()
               Align_interface::add_element (alignment_, group.group_);
             }
 
-          if (scm_memq (group.number_, get_property ("implicitBassFigures")) != SCM_BOOL_F)
+          if (scm_is_true (scm_memq (group.number_, get_property ("implicitBassFigures"))))
             {
               item->set_property ("transparent", SCM_BOOL_T);
               item->set_property ("implicit", SCM_BOOL_T);
@@ -478,9 +474,9 @@ Figured_bass_engraver::create_grobs ()
 void
 Figured_bass_engraver::add_brackets ()
 {
-  vector<Grob*> encompass;
+  vector<Grob *> encompass;
   bool inside = false;
-  for (vsize i = 0; i < groups_.size (); i ++)
+  for (vsize i = 0; i < groups_.size (); i++)
     {
       if (!groups_[i].current_event_)
         continue;
@@ -491,11 +487,11 @@ Figured_bass_engraver::add_brackets ()
       if (inside && groups_[i].figure_item_)
         encompass.push_back (groups_[i].figure_item_);
 
-       if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop")))
+      if (to_boolean (groups_[i].current_event_->get_property ("bracket-stop")))
         {
           inside = false;
 
-          Item * brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ());
+          Item *brack = make_item ("BassFigureBracket", groups_[i].current_event_->self_scm ());
           for (vsize j = 0; j < encompass.size (); j++)
             {
               Pointer_group_interface::add_grob (brack,
@@ -507,6 +503,13 @@ Figured_bass_engraver::add_brackets ()
     }
 }
 
+void
+Figured_bass_engraver::boot ()
+{
+  ADD_LISTENER (Figured_bass_engraver, rest);
+  ADD_LISTENER (Figured_bass_engraver, bass_figure);
+}
+
 ADD_TRANSLATOR (Figured_bass_engraver,
                 /* doc */
                 "Make figured bass numbers.",
@@ -528,4 +531,4 @@ ADD_TRANSLATOR (Figured_bass_engraver,
 
                 /* write */
                 ""
-                );
+               );