X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;ds=sidebyside;f=lily%2Fbreak-substitution.cc;h=f283010303ae2be12956e40229d51d96661bcff1;hb=bcd02ba59b7e4c37730758bbeb41f311382e3440;hp=ea85a6e7e8c9a487ea751db9ef5b381a1803a6c3;hpb=4b975f3177880e16e759f67be4517f67109c2633;p=lilypond.git diff --git a/lily/break-substitution.cc b/lily/break-substitution.cc index ea85a6e7e8..f283010303 100644 --- a/lily/break-substitution.cc +++ b/lily/break-substitution.cc @@ -3,16 +3,16 @@ source file of the GNU LilyPond music typesetter - (c) 2001--2005 Han-Wen Nienhuys - + (c) 2001--2007 Han-Wen Nienhuys */ #include #include +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 (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)) @@ -143,33 +139,29 @@ do_break_substitution (SCM src) /* Perform substitution on GROB_LIST using a constant amount of stack. */ -Link_array temporary_substition_array; +vector 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 &old_grobs (grob_arr->array_reference ()); - Link_array *new_grobs (new_arr == grob_arr - ? &temporary_substition_array + vector &old_grobs (grob_arr->array_reference ()); + vector *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; } @@ -322,7 +312,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 +322,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 +338,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 +348,9 @@ Spanner::fast_substitute_grob_array (SCM sym, int idx = 0; if (dynamic_cast (g)) - { - idx = --spanner_index; - } + idx = --spanner_index; else if (dynamic_cast (g)) - { - idx = item_index++; - } + idx = item_index++; vec[idx].set (g, sr); } @@ -370,15 +358,15 @@ Spanner::fast_substitute_grob_array (SCM sym, qsort (vec, item_index, sizeof (Substitution_entry), &Substitution_entry::item_compare); - Array item_indices; - Array spanner_indices; + vector item_indices; + vector 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 *arrs[] + + vector *arrs[] = { &item_indices, &spanner_indices }; @@ -386,9 +374,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 +382,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 +399,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 +449,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 +485,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 +502,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_); +}