]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/figured-bass-engraver.cc
FiguredBass: don't extract property twice, but use a variable
[lilypond.git] / lily / figured-bass-engraver.cc
index 32ad86a9eb7592fa42c428ee857f4a6d8399802c..db4d5a3bfd06b89ff33ba195c4623116d0cb6f80 100644 (file)
@@ -1,10 +1,21 @@
 /*
-  figured-bass-engraver.cc -- implement Figured_bass_engraver
+  This file is part of LilyPond, the GNU music typesetter.
 
-  source file of the GNU LilyPond music typesetter
+  Copyright (C) 2005--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
-  (c) 2005--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
+  LilyPond is free software: you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation, either version 3 of the License, or
+  (at your option) any later version.
+
+  LilyPond is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "engraver.hh"
@@ -28,6 +39,10 @@ struct Figure_group
   
   SCM number_;
   SCM alteration_;
+  SCM augmented_;
+  SCM diminished_;
+  SCM augmented_slash_;
+  SCM text_;
   
   Item *figure_item_; 
   Stream_event *current_event_;
@@ -40,18 +55,39 @@ struct Figure_group
     continuation_line_ = 0;
     number_ = SCM_EOL;
     alteration_ = SCM_EOL;
+    augmented_ = SCM_EOL;
+    diminished_ = SCM_EOL;
+    augmented_slash_ = SCM_EOL;
+    text_ = SCM_EOL;
     group_ = 0;
     current_event_ = 0;
   }
+  /* Mark the members of the struct as used for the GUILE Garbage Collection */
+  void gc_mark () const
+  {
+    scm_gc_mark (number_);
+    scm_gc_mark (alteration_);
+    scm_gc_mark (augmented_);
+    scm_gc_mark (diminished_);
+    scm_gc_mark (augmented_slash_);
+    scm_gc_mark (text_);
+  }
+  bool group_is_equal_to (Stream_event *evt) const
+  {
+    return
+      ly_is_equal (number_, evt->get_property ("figure"))
+      && ly_is_equal (alteration_, evt->get_property ("alteration"))
+      && ly_is_equal (augmented_, evt->get_property ("augmented"))
+      && ly_is_equal (diminished_, evt->get_property ("diminished"))
+      && ly_is_equal (augmented_slash_, evt->get_property ("augmented-slash"))
+      && ly_is_equal (text_, evt->get_property ("text"));
+  }
   bool is_continuation () const
   {
     return
       current_event_
       && !force_no_continuation_
-      && ly_is_equal (number_,
-                     current_event_->get_property ("figure"))
-      && ly_is_equal (alteration_,
-                     current_event_->get_property ("alteration"));
+      && group_is_equal_to (current_event_);
   }
 };
 
@@ -89,8 +125,7 @@ Figured_bass_engraver::derived_mark () const
 {
   for (vsize i = 0; i < groups_.size (); i++)
     {
-      scm_gc_mark (groups_[i].number_);
-      scm_gc_mark (groups_[i].alteration_);
+      groups_[i].gc_mark ();
     }
 }
 
@@ -161,11 +196,10 @@ Figured_bass_engraver::listen_bass_figure (Stream_event *ev)
 
   if (to_boolean (get_property ("useBassFigureExtenders")))
     {
-      SCM fig = ev->get_property ("figure");
       for (vsize i = 0; i < groups_.size (); i++)
        {
          if (!groups_[i].current_event_
-             && ly_is_equal (groups_[i].number_, fig))
+             && groups_[i].group_is_equal_to (ev))
            {
              groups_[i].current_event_ = ev;
              groups_[i].force_no_continuation_
@@ -286,7 +320,8 @@ Figured_bass_engraver::add_brackets ()
 void
 Figured_bass_engraver::process_music ()
 {
-  if (alignment_ && !to_boolean (get_property ("useBassFigureExtenders")))
+  bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
+  if (alignment_ && !use_extenders)
     clear_spanners ();
         
   if (rest_event_)
@@ -312,7 +347,6 @@ Figured_bass_engraver::process_music ()
   /*
     Don't need to sync alignments, if we're not using extenders. 
    */
-  bool use_extenders = to_boolean (get_property ("useBassFigureExtenders"));
   if (!use_extenders)
     {
       clear_spanners ();
@@ -348,6 +382,10 @@ Figured_bass_engraver::process_music ()
        {
          groups_[i].number_ = SCM_BOOL_F;
          groups_[i].alteration_ = SCM_BOOL_F;
+         groups_[i].augmented_ = SCM_BOOL_F;
+         groups_[i].diminished_ = SCM_BOOL_F;
+         groups_[i].augmented_slash_ = SCM_BOOL_F;
+         groups_[i].text_ = SCM_BOOL_F;
        }
     }
 
@@ -362,7 +400,8 @@ Figured_bass_engraver::process_music ()
            {
              if (!group.continuation_line_)
                {
-                 Spanner * line = make_spanner ("BassFigureContinuation", SCM_EOL);
+                 Spanner * line
+                   = make_spanner ("BassFigureContinuation", SCM_EOL);
                  Item * item = group.figure_item_;
                  group.continuation_line_ = line;
                  line->set_bound (LEFT, item);
@@ -412,7 +451,8 @@ Figured_bass_engraver::process_music ()
 void
 Figured_bass_engraver::create_grobs () 
 {
-  Grob *muscol = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
+  Grob *muscol
+    = dynamic_cast<Item*> (unsmob_grob (get_property ("currentMusicalColumn")));
   if (!alignment_)
     {
       alignment_ = make_spanner ("BassFigureAlignment", SCM_EOL);
@@ -449,8 +489,12 @@ Figured_bass_engraver::create_grobs ()
          
          group.number_ = fig;
          group.alteration_ = group.current_event_->get_property ("alteration");
+         group.augmented_ = group.current_event_->get_property ("augmented");
+         group.diminished_ = group.current_event_->get_property ("diminished");
+         group.augmented_slash_ = group.current_event_->get_property ("augmented-slash");
+         group.text_ = group.current_event_->get_property ("text");
 
-         SCM text = group.current_event_->get_property ("text");
+         SCM text = group.text_;
          if (!Text_interface::is_markup (text)
              && ly_is_procedure (proc))
            {