]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/score-engraver.cc
patch::: 1.3.9.hwn2
[lilypond.git] / lily / score-engraver.cc
index 815e7366755f1dfc35180f33bc46299d5e2acde9..83d2c47eef16eb8394e4125533a8f62133e3ef86 100644 (file)
@@ -6,6 +6,7 @@
   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
+#include "dimension-cache.hh"
 #include "super-element.hh"
 #include "line-of-score.hh"
 #include "debug.hh"
@@ -19,7 +20,6 @@
 
 Score_engraver::Score_engraver()
 {
-  break_penalty_i_ = 0;
   scoreline_l_ =0;
   command_column_l_ =0;
   musical_column_l_ =0;
@@ -32,8 +32,8 @@ Score_engraver::prepare (Moment w)
 {
   Global_translator::prepare (w);
   set_columns (new Score_column (w),  new Score_column (w));
-  
-  break_penalty_i_ = 0;
+
+  command_column_l_->set_elt_property ("breakable", SCM_BOOL_T);
   post_move_processing();
 }
 
@@ -54,8 +54,10 @@ void
 Score_engraver::do_creation_processing ()
 {
   scoreline_l_ = pscore_p_->line_l_;
-  scoreline_l_->set_bounds(LEFT,command_column_l_);
-  command_column_l_->set_elt_property (breakable_scm_sym, SCM_BOOL_T);
+
+  scoreline_l_->set_bounds(LEFT, command_column_l_);
+  
+  command_column_l_->set_elt_property ("breakable", SCM_BOOL_T);
 
   Engraver_group_engraver::do_creation_processing();
 }
@@ -66,7 +68,7 @@ Score_engraver::do_removal_processing()
 {
   Engraver_group_engraver::do_removal_processing();
   scoreline_l_->set_bounds(RIGHT,command_column_l_);
-  command_column_l_->set_elt_property (breakable_scm_sym, SCM_BOOL_T);
+  command_column_l_->set_elt_property ("breakable", SCM_BOOL_T);
 
   typeset_all ();
   set_columns (0,0);
@@ -86,11 +88,7 @@ Score_engraver::announce_element (Score_element_info info)
 {
   announce_info_arr_.push (info);
   info.origin_trans_l_arr_.push (this);
-
-  if (Spanner *s = dynamic_cast <Spanner *> (info.elem_l_))
-    pscore_p_->typeset_unbroken_spanner (s);
-  else if (Item *i = dynamic_cast<Item*> (info.elem_l_))
-    pscore_p_->typeset_element (i);
+  pscore_p_->typeset_element (info.elem_l_);
 }
 
 /* All elements are propagated to the top upon announcement. If
@@ -124,15 +122,6 @@ Score_engraver::typeset_all()
       Score_element * elem_p = elem_p_arr_[i];
       elem_p->add_processing ();
 
-#if 0                          // TODO!
-      /*
-       elem_p wants to be connected to the rest of the
-       dependency graph.
-       */
-      
-      if (elem_p->get_elt_property (dangling_scm_sym) != SCM_BOOL_F)
-       scoreline_l_->add_dependency (elem_p);
-#endif
       
       if (Spanner *s = dynamic_cast <Spanner *> (elem_p))
        {
@@ -145,7 +134,7 @@ Score_engraver::typeset_all()
            if (!s->spanned_drul_[d])
              {
                s->set_bounds(d, command_column_l_);
-               ::warning (_f ("Unbound spanner `%s\'", classname(s)));
+               ::warning (_f ("unbound spanner `%s'", classname(s)));
              }
          } while (flip(&d) != LEFT);
        }
@@ -155,14 +144,14 @@ Score_engraver::typeset_all()
 
          if (!item_p->parent_l (X_AXIS))
            {
-             bool br = (item_p->remove_elt_property (breakable_scm_sym) != SCM_BOOL_F);
+             bool br = (item_p->remove_elt_property ("breakable") != SCM_UNDEFINED);
              if (br)
                command_column_l_->add_element(item_p);
              else
                musical_column_l_->add_element(item_p);
            }
        }
-      if (!elem_p->dim_cache_[Y_AXIS]->parent_l_)
+      if (!elem_p->parent_l(Y_AXIS))
        scoreline_l_->add_element (elem_p);
     }
   elem_p_arr_.clear();
@@ -171,9 +160,8 @@ Score_engraver::typeset_all()
 void
 Score_engraver::do_pre_move_processing()
 {
-  if (break_penalty_i_ > Break_req::DISALLOW)
+  if (command_column_l_->get_elt_property ("breakable") !=  SCM_UNDEFINED)
     {
-      command_column_l_->set_elt_property (breakable_scm_sym, SCM_BOOL_T);
       breaks_i_ ++;
       if (! (breaks_i_%8))
        *mlog << "[" << breaks_i_ << "]" << flush;
@@ -194,10 +182,8 @@ Score_engraver::set_columns (Score_column *new_command_l,
       scoreline_l_->add_column (command_column_l_);
     }
   else 
-    {
-      delete command_column_l_ ;
-      command_column_l_ =0;
-    }
+    command_column_l_ =0;
+
   if (new_command_l) 
     command_column_l_ = new_command_l;
 
@@ -207,10 +193,7 @@ Score_engraver::set_columns (Score_column *new_command_l,
       scoreline_l_->add_column (musical_column_l_);      
     }
   else 
-    {
-      delete musical_column_l_;
-      musical_column_l_ = 0;
-    }
+    musical_column_l_ = 0;
   
   if (new_musical_l) 
     {
@@ -246,16 +229,22 @@ Score_engraver::do_try_music (Music*r)
 
   if (!gotcha)
     {
-      /*
-       UGH! THIS IS NOT SYMMETRIC. CLEAN ME UP!
-       */
       if (Break_req* b = dynamic_cast<Break_req *> (r))
        {
          gotcha = true;
-         if (b->penalty_i_ <= Break_req::DISALLOW)
-           break_penalty_i_ = b->penalty_i_;
-         else if (b->penalty_i_ >= Break_req::FORCE)
-           command_column_l_->break_penalty_i_ = b->penalty_i_;
+
+
+         SCM pen = command_column_l_->get_elt_property  ("penalty");
+         Real total_penalty = (pen == SCM_UNDEFINED)
+           ? 0.0
+           : gh_scm2double(pen); // ugh. Should typecheck.
+
+         total_penalty += b->penalty_f_;
+         if (b->penalty_f_ > 10000.0) //  ugh. arbitrary.
+           forbid_breaks ();
+
+         command_column_l_->set_elt_property ("penalty",
+                                              gh_double2scm (total_penalty));
        }
     }
    return gotcha;
@@ -264,7 +253,10 @@ Score_engraver::do_try_music (Music*r)
 void
 Score_engraver::forbid_breaks ()
 {
-  break_penalty_i_ = Break_req::DISALLOW;
+  /*
+    result is junked.
+   */
+  command_column_l_->remove_elt_property ("breakable");
 }
 
 ADD_THIS_TRANSLATOR(Score_engraver);
@@ -278,3 +270,4 @@ Score_engraver::do_add_processing ()
   pscore_p_ = new Paper_score;
   pscore_p_->paper_l_ = dynamic_cast<Paper_def*>(output_def_l_);
 }
+