]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.1.36
authorfred <fred>
Tue, 26 Mar 2002 21:48:07 +0000 (21:48 +0000)
committerfred <fred>
Tue, 26 Mar 2002 21:48:07 +0000 (21:48 +0000)
lily/p-score.cc
lily/score-element.cc

index 0e12201fc52f2155c8bec3840816fbdd69c9ff37..1e2e45226c8aea2efb6ec73e161b4340abd53c3d 100644 (file)
@@ -25,6 +25,7 @@
 
 Paper_score::Paper_score ()
 {
+  paper_l_ =0;
   outputter_l_ =0;
   Line_of_score * line_p = new Line_of_score;
   typeset_unbroken_spanner (line_p);
@@ -52,6 +53,10 @@ Paper_score::typeset_element (Score_element * elem_p)
   elem_p_arr_.push (elem_p);
   elem_p->pscore_l_ = this;
   elem_p->add_processing ();
+
+  SCM p =  elem_p->remove_elt_property (break_helper_only_scm_sym);
+  if (p != SCM_BOOL_F)
+    break_helpers_arr_.push (elem_p);
 }
 
 
@@ -61,6 +66,10 @@ Paper_score::typeset_unbroken_spanner (Spanner*span_p)
   span_p_arr_.push (span_p);
   span_p->pscore_l_=this;
   span_p->add_processing ();
+
+  SCM p =  span_p->remove_elt_property (break_helper_only_scm_sym);
+  if (p != SCM_BOOL_F)
+    break_helpers_arr_.push (span_p);
 }
 
 void
@@ -129,7 +138,13 @@ Paper_score::calc_breaking ()
 
 
 
-void delete_array_contents (Link_array<Score_element> const&to_remove, Dictionary<int> &type_stats)
+/*
+  not clean.  Should update elem_p_arr_ and span_p_arr_.  That would
+  also repair the stats.
+
+  This may be done efficiently by first sorting the arrays.  */
+void
+delete_array_contents (Link_array<Score_element> &to_remove, Dictionary<int> &type_stats)
 {
   for (int i=0; i < to_remove.size (); i++)
     {
@@ -147,40 +162,14 @@ void delete_array_contents (Link_array<Score_element> const&to_remove, Dictionar
         type_stats["Total"] ++;
        }
 
+  to_remove.clear ();
+  to_remove.tighten_maxsize ();
 }
-Link_array<Score_element>
-Paper_score::remove_break_helpers ()
-{
-  Link_array<Score_element> to_remove;
-  Link_array<Score_element> keep;
-  SCM help_sym = break_helper_only_scm_sym;
-  for (int i=0; i < elem_p_arr_.size (); i++)
-    {
-      Score_element*e = elem_p_arr_[i];
-      SCM p =  e->get_elt_property (help_sym);
-      if (p != SCM_BOOL_F)
-       to_remove.push (e);
-      else
-       keep.push (e);
-    }
 
-  elem_p_arr_ = keep;
-  Link_array<Spanner> keeps;
-  for (int i=0; i<span_p_arr_.size  ();i++)
-    {
-      Spanner *s = span_p_arr_[i];
-      Score_element *e = s;
-      SCM p =  e->get_elt_property (break_helper_only_scm_sym);
-      if (p != SCM_BOOL_F)
-       to_remove.push (e);
-      else
-       keeps.push (s);
-    }
-
-
-  span_p_arr_ =keeps;
-
-  return to_remove;
+void
+Paper_score::schedule_for_delete (Score_element*e)
+{
+  to_delete_arr_.push (e);
 }
 
 void
@@ -190,18 +179,19 @@ Paper_score::process ()
   type_stats["Item"] =0;
   type_stats["Spanner"] =0;
   type_stats["Total"]=0;
-    
+
   print ();
   *mlog << _ ("Preprocessing elements...") << " " << flush;
   line_l_->breakable_col_processing ();
-      line_l_->pre_processing ();
+  line_l_->pre_processing ();
   
-      *mlog << '\n' << _ ("Calculating column positions...") << " " << flush;
-      line_l_->space_processing ();
+  *mlog << '\n' << _ ("Calculating column positions...") << " " << flush;
+  line_l_->space_processing ();
 
   Array<Column_x_positions> breaking = calc_breaking ();
 
-  delete_array_contents (remove_break_helpers(), type_stats);
+
+  delete_array_contents (break_helpers_arr_, type_stats);
   
   Paper_stream* paper_stream_p = paper_l_->paper_stream_p ();
   outputter_l_ = paper_l_->paper_outputter_p (paper_stream_p, header_l_, origin_str_);
@@ -217,6 +207,7 @@ Paper_score::process ()
 
   if (experimental_features_global_b)
     *mlog << elem_p_arr_.size ()  + span_p_arr_.size () << " elements. ";
+
   *mlog << "\nLine ... ";
   for (int i=0; i < lines.size (); i++)
     {
@@ -232,10 +223,9 @@ Paper_score::process ()
        *mlog << '(' << elem_p_arr_.size () + span_p_arr_.size () << ')';
       
       *mlog << ']' << flush;
-      Link_array<Score_element> to_remove (remove_line (line_l));
-      delete_array_contents (to_remove,  type_stats);
-    }
+      
+      delete_array_contents (to_delete_arr_, type_stats);
+     }
   
   // huh?
   delete outputter_l_;
@@ -257,38 +247,6 @@ Paper_score::process ()
       
 }
 
-
-Link_array<Score_element>
-Paper_score::remove_line (Line_of_score *l)
-{
-  Link_array<Score_element> to_remove;
-  Link_array<Score_element> keep;
-  for (int i=0; i < elem_p_arr_.size (); i++)
-    {
-      Score_element*e = elem_p_arr_[i];
-      if (e->line_l () == l)
-       to_remove.push (e);
-      else
-       keep.push (e);
-    }
-
-  elem_p_arr_ = keep;
-  Link_array<Spanner> keeps;
-  for (int i=0; i<span_p_arr_.size  ();i++)
-    {
-      Spanner *s = span_p_arr_[i];
-      Score_element *e = s;
-      if (e->line_l () == l)
-       to_remove.push (e);
-      else
-       keeps.push (s);
-    }
-
-
-  span_p_arr_ =keeps;
-  return to_remove;
-}
-
 Link_array<Item>
 Paper_score::broken_col_range (Item const*l, Item const*r) const
 {
index 21989d59a344b4cc04dd2ce97019a9d8ff046085..117b69327946e385409dffea925c822b6592833b 100644 (file)
@@ -84,8 +84,9 @@ SCM
 Score_element::get_elt_property (SCM sym) const
 {
   SCM s =  scm_assq(sym, element_property_alist_);
+
   // is this a good idea?
-  if (s == SCM_BOOL_F && pscore_l_)
+  if (s == SCM_BOOL_F && pscore_l_ && pscore_l_->paper_l_)
     s = pscore_l_->paper_l_->get_scm_var (sym);
 
   return s;
@@ -217,6 +218,7 @@ Score_element::output_processing ()
   if (get_elt_property (transparent_scm_sym) != SCM_BOOL_F)
     return;
 
+  // we're being silly here. 
   if (output_p_)
     delete output_p_;
   
@@ -224,9 +226,12 @@ Score_element::output_processing ()
   pscore_l_->outputter_l_->output_molecule (output_p_,
                                            absolute_offset (),
                                            classname(this));
+
+  pscore_l_->schedule_for_delete (this);
 }
 
 
+
 /*
   
   VIRTUAL STUBS