]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/dynamic-engraver.cc
release: 1.3.88
[lilypond.git] / lily / dynamic-engraver.cc
index 739f03f7ebcd57870c948bbb499ca327454fe754..a2da4e1b2b32db16712b4286b72c20f3e1cd8544 100644 (file)
@@ -7,22 +7,15 @@
 */
 #include "debug.hh"
 #include "dimensions.hh"
-#include "dimension-cache.hh"
 #include "crescendo.hh"
 #include "musical-request.hh"
-#include "lookup.hh"
-#include "paper-def.hh"
 #include "paper-column.hh"
-#include "staff-symbol.hh"
 #include "note-column.hh"
 #include "item.hh"
 #include "side-position-interface.hh"
 #include "engraver.hh"
-#include "stem.hh"
-#include "note-head.hh"
 #include "group-interface.hh"
 #include "directional-element-interface.hh"
-#include "staff-symbol-referencer.hh"
 #include "translator-group.hh"
 #include "axis-group-interface.hh"
 
@@ -40,8 +33,8 @@
 class Dynamic_engraver : public Engraver
 {
   Item * text_p_;
-  Crescendo * finished_cresc_p_;
-  Crescendo * cresc_p_;
+  Spanner * finished_cresc_p_;
+  Spanner * cresc_p_;
 
   Text_script_req* text_req_l_;
   
@@ -127,20 +120,22 @@ Dynamic_engraver::do_process_music ()
        {
          line_spanner_ = new Spanner (get_property ("basicDynamicLineSpannerProperties"));
 
-         Side_position_interface (line_spanner_).set_axis (Y_AXIS);
-         Axis_group_interface (line_spanner_).set_interface ();
-         Axis_group_interface (line_spanner_).set_axes (Y_AXIS, Y_AXIS);
-         announce_element (Score_element_info
-                           (line_spanner_,
-                            text_req_l_ ? text_req_l_ : accepted_spanreqs_drul_[START]));
+         Side_position::set_axis (line_spanner_, Y_AXIS);
+         Axis_group_interface::set_interface (line_spanner_);
+         Axis_group_interface::set_axes (line_spanner_, Y_AXIS, Y_AXIS);
+         announce_element (line_spanner_,
+                            text_req_l_ ? text_req_l_ : accepted_spanreqs_drul_[START]);
 
        }
     }
 
   /*
-    TODO: should finish and create new spanner if vertical dyn-direction is changed.
+    finish side position alignment if the (de)cresc ends here, and
+    there are no new dynamics.
+    
    */
-  else if (!accepted_spanreqs_drul_[START] && !text_req_l_)
+  else if (accepted_spanreqs_drul_[STOP]
+          && !accepted_spanreqs_drul_[START] && !text_req_l_)
     {
       finished_line_spanner_ = line_spanner_;
       line_spanner_ = 0;
@@ -167,7 +162,12 @@ Dynamic_engraver::do_process_music ()
        as (de)crecsendo, b.o. line-breaking.
        */
 
+  
 
+  /*
+    maybe we should leave dynamic texts to the text-engraver and
+    simply acknowledge them?
+  */
   if (text_req_l_)
     {
       String loud = text_req_l_->text_str_;
@@ -175,26 +175,29 @@ Dynamic_engraver::do_process_music ()
       text_p_ = new Item (get_property ("basicDynamicTextProperties"));
       text_p_->set_elt_property ("text", ly_str02scm (loud.ch_C ()));
       if (Direction d=text_req_l_->get_direction ())
-       Directional_element_interface (line_spanner_).set (d);
+       Directional_element_interface::set (line_spanner_, d);
 
-      Axis_group_interface (line_spanner_).add_element (text_p_);
+      Axis_group_interface::add_element (line_spanner_, text_p_);
 
-      text_p_->add_offset_callback (Side_position_interface::aligned_on_self,
+      text_p_->add_offset_callback (Side_position::aligned_on_self,
                                    Y_AXIS);
-      announce_element (Score_element_info (text_p_, text_req_l_));
+      announce_element (text_p_, text_req_l_);
     }
 
   if (accepted_spanreqs_drul_[STOP])
     {
       if (!cresc_p_)
        {
-         accepted_spanreqs_drul_[STOP]->warning
+         accepted_spanreqs_drul_[STOP]->origin ()->warning
            (_ ("can't find start of (de)crescendo"));
        }
       else
        {
          assert (!finished_cresc_p_);
-         cresc_p_->set_bound (RIGHT, unsmob_element (get_property ("currentMusicalColumn")));
+         Score_element* cc = unsmob_element (get_property ("currentMusicalColumn"));
+         
+         cresc_p_->set_bound (RIGHT, cc);
+
          finished_cresc_p_ = cresc_p_;
          cresc_p_ = 0;
          current_cresc_req_ = 0;
@@ -205,16 +208,16 @@ Dynamic_engraver::do_process_music ()
     {
       if (current_cresc_req_)
        {
-         accepted_spanreqs_drul_[START]->warning
+         accepted_spanreqs_drul_[START]->origin ()->warning
            (current_cresc_req_->span_dir_ == 1
-            ?
-            _ ("already have a crescendo")
+            ? _ ("already have a crescendo")
             : _ ("already have a decrescendo"));
        }
       else
        {
          current_cresc_req_ = accepted_spanreqs_drul_[START];
-         cresc_p_  = new Crescendo (get_property ("basicCrescendoProperties"));
+         cresc_p_  = new Spanner (get_property ("basicCrescendoProperties"));
+         Crescendo::set_interface (cresc_p_);
          cresc_p_->set_elt_property
            ("grow-direction",
             gh_int2scm ((accepted_spanreqs_drul_[START]->span_type_str_ == "crescendo")
@@ -241,7 +244,8 @@ Dynamic_engraver::do_process_music ()
                                            + "Spanner", SCM_UNDEFINED);
            }
 
-         cresc_p_->set_bound (LEFT, unsmob_element (get_property ("currentMusicalColumn")));
+         Score_element *cc = unsmob_element (get_property ("currentMusicalColumn"));
+         cresc_p_->set_bound (LEFT, cc);
 
 
          /* 
@@ -263,17 +267,17 @@ Dynamic_engraver::do_process_music ()
          if (text_p_)
            {
              index_set_cell (cresc_p_->get_elt_property ("dynamic-drul"),
-                             LEFT, SCM_BOOL_T);
+                             LEFT, text_p_->self_scm ());
              if (finished_cresc_p_)
                index_set_cell (finished_cresc_p_->get_elt_property ("dynamic-drul"),
-                               RIGHT, SCM_BOOL_T);
+                               RIGHT, text_p_->self_scm ());
            }
 
-         Axis_group_interface (line_spanner_).add_element (cresc_p_);
+         Axis_group_interface::add_element (line_spanner_, cresc_p_);
          cresc_p_->set_elt_property ("self-alignment-Y", gh_int2scm (0));
          cresc_p_->add_offset_callback
-           (Side_position_interface::aligned_on_self, Y_AXIS);
-         announce_element (Score_element_info (cresc_p_, accepted_spanreqs_drul_[START]));
+           (Side_position::aligned_on_self, Y_AXIS);
+         announce_element (cresc_p_, accepted_spanreqs_drul_[START]);
        }
     }
 }
@@ -288,18 +292,17 @@ void
 Dynamic_engraver::do_removal_processing ()
 {
   typeset_all ();
-  
-  if (cresc_p_)
-    {
-      typeset_element (cresc_p_ );
-      finished_cresc_p_ = cresc_p_;
-      current_cresc_req_->warning (_ ("unterminated (de)crescendo"));
-    }
   if (line_spanner_)
     {
       finished_line_spanner_ = line_spanner_;
+      typeset_all ();
+    }
+
+  if (cresc_p_)
+    {
+      current_cresc_req_->origin ()->warning (_ ("unterminated (de)crescendo"));
+      cresc_p_->suicide ();
     }
-  typeset_all ();
 }
 
 void
@@ -318,19 +321,8 @@ Dynamic_engraver::typeset_all ()
     }
   if (finished_line_spanner_)
     {
-      Side_position_interface (finished_line_spanner_).add_staff_support ();
-
-      if (!finished_line_spanner_->get_bound (LEFT))
-       {
-         Score_element * cmc
-           = unsmob_element (get_property ("currentMusicalColumn"));
-         finished_line_spanner_->set_bound (LEFT, cmc);
-       }
-      if (!finished_line_spanner_->get_bound (RIGHT))
-       finished_line_spanner_->set_bound (RIGHT,
-                                          finished_line_spanner_->get_bound (LEFT));
-      
-      
+      Side_position::add_staff_support (finished_line_spanner_);
+      extend_spanner_over_elements (finished_line_spanner_);
       typeset_element (finished_line_spanner_);
       finished_line_spanner_ = 0;
     }
@@ -339,12 +331,12 @@ Dynamic_engraver::typeset_all ()
 void
 Dynamic_engraver::acknowledge_element (Score_element_info i)
 {
-  if (Note_column* n = dynamic_cast<Note_column*> (i.elem_l_))
+  if (Note_column::has_interface (i.elem_l_))
     {
       if (line_spanner_)
        {
-         Side_position_interface (line_spanner_).add_support (n);
-         add_bound_item (line_spanner_,n);
+         Side_position::add_support (line_spanner_,i.elem_l_);
+         add_bound_item (line_spanner_,dynamic_cast<Item*>(i.elem_l_));
        }
     }
 }