]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/break-substitution.cc
Run `make grand-replace'.
[lilypond.git] / lily / break-substitution.cc
index b49aaffa394df4a434160648508a5f20725cf50d..8326cee5eeb8f045a3bf1cbc46158c6432c2848a 100644 (file)
@@ -3,16 +3,16 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 2001--2005 Han-Wen Nienhuys <hanwen@xs4all.nl>
-
+  (c) 2001--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 #include <cstdio>
 #include <cstdlib>
+using namespace std;
 
-#include "grob-array.hh"
 #include "item.hh"
 #include "system.hh"
+#include "grob-array.hh"
 
 static SCM break_criterion;
 void
@@ -42,9 +42,7 @@ substitute_grob (Grob *sc)
       System *line
        = dynamic_cast<System *> (unsmob_grob (break_criterion));
       if (sc->get_system () != line)
-       {
-         sc = sc->find_broken_piece (line);
-       }
+       sc = sc->find_broken_piece (line);
 
       /* now: !sc || (sc && sc->get_system () == line) */
       if (!sc)
@@ -66,9 +64,7 @@ substitute_grob (Grob *sc)
 
       if (sc->common_refpoint (line, X_AXIS)
          && sc->common_refpoint (line, Y_AXIS))
-       {
-         return sc;
-       }
+       return sc;
       return 0;
     }
 
@@ -96,7 +92,7 @@ do_break_substitution (SCM src)
 
   if (unsmob_grob (src))
     {
-      Grob * new_ptr = substitute_grob (unsmob_grob (src));
+      Grob *new_ptr = substitute_grob (unsmob_grob (src));
       return new_ptr ? new_ptr->self_scm () : SCM_UNDEFINED;
     }
   else if (scm_is_vector (src))
@@ -105,7 +101,7 @@ do_break_substitution (SCM src)
       SCM nv = scm_c_make_vector (len, SCM_UNDEFINED);
       for (int i = 0; i < len; i++)
        {
-         SCM si = scm_int2num (i);
+         SCM si = scm_from_int (i);
          scm_vector_set_x (nv, si,
                            do_break_substitution (scm_vector_ref (src, si)));
        }
@@ -143,33 +139,29 @@ do_break_substitution (SCM src)
 /*
   Perform substitution on GROB_LIST using a constant amount of stack.
 */
-Link_array<Grob> temporary_substition_array;
+vector<Grob*> temporary_substition_array;
 void
-substitute_grob_array (Grob_array *grob_arr, Grob_array * new_arr)
+substitute_grob_array (Grob_array *grob_arr, Grob_array *new_arr)
 {
-  Link_array<Grob> &old_grobs (grob_arr->array_reference ());
-  Link_array<Grob> *new_grobs (new_arr == grob_arr
-                              ? &temporary_substition_array
+  vector<Grob*> &old_grobs (grob_arr->array_reference ());
+  vector<Grob*> *new_grobs (new_arr == grob_arr
+                              ? & temporary_substition_array
                               : &new_arr->array_reference ());
-  
-  new_grobs->set_size (old_grobs.size ());
-  Grob **array =  (Grob**) new_grobs->accesses();
-  Grob **ptr = array; 
-  for (int i = 0; i < old_grobs.size (); i++)
+
+  new_grobs->resize (old_grobs.size ());
+  Grob **array = (Grob **) new_grobs->data ();
+  Grob **ptr = array;
+  for (vsize i = 0; i < old_grobs.size (); i++)
     {
       Grob *orig = old_grobs[i];
       Grob *new_grob = substitute_grob (orig);
       if (new_grob)
-       {
-         *ptr ++ = new_grob;
-       }
+       *ptr++ = new_grob;
     }
 
-  new_grobs->set_size (ptr - array);  
+  new_grobs->resize (ptr - array);
   if (new_arr == grob_arr)
-    {
-      new_arr->set_array (*new_grobs);
-    }
+    new_arr->set_array (*new_grobs);
 }
 
 /*
@@ -228,14 +220,12 @@ spanner_system_range (Spanner *sp)
   Slice rv;
 
   if (System *st = sp->get_system ())
-    {
-      rv = Slice (st->get_rank (), st->get_rank ());
-    }
+    rv = Slice (st->get_rank (), st->get_rank ());
   else
     {
       if (sp->broken_intos_.size ())
        rv = Slice (sp->broken_intos_[0]->get_system ()->get_rank (),
-                   sp->broken_intos_.top ()->get_system ()->get_rank());
+                   sp->broken_intos_.back ()->get_system ()->get_rank ());
     }
   return rv;
 }
@@ -273,6 +263,8 @@ grob_system_range (Grob *g)
 struct Substitution_entry
 {
   Grob *grob_;
+
+  /* Assumption: we have less than 32k paper columns. */
   short left_;
   short right_;
 
@@ -322,7 +314,7 @@ bool
 Spanner::fast_substitute_grob_array (SCM sym,
                                     Grob_array *grob_array)
 {
-  int len = grob_array->size();
+  int len = grob_array->size ();
 
   if (grob_array->ordered ())
     return false;
@@ -332,6 +324,8 @@ Spanner::fast_substitute_grob_array (SCM sym,
 
   /*
     We store items on the left, spanners on the right in this vector.
+
+    FIXME: will not multithread.
   */
   static Substitution_entry *vec;
   static int vec_room;
@@ -346,8 +340,8 @@ Spanner::fast_substitute_grob_array (SCM sym,
 
   int spanner_index = len;
   int item_index = 0;
-  
-  for (int i = 0 ; i < grob_array->size (); i++)
+
+  for (vsize i = 0; i < grob_array->size (); i++)
     {
       Grob *g = grob_array->grob (i);
 
@@ -356,13 +350,9 @@ Spanner::fast_substitute_grob_array (SCM sym,
 
       int idx = 0;
       if (dynamic_cast<Spanner *> (g))
-       {
-         idx = --spanner_index;
-       }
+       idx = --spanner_index;
       else if (dynamic_cast<Item *> (g))
-       {
-         idx = item_index++;
-       }
+       idx = item_index++;
 
       vec[idx].set (g, sr);
     }
@@ -370,15 +360,15 @@ Spanner::fast_substitute_grob_array (SCM sym,
   qsort (vec, item_index,
         sizeof (Substitution_entry), &Substitution_entry::item_compare);
 
-  Array<Slice> item_indices;
-  Array<Slice> spanner_indices;
+  vector<Slice> item_indices;
+  vector<Slice> spanner_indices;
   for (int i = 0; i <= system_range.length (); i++)
     {
-      item_indices.push (Slice (len, 0));
-      spanner_indices.push (Slice (len, 0));
+      item_indices.push_back (Slice (len, 0));
+      spanner_indices.push_back (Slice (len, 0));
     }
-  
-  Array<Slice> *arrs[]
+
+  vector<Slice> *arrs[]
     = {
     &item_indices, &spanner_indices
   };
@@ -386,9 +376,7 @@ Spanner::fast_substitute_grob_array (SCM sym,
   for (int i = 0; i < item_index;i++)
     {
       for (int j = vec[i].left_; j <= vec[i].right_; j++)
-       {
-         item_indices[j - system_range[LEFT]].add_point (i);
-       }
+       item_indices[j - system_range[LEFT]].add_point (i);
     }
 
   /*
@@ -396,14 +384,14 @@ Spanner::fast_substitute_grob_array (SCM sym,
     is a waste of time -- the staff-spanners screw up the
     ordering, since they go across the entire score.
   */
-  for (int i = spanner_indices.size (); i--;)
+  for (vsize i = spanner_indices.size (); i--;)
     spanner_indices[i] = Slice (spanner_index, len - 1);
 
   assert (item_index <= spanner_index);
 
-  assert ((broken_intos_.size () == system_range.length () + 1)
-         || (broken_intos_.is_empty () && system_range.length () == 0));
-  for (int i = 0; i < broken_intos_.size (); i++)
+  assert ((broken_intos_.size () == (vsize)system_range.length () + 1)
+         || (broken_intos_.empty () && system_range.length () == 0));
+  for (vsize i = 0; i < broken_intos_.size (); i++)
     {
       Grob *sc = broken_intos_[i];
       System *l = sc->get_system ();
@@ -413,18 +401,16 @@ Spanner::fast_substitute_grob_array (SCM sym,
       if (!unsmob_grob_array (newval))
        {
          newval = Grob_array::make_array ();
-         sc->internal_set_object (sym, newval);
+         sc->set_object (sym, newval);
        }
-      
-      Grob_array *new_array = unsmob_grob_array (newval);  
+
+      Grob_array *new_array = unsmob_grob_array (newval);
       for (int k = 0; k < 2;k++)
        for (int j = (*arrs[k])[i][LEFT]; j <= (*arrs[k])[i][RIGHT]; j++)
          {
            Grob *substituted = substitute_grob (vec[j].grob_);
            if (substituted)
-             {
-               new_array->add (substituted);
-             }
+             new_array->add (substituted);
          }
 
 #ifdef PARANOIA
@@ -465,14 +451,14 @@ substitute_object_alist (SCM alist, SCM dest)
       SCM sym = scm_caar (s);
       SCM val = scm_cdar (s);
 
-      if (Grob_array * orig = unsmob_grob_array (val))
+      if (Grob_array *orig = unsmob_grob_array (val))
        {
          SCM handle = scm_assq (sym, dest);
-         SCM newval =
-           (scm_is_pair (handle))
+         SCM newval
+           (scm_is_pair (handle))
            ? scm_cdr (handle)
            : Grob_array::make_array ();
-           
+
          Grob_array *new_arr = unsmob_grob_array (newval);
 
          substitute_grob_array (orig, new_arr);
@@ -501,12 +487,12 @@ Spanner::substitute_one_mutable_property (SCM sym,
   Spanner *s = this;
 
   bool fast_done = false;
-  Grob_array * grob_array = unsmob_grob_array (val);
+  Grob_array *grob_array = unsmob_grob_array (val);
   if (grob_array)
     fast_done = s->fast_substitute_grob_array (sym, grob_array);
 
   if (!fast_done)
-    for (int i = 0; i < s->broken_intos_.size (); i++)
+    for (vsize i = 0; i < s->broken_intos_.size (); i++)
       {
        Grob *sc = s->broken_intos_[i];
        System *l = sc->get_system ();
@@ -518,15 +504,21 @@ Spanner::substitute_one_mutable_property (SCM sym,
            if (!unsmob_grob_array (newval))
              {
                newval = Grob_array::make_array ();
-               sc->internal_set_object  (sym, newval);
+               sc->set_object (sym, newval);
              }
            substitute_grob_array (grob_array, unsmob_grob_array (newval));
          }
        else
          {
            SCM newval = do_break_substitution (val);
-           sc->internal_set_object (sym, newval);
+           sc->set_object (sym, newval);
          }
       }
 }
 
+void
+Grob::substitute_object_links (SCM crit, SCM orig)
+{
+  set_break_subsititution (crit);
+  object_alist_ = substitute_object_alist (orig, object_alist_);
+}