]> git.donarmstrong.com Git - lilypond.git/commitdiff
patch::: 1.3.9.hwn2
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 5 Dec 1999 22:08:54 +0000 (23:08 +0100)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sun, 5 Dec 1999 22:08:54 +0000 (23:08 +0100)
pl 9.hwn1
- abstracting Staff_symbol_referencer to an interface.
- quantised_position for staccato dots.
- standchen fixes
- junk Score_element::do_{width,height}: set callbacks directly.
- merge Score_element, Graphical_element
- merge Axis_group_element, Graphical_axis_group
- junk pointer fields from
  * Single_malt_grouping_item
  * Separating_group_spanner
  * Stem_tremolo
  * Hara_kiri_vertical_group_spanner
  * Stem
  * Axis_group_element
  * Align_element
  * Beam

**********

91 files changed:
CHANGES
VERSION
input/test/staccato-pos.sly
lily/align-element.cc
lily/auto-beam-engraver.cc
lily/axis-group-element.cc
lily/axis-group-item.cc
lily/axis-group-spanner.cc
lily/bar.cc
lily/beam-engraver.cc
lily/beam.cc
lily/bow.cc
lily/break-align-item.cc
lily/clef-engraver.cc
lily/clef-item.cc
lily/cross-staff.cc
lily/dimension-cache.cc
lily/directional-spanner.cc
lily/dots.cc
lily/extender-spanner.cc
lily/gdb.cc
lily/grace-position-engraver.cc
lily/graphical-axis-group.cc
lily/graphical-element.cc
lily/group-interface.cc [new file with mode: 0644]
lily/hara-kiri-vertical-group-spanner.cc
lily/hyphen-spanner.cc
lily/include/align-element.hh
lily/include/axis-group-element.hh
lily/include/axis-group-item.hh
lily/include/axis-group-spanner.hh
lily/include/beam.hh
lily/include/bow.hh
lily/include/dimension-cache.hh
lily/include/directional-spanner.hh
lily/include/extender-spanner.hh
lily/include/graphical-axis-group.hh
lily/include/graphical-element.hh
lily/include/group-interface.hh [new file with mode: 0644]
lily/include/hara-kiri-vertical-group-spanner.hh
lily/include/hyphen-spanner.hh
lily/include/item.hh
lily/include/lily-proto.hh
lily/include/line-of-score.hh
lily/include/note-head.hh
lily/include/paper-score.hh
lily/include/score-element.hh
lily/include/separating-group-spanner.hh
lily/include/single-malt-grouping-item.hh
lily/include/spacing-spanner.hh
lily/include/span-bar.hh
lily/include/spanner.hh
lily/include/staff-side.hh
lily/include/staff-symbol-referencer.hh
lily/include/staff-symbol.hh
lily/include/stem-tremolo.hh
lily/include/stem.hh
lily/include/volta-spanner.hh
lily/item.cc
lily/lily-guile.cc
lily/line-of-score.cc
lily/note-column.cc
lily/note-head.cc
lily/paper-column.cc
lily/paper-score.cc
lily/rest-collision.cc
lily/score-element.cc
lily/script-engraver.cc
lily/script.cc
lily/separating-group-spanner.cc
lily/separating-line-group-engraver.cc
lily/single-malt-grouping-item.cc
lily/slur.cc
lily/spacing-spanner.cc
lily/span-bar.cc
lily/span-score-bar-engraver.cc
lily/spanner.cc
lily/staff-side.cc
lily/staff-sym-engraver.cc
lily/staff-sym.cc
lily/staff-symbol-referencer.cc
lily/stem-info.cc
lily/stem-tremolo.cc
lily/stem.cc
lily/super-element.cc
lily/text-engraver.cc
lily/tuplet-spanner.cc
lily/volta-spanner.cc
ly/params.ly
make/toplevel.make.in
mutopia/F.Schubert/standchen.ly

diff --git a/CHANGES b/CHANGES
index dcf9175885615a8a0defb5ce51bc520dedaaf5e0..bcb9d4b971fe69ac438dcc42b1c3277ec003c98f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,22 @@
+pl 9.hwn1
+       - abstracting Staff_symbol_referencer to an interface.
+       - quantised_position for staccato dots.
+       - standchen fixes
+       - junk Score_element::do_{width,height}: set callbacks directly.
+       - merge Score_element, Graphical_element
+       - merge Axis_group_element, Graphical_axis_group
+       - junk pointer fields from
+         * Single_malt_grouping_item
+         * Separating_group_spanner
+         * Stem_tremolo
+         * Hara_kiri_vertical_group_spanner
+         * Stem
+         * Axis_group_element
+         * Align_element
+         * Beam
+
+**********
+
 pl 8.hwn2
        - staff-support for Crescendi.
        - padding for accidentals.
@@ -7,10 +26,9 @@ pl 8.hwn1
        - note-head-side 
        - naming Staff_sidify -> Side_position_interface
 
-
-
 ***********
-pl7.mb1
+
+pl 7.mb1
        - bf: timeSignatureStyle works again
 
 pl 7.hwn1
diff --git a/VERSION b/VERSION
index 9c66264a28428ff52db8a955a0d08a6484521b9e..fe652d9364212749892ef09ed5669be4181c2642 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -2,7 +2,7 @@ PACKAGE_NAME=LilyPond
 MAJOR_VERSION=1
 MINOR_VERSION=3
 PATCH_LEVEL=9
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=hwn2
 
 # use the above to send patches: MY_PATCH_LEVEL is always empty for a
 # released version.
index 31bcd80900604a1bd4520decf9d58d85dbe06813..aed9dc91de4b066041e310b9e670c174a54a867f 100644 (file)
@@ -1,3 +1,3 @@
-\stemup
+
 e''4-. f-. d-.
 c,-. b-. c'''-. d-.
index 9ccc1538d6e69620107b27ac8ae16e694b16e4b3..2297ddd017b8c87fc71fb21081d7bea22c3cdeac 100644 (file)
 #include "hash-table-iter.hh"
 #include "dimension-cache.hh"
 
-struct Align_element_content {
-  Graphical_element * elem_l_;
-  int priority_i_;
-  
-  static int compare (Align_element_content const &h1, 
-                     Align_element_content const &h2) 
-    {
-      return h1.priority_i_ - h2.priority_i_;
-    }
-  Align_element_content (Graphical_element *elem_l, int p) 
-    {
-      priority_i_ = p;
-      elem_l_ = elem_l;
-    }
-  Align_element_content () {
-    elem_l_ = 0;
-    priority_i_ = 0;
-  }
-};
-
-
-
-void
-Align_element::add_element (Score_element*el_l)
-{
-  int p = elem_l_arr_.size ();
-  add_element_priority (el_l, p);
-}
-
-void
-Align_element::add_element_priority (Score_element *el, int p)
-{
-  assert (! contains_b (el));
-  Axis_group_element::add_element (el);
-  priority_i_hash_[el] = p;
-  add_dependency (el);
-}
-
-void
-Align_element::do_substitute_element_pointer (Score_element*o,
-                                             Score_element*n)
-{
-  Axis_group_element :: do_substitute_element_pointer (o,n);
-  if (o == center_l_)
-    {
-      center_l_ = n;
-    }
-  if (priority_i_hash_.elem_b (o))
-    {
-      priority_i_hash_[n] = priority_i_hash_[o];
-      /*
-       Huh? It seems the old pointers are still used.  Why?
-       */
-      // priority_i_hash_.remove (o);
-    }
-}
-
 void
 Align_element::do_post_processing()
 {
@@ -90,12 +33,13 @@ Align_element::do_side_processing ()
   Array<Interval> dims;
 
   Link_array<Score_element> elems;
-  for (int i=0; i < elem_l_arr_.size(); i++) 
+  Link_array<Score_element> all_elts (elem_l_arr ());
+  for (int i=0; i < elem_l_arr ().size(); i++) 
     {
-      Interval y = elem_l_arr_[i]->extent(axis ()) + elem_l_arr_[i]->relative_coordinate (this, axis ());
+      Interval y = all_elts[i]->extent(axis ()) + all_elts[i]->relative_coordinate (this, axis ());
       if (!y.empty_b())
        {
-         Score_element *e =dynamic_cast<Score_element*>(elem_l_arr_[i]);
+         Score_element *e =dynamic_cast<Score_element*>(all_elts[i]);
 
          // todo: fucks up if item both in Halign & Valign. 
          SCM min_dims = e->remove_elt_property ("minimum-space");
@@ -119,6 +63,10 @@ Align_element::do_side_processing ()
 
   Real where_f=0;
   Real center_f = 0.0;
+  SCM scenter = get_elt_property ("center-element");
+  Score_element *center_elt = (SMOB_IS_TYPE_B(Score_element,scenter))
+    ? SMOB_TO_TYPE(Score_element,scenter) : 0;
+  
   for (int i=0 ;  i < elems.size(); i++) 
     {
       Real dy = - stacking_dir_ * dims[i][-stacking_dir_];
@@ -133,7 +81,7 @@ Align_element::do_side_processing ()
 
       if (!i && align_dir_ == LEFT)
        center_f = where_f;
-      else if (align_dir_ == CENTER && elems[i] == center_l_)
+      else if (align_dir_ == CENTER && elems[i] == center_elt)
        center_f = where_f;
 
       where_f += stacking_dir_ * dy;
@@ -144,7 +92,7 @@ Align_element::do_side_processing ()
     where_f += dims.top ()[stacking_dir_];
   if (align_dir_ == RIGHT)
     center_f = where_f;
-  else if (align_dir_ == CENTER && !center_l_)
+  else if (align_dir_ == CENTER && !center_elt)
     center_f = where_f / 2;
     
   if (center_f)
@@ -159,8 +107,21 @@ Align_element::Align_element()
   threshold_interval_ = Interval (0, Interval::infinity ());
   stacking_dir_ = DOWN;
   align_dir_ = CENTER;
-  center_l_ =0;
-  priority_i_hash_.hash_func_ = pointer_hash;
+}
+
+int
+Align_element::get_count (Score_element*s)const
+{
+  SCM e = get_elt_property ("elements");
+  int c =0;
+  while (gh_pair_p (e))
+    {
+      if (gh_car (e) == s->self_scm_)
+       break;
+      c++;
+      e = gh_cdr (e);
+    }
+  return c;
 }
 
 Axis
@@ -176,62 +137,7 @@ Align_element::set_axis (Axis a)
 }
 
 
-bool
-Align_element::contains_b (Score_element const *e) const
-{
-  return elem_l_arr_.find_l (e);
-}
-
-void
-Align_element::sort_elements ()
-{
-  Array<Align_element_content> content;
-  for  (int i =0; i < elem_l_arr_.size(); i++)
-    {
-      Score_element * e = dynamic_cast<Score_element*> (elem_l_arr_[i]);
-      assert (priority_i_hash_.elem_b (e));
-      int p = priority_i_hash_[e];
-      content.push (Align_element_content (e, p));
-    }
-  content.sort (Align_element_content::compare);
-  
-  elem_l_arr_.clear();
-  priority_i_hash_.clear();
-
-  for  (int i =0; i < content.size(); i++) 
-    {
-      elem_l_arr_.push (content[i].elem_l_);
-    }
-}
 
-void
-Align_element::do_print () const
-{
-#ifndef NPRINT
-  DEBUG_OUT << "contains: ";
-  for (int i=0 ;  i < elem_l_arr_.size(); i++) 
-    DEBUG_OUT << classname (elem_l_arr_[i]) << ", ";
-#endif
-}
 
-Score_element*
-Align_element::get_elt_by_priority (int p) const
-{
-  for (Hash_table_iter<Score_element*, int>  i(priority_i_hash_); i.ok (); i++)
-    {
-      if (i.val () == p)
-       return i.key();
-    }
-  return 0;
-}
 
-int
-Align_element::get_priority (Score_element const * e) const
-{
-  Score_element * nonconst = (Score_element*) e;
-  if ( priority_i_hash_.elem_b (nonconst))
-    return priority_i_hash_[nonconst];
-  else
-    return elem_l_arr_.find_i (nonconst);
-}
 
index bbba952ad21ebed9ae66f8689aa6c4f030074946..6e1e805b3d3da27d8d53d27bc274dcaac95b1d91 100644 (file)
@@ -207,7 +207,7 @@ Auto_beam_engraver::create_beam_p ()
       /*
        watch out for stem tremolos and abbreviation beams
        */
-      if ((*stem_l_arr_p_)[i]->beam_l_)
+      if ((*stem_l_arr_p_)[i]->beam_l ())
        {
          return 0;
        }
@@ -334,7 +334,7 @@ Auto_beam_engraver::acknowledge_element (Score_element_info info)
          return;
        }
 
-      if (stem_l->beam_l_)
+      if (stem_l->beam_l ())
        {
          if (stem_l_arr_p_)
            junk_beam ();
index c14b5186e509cd78069d6301708038b67f33bc56..306d9d481bf686b43528811fef4e4f352a169903 100644 (file)
@@ -7,7 +7,7 @@
 */
 
 #include "axis-group-element.hh"
-#include "graphical-axis-group.hh"
+#include "axis-group-element.hh"
 #include "dimension-cache.hh"
 
 Link_array<Score_element>
@@ -24,8 +24,11 @@ Axis_group_element::elem_l_arr () const
     ugh. I know
   */
   Link_array<Score_element> r;
-  for (int i=0; i < elem_l_arr_.size (); i++)
-    r.push (dynamic_cast<Score_element*>(elem_l_arr_[i]));
+  for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
+    {
+      SCM e=gh_car (s); 
+      r.push (dynamic_cast<Score_element*>(SMOB_TO_TYPE (Score_element, e)));
+    }
       
   return r;
 }
@@ -36,7 +39,6 @@ Axis_group_element::get_children ()
   Link_array<Score_element> childs;
   Link_array<Score_element> elems = elem_l_arr ();
 
-  elems.concat (extra_elems_ );
   for (int i=0; i < elems.size (); i++) 
     {
       Score_element* e = elems[i];
@@ -49,69 +51,48 @@ Axis_group_element::get_children ()
   return childs;
 }
 
-void
-Axis_group_element::do_print() const
-{
-  Graphical_axis_group::do_print();
-}
-
 Axis_group_element::Axis_group_element()
 {
+  axes_[0] = (Axis)-1 ; 
+  axes_[1] = (Axis)-1 ;
+
+  set_elt_property ("elements", SCM_EOL);
   set_elt_property ("transparent", SCM_BOOL_T);
 }
 
 void
 Axis_group_element::set_axes (Axis a1, Axis a2)
 {
-  Graphical_axis_group::set_axes (a1,a2);
-  set_empty (a1 != X_AXIS && a2 != X_AXIS, X_AXIS);
-  set_empty (a1 != Y_AXIS && a2 != Y_AXIS, Y_AXIS);
-}
-
-
-void
-Axis_group_element::do_substitute_element_pointer (Score_element*o,
-                                                  Score_element*n)
-{
-  int i;
-  Graphical_element * go = o;
-  Graphical_element * gn = n;  
+  axes_[0] = a1 ; 
+  axes_[1] = a2 ;
+  if (a1 != X_AXIS && a2 != X_AXIS)
+    set_empty (X_AXIS);
+  if (a1 != Y_AXIS && a2 != Y_AXIS)
+    set_empty (Y_AXIS);
   
-  while ((i = elem_l_arr_.find_i (go))>=0)
-    elem_l_arr_.substitute (go,gn);
-
-  extra_elems_.substitute (o, n);
+  dim_cache_[a1]->set_callback(extent_callback);
+  dim_cache_[a2]->set_callback (extent_callback);
 }
 
 Interval
-Axis_group_element::extra_extent (Axis a )const
+Axis_group_element::extent_callback (Dimension_cache const *c) 
 {
-  Interval g;
-  Axis_group_element* urg = (Axis_group_element*)this;
-  urg->purge_extra ();         // Yeah yeah,  const correctness.
-  for (int i=0;  i < extra_elems_.size (); i++)
+  Axis a = c->axis ();
+  Axis_group_element * me
+    = dynamic_cast<Axis_group_element*> (c->element_l ()); 
+
+  Interval r;
+  for (SCM s = me->get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
     {
-      Interval ge = extra_elems_[i]->relative_coordinate (this, a)
-       + extra_elems_[i]->extent (a);
-      g.unite (ge);
-    }
-  return g;
-}
+      SCM e=gh_car (s); 
+      Score_element * se = dynamic_cast<Score_element*>(SMOB_TO_TYPE (Score_element, e));
 
-Interval
-Axis_group_element::do_height () const
-{
-  Interval gag = Graphical_axis_group::extent (Y_AXIS);
-  gag.unite (extra_extent (Y_AXIS));
-  return gag;
-}
+      Interval dims = se->extent (a);
+      if (!dims.empty_b ())
+       r.unite (dims + se->relative_coordinate (me, a));
+    }
 
-Interval
-Axis_group_element::do_width () const
-{
-  Interval gag = Graphical_axis_group::extent (X_AXIS);
-  gag.unite (extra_extent (X_AXIS));
-  return gag;
+  return r;
 }
 
 
@@ -121,49 +102,31 @@ Axis_group_element::do_width () const
 void
 Axis_group_element::add_extra_element (Score_element *e)
 {
-  Link_array<Score_element> se;
-  while (e && e != this)
-    {
-      se.push (e);
-      e = dynamic_cast<Score_element*> (e->parent_l (Y_AXIS));
-    }
-
-  if (1)                       // e == this)
-    {
-      for (int i=0; i < se.size( ); i++) 
-       {
-         extra_elems_.push (se[i]);
-         add_dependency (se[i]);
-         se[i]->set_elt_property (("Axis_group_element::add_extra_element"), SCM_BOOL_T); // UGH GUH.
-       }
-      
-    }
+  add_element (e);
 }
 
-/*
-  UGH GUH
- */
+
 void
-Axis_group_element::purge_extra ()
+Axis_group_element::add_element (Score_element *e)
 {
-  for (int i=0; i < extra_elems_.size ();)
+  used_b_ =true;
+  e->used_b_ = true;
+  
+  for (int i = 0; i < 2; i++)
     {
-      Score_element *e = extra_elems_[i];
-      while (e && e != this)
-       {
-         e = dynamic_cast<Score_element*> (e->parent_l (Y_AXIS));
-       }
-      if (e != this)
-       extra_elems_.del (i);
-      else
-       i++;
+      if (!e->parent_l (axes_[i]))
+       e->set_parent (this, axes_[i]);
     }
+  set_elt_property ("elements",
+                   gh_cons (e->self_scm_,
+                            get_elt_property ("elements")));
+                            
+  assert (e->parent_l(Y_AXIS) == this || e->parent_l (X_AXIS) == this);
 }
 
-Interval
-Axis_group_element::extent (Axis a) const
-{
-  return Graphical_element::extent (a);
-}
-  
+
+
+
+
+
 
index 5068ecd0994f82243cf75c3f07b832aeb7f0e179..fdbcf9cf29b1431db65fe324438fa83f7f9637db 100644 (file)
 
 
 
-void
-Axis_group_item::OK() const
-{
-  Link_array<Score_element> elems = elem_l_arr ();
-  for (int i=0; i < elems.size(); i++) 
-    {
-      Item * it_l = dynamic_cast<Item*> (elems[i]);
-      assert (it_l);
-    }
-}
-
 void
 Axis_group_item::do_breakable_col_processing()
 {
+#if 0
   if (!breakable_b ()) // ugh should merge with Item code
     return;
 
@@ -45,12 +35,7 @@ Axis_group_item::do_breakable_col_processing()
        }
       while (flip(&j)!=LEFT);
     }
+#endif
   Item::do_breakable_col_processing();
 }
 
-void
-Axis_group_item::do_print() const
-{ 
-  Axis_group_element::do_print(); 
-  Item::do_print ();
-}
index 991cf10853f4dae15be17cb6e131057b74773a27..7af3118a1163f9ddb4efc3664cb0fcfc0e352a6b 100644 (file)
@@ -18,6 +18,7 @@
 void
 Axis_group_spanner::do_break_processing_if_unbroken()
 {
+#if 0
   Link_array<Score_element> elems = elem_l_arr ();
   Line_of_score *my_line = line_l();
   for (int i=0; i < elems.size(); i++) 
@@ -46,11 +47,13 @@ Axis_group_spanner::do_break_processing_if_unbroken()
        }
       
     }
+#endif
 }
 
 void
 Axis_group_spanner::do_break_processing()
 {
+  Spanner::do_break_processing ();
 
   bool breaking_self_b = ! Spanner::line_l();
   if (!breaking_self_b)  
@@ -60,6 +63,7 @@ Axis_group_spanner::do_break_processing()
       return;
     }
 
+#if 0
   break_into_pieces ();
   Link_array<Score_element> loose_elems = elem_l_arr ();
 
@@ -134,7 +138,8 @@ Axis_group_spanner::do_break_processing()
                  else
                    {
                      broken_item->set_elt_property ("transparent", SCM_BOOL_T);
-                     broken_item->set_empty (true);
+                     broken_item->set_empty (X_AXIS); // UGH.
+                     broken_item->set_empty (Y_AXIS);                
                    }
 
                }
@@ -153,20 +158,9 @@ Axis_group_spanner::do_break_processing()
     }
   
   Spanner::do_break_processing();
+#endif
 }
 
-void
-Axis_group_spanner::do_print() const
-{
-  Axis_group_element::do_print();
-
-  Spanner::do_print ();
-}
 
 
-Interval
-Axis_group_spanner::do_width () const
-{
-  return Spanner::do_width ();
-}
 
index ad6fb103f466574ef81865e8e4f6a8fee34f4e47..04214d4068f1d263ac824fff1e4cfd5d3e9d0da8 100644 (file)
@@ -85,7 +85,7 @@ Bar::do_pre_processing ()
     }
 
   if (type_str_ =="")
-    set_empty (true, X_AXIS);
+    set_empty (X_AXIS);
 }
   
 
index e98ab845527c6682b8b1ef57824b6cf4af690c45..1d1a70addff36b0a19ba6a42bec0fed9bd58ec70 100644 (file)
@@ -152,7 +152,7 @@ Beam_engraver::acknowledge_element (Score_element_info info)
   if (beam_p_)
     {
       Stem* stem_l = dynamic_cast<Stem *> (info.elem_l_);
-      if (!stem_l || stem_l->beam_l_)
+      if (!stem_l || stem_l->beam_l ())
        return;
 
 
index c489e8f6e74364d5a9d1bfec89c8936348381da4..10e1355d02622930022dadf6816c5c082efd5ba8 100644 (file)
@@ -35,33 +35,45 @@ needs what, and what information should be available when.
 #include "stem.hh"
 #include "paper-def.hh"
 #include "lookup.hh"
+#include "group-interface.hh"
 
 Beam::Beam ()
 {
+  Group_interface g (this, "stems");
+  g.set_interface ();
+  
   slope_f_ = 0;
   left_y_ = 0;
   multiple_i_ = 0;
 }
 
+/*
+  TODO: Fix this class. This is wildly inefficient.
+ */
+Stem *
+Beam::stem (int i)const
+{
+  return Group_interface__extract_elements ((Beam*) this, (Stem*) 0, "stems")[i];
+}
+
+int
+Beam::stem_count ()const
+{
+  Group_interface gi (this);
+  return gi.count ();
+}
+
+
 void
 Beam::add_stem (Stem*s)
 {
-#if 0
-  /*
-    should figure out why this didn't work.
-
-    --hwn.
-   */
-  if (!stems_.size ())
-    {
-      set_parent (s, Y_AXIS);
-    }
-#endif
-  stems_.push (s);
+  Group_interface gi (this);
+  gi.add_element (s);
+  
   s->add_dependency (this);
 
-  assert (!s->beam_l_);
-  s->beam_l_ = this;
+  assert (!s->beam_l ());
+  s->set_elt_property ("beam", self_scm_);
 
   if (!spanned_drul_[LEFT])
     set_bounds (LEFT,s);
@@ -89,12 +101,12 @@ Beam::do_brew_molecule_p () const
   if (!sinfo_.size ())
     return mol_p;
   
-  Real x0 = stems_[0]->hpos_f ();
-  for (int j=0; j <stems_.size (); j++)
+  Real x0 = stem (0)->hpos_f ();
+  for (int j=0; j <stem_count (); j++)
     {
-      Stem *i = stems_[j];
-      Stem * prev = (j > 0)? stems_[j-1] : 0;
-      Stem * next = (j < stems_.size ()-1) ? stems_[j+1] :0;
+      Stem *i = stem (j);
+      Stem * prev = (j > 0)? stem (j-1) : 0;
+      Stem * next = (j < stem_count ()-1) ? stem (j+1) :0;
 
       Molecule sb = stem_beams (i, next, prev);
       Real  x = i->hpos_f ()-x0;
@@ -127,16 +139,16 @@ Beam::auto_knee (SCM gap, bool interstaff_b)
 {
   bool knee = false;
   int knee_y = 0;
-  Real internote_f = stems_[0]->staff_line_leading_f ()/2;
+  Real internote_f = stem (0)->staff_line_leading_f ()/2;
   if (gap != SCM_UNDEFINED)
     {
       int auto_gap_i = gh_scm2int (gap);
-      for (int i=1; i < stems_.size (); i++)
+      for (int i=1; i < stem_count (); i++)
         {
          bool is_b = (bool)(sinfo_[i].interstaff_f_ - sinfo_[i-1].interstaff_f_);
-         int l_y = (int)(stems_[i-1]->chord_start_f () / internote_f)
+         int l_y = (int)(stem (i-1)->chord_start_f () / internote_f)
            + (int)sinfo_[i-1].interstaff_f_;
-         int r_y = (int)(stems_[i]->chord_start_f () / internote_f)
+         int r_y = (int)(stem (i)->chord_start_f () / internote_f)
            + (int)sinfo_[i].interstaff_f_;
          int gap_i = r_y - l_y;
 
@@ -154,12 +166,12 @@ Beam::auto_knee (SCM gap, bool interstaff_b)
     }
   if (knee)
     {
-      for (int i=0; i < stems_.size (); i++)
+      for (int i=0; i < stem_count (); i++)
         {
-         int y = (int)(stems_[i]->chord_start_f () / internote_f)
+         int y = (int)(stem (i)->chord_start_f () / internote_f)
            + (int)sinfo_[i].interstaff_f_;
-         stems_[i]->set_direction ( y < knee_y ? UP : DOWN);
-         stems_[i]->set_elt_property ("dir-forced", SCM_BOOL_T);
+         stem (i)->set_direction ( y < knee_y ? UP : DOWN);
+         stem (i)->set_elt_property ("dir-forced", SCM_BOOL_T);
        }
     }
   return knee;
@@ -200,7 +212,7 @@ Beam::do_print () const
 void
 Beam::do_post_processing ()
 {
-  if (stems_.size () < 2)
+  if (stem_count () < 2)
     {
       warning (_ ("beam with less than two stems"));
       set_elt_property ("transparent", SCM_BOOL_T);
@@ -228,20 +240,15 @@ Beam::do_post_processing ()
   set_stemlens ();
 }
 
-void
-Beam::do_substitute_element_pointer (Score_element*o,Score_element*n)
-{
-  if (Stem * os = dynamic_cast<Stem*> (o))
-    stems_.substitute (os,
-                      dynamic_cast<Stem *> (n));
-}
 
+#if 0
 Interval
 Beam::do_width () const
 {
-  return Interval (stems_[0]->hpos_f (),
+  return Interval (stem (0)->hpos_f (),
                   stems_.top ()->hpos_f ());
 }
+#endif 
 
 Direction
 Beam::get_default_dir () const
@@ -252,9 +259,9 @@ Beam::get_default_dir () const
   count[UP]  = count[DOWN] = 0;
   Direction d = DOWN;
 
-  for (int i=0; i <stems_.size (); i++)
+  for (int i=0; i <stem_count (); i++)
     do {
-      Stem *s = stems_[i];
+      Stem *s = stem (i);
       int current = s->get_direction () 
        ? (1 + d * s->get_direction ())/2
        : s->get_center_distance ((Direction)-d);
@@ -313,9 +320,9 @@ void
 Beam::set_direction (Direction d)
 {
   Directional_spanner::set_direction (d);
-  for (int i=0; i <stems_.size (); i++)
+  for (int i=0; i <stem_count (); i++)
     {
-      Stem *s = stems_[i];
+      Stem *s = stem (i);
       s->set_elt_property ("beam-dir", gh_int2scm (d));
 
       SCM force = s->remove_elt_property ("dir-forced");
@@ -390,16 +397,16 @@ Beam::check_stemlengths_f (bool set_b)
 void
 Beam::set_steminfo ()
 {
-  if(!stems_.size ())
+  if(!stem_count ())
     return;
   
   assert (multiple_i_);
 
   int total_count_i = 0;
   int forced_count_i = 0;
-  for (int i=0; i < stems_.size (); i++)
+  for (int i=0; i < stem_count (); i++)
     {
-      Stem *s = stems_[i];
+      Stem *s = stem (i);
 
       s->set_default_extents ();
       if (s->invisible_b ())
@@ -416,9 +423,9 @@ Beam::set_steminfo ()
                                        + to_str (multiple_i_ <? stem_max));
     
   Real leftx = 0;
-  for (int i=0; i < stems_.size (); i++)
+  for (int i=0; i < stem_count (); i++)
     {
-      Stem *s = stems_[i];
+      Stem *s = stem (i);
       /*
        Chord tremolo needs to beam over invisible stems of wholes
       */
@@ -463,10 +470,10 @@ Beam::calculate_slope ()
       /*
        steep slope running against lengthened stem is suspect
       */
-      Real dx_f = stems_.top ()->hpos_f () - stems_[0]->hpos_f ();
+      Real dx_f = stem (stem_count () -1)->hpos_f () - stem (0)->hpos_f ();
 
       // urg, these y internote-y-dimensions
-      Real internote_f = stems_[0]->staff_line_leading_f ()/2;
+      Real internote_f = stem (0)->staff_line_leading_f ()/2;
 
       Real lengthened = paper_l ()->get_var ("beam_lengthened") / internote_f;
       Real steep = paper_l ()->get_var ("beam_steep_slope") / internote_f;
@@ -518,12 +525,12 @@ Beam::quantise_dy ()
   if (q == ly_symbol2scm ("none"))
     return;
 
-  Real interline_f = stems_[0]->staff_line_leading_f ();
+  Real interline_f = stem (0)->staff_line_leading_f ();
   Real internote_f = interline_f / 2;
   Real staffline_f = paper_l ()->get_var ("stafflinethickness");
   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
 
-  Real dx_f = stems_.top ()->hpos_f () - stems_[0]->hpos_f ();
+  Real dx_f = stem (stem_count () -1 )->hpos_f () - stem (0)->hpos_f ();
 
   // dim(y) = internote; so slope = (y/internote)/x
   Real dy_f = dx_f * abs (slope_f_ * internote_f);
@@ -571,7 +578,7 @@ Beam::quantise_left_y (bool extend_b)
        hang       straddle   sit        inter      hang
    */
 
-  Real space = stems_[0]->staff_line_leading_f ();
+  Real space = stem (0)->staff_line_leading_f ();
   Real internote_f = space /2;
   Real staffline_f = paper_l ()->get_var ("stafflinethickness");
   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
@@ -599,7 +606,7 @@ Beam::quantise_left_y (bool extend_b)
   // dim(left_y_) = internote
   Real dy_f = get_direction () * left_y_ * internote_f;
 
-  Real beamdx_f = stems_.top ()->hpos_f () - stems_[0]->hpos_f ();
+  Real beamdx_f = stem (stem_count () -1)->hpos_f () - stem (0)->hpos_f ();
   Real beamdy_f = beamdx_f * slope_f_ * internote_f;
 
   Array<Real> allowed_position;
@@ -659,12 +666,12 @@ void
 Beam::set_beaming (Beaming_info_list *beaming)
 {
   Direction d = LEFT;
-  for (int i=0; i  < stems_.size (); i++)
+  for (int i=0; i  < stem_count (); i++)
     {
       do
        {
-         if (stems_[i]->beams_i_drul_[d] < 0)
-           stems_[i]->beams_i_drul_[d] = beaming->infos_.elem (i).beams_i_drul_[d];
+         if (stem (i)->beams_i_drul_[d] < 0)
+           stem (i)->beams_i_drul_[d] = beaming->infos_.elem (i).beams_i_drul_[d];
        }
       while (flip (&d) != LEFT);
     }
@@ -674,18 +681,21 @@ Beam::set_beaming (Beaming_info_list *beaming)
 void
 Beam::do_add_processing ()
 {
-  for (int i=0; i < stems_.size () ; i++) 
+  for (int i=0; i < stem_count () ; i++) 
     {
       Direction d = LEFT;
       do {
-       multiple_i_ = multiple_i_ >? stems_[i]->beams_i_drul_[d];
+       multiple_i_ = multiple_i_ >? stem (i)->beams_i_drul_[d];
       } while ((flip (&d)) != LEFT);
     }
 
-  if (stems_.size ())
+  /*
+    Why?
+   */
+  if (stem_count ())
     {
-      stems_[0]->beams_i_drul_[LEFT] =0;
-      stems_.top()->beams_i_drul_[RIGHT] =0;
+      stem (0)->beams_i_drul_[LEFT] =0;
+      stem (stem_count () -1)->beams_i_drul_[RIGHT] =0;
     }
 }
 
index 6033cfe926b4dd0190dbc9233c06abfe2f63af05..ca967f0ee31008d67678bb3ffc9e38e50f2ae57d 100644 (file)
@@ -6,6 +6,7 @@
   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
       Jan Nieuwenhuizen <janneke@gnu.org>
 */
+#include "dimension-cache.hh"
 
 #include "bow.hh"
 #include "debug.hh"
@@ -51,13 +52,14 @@ Bow::center () const
    Ugh.  Control points are too crude measures.
  */
 Interval
-Bow::do_height () const
+Bow::dim_callback (Dimension_cache const* c) 
 {
   Interval iv;
-  Array<Offset> c (get_controls());
-  for (int i=0; i < c.size (); i++)
+  Bow * b = dynamic_cast<Bow*> (c->element_l ());
+  Array<Offset> p (b->get_controls());
+  for (int i=0; i < p.size (); i++)
     {
-      Real y = c[i][Y_AXIS];
+      Real y = p[i][Y_AXIS];
       iv.unite (Interval (y,y));
     }
   return iv;
@@ -92,7 +94,7 @@ Bow::get_encompass_offset_arr () const
 {
   Array<Offset> offset_arr;
   offset_arr.push (Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]));
-  offset_arr.push (Offset (do_width ().length () + dx_f_drul_[RIGHT],
+  offset_arr.push (Offset (spanner_length () + dx_f_drul_[RIGHT],
                      dy_f_drul_[RIGHT]));
                      
   return offset_arr;
index 1d6c6cb89103860179deb40d423f29eb09afc148..e4c518834c4a010b2731547987a2fd5561bcf43d 100644 (file)
@@ -29,7 +29,7 @@ Break_align_item::do_pre_processing()
     align_dir_ = RIGHT;
   
   flip (&align_dir_);
-  sort_elements ();
+
   Real interline= paper_l ()->get_var ("interline");   
   
   Link_array<Score_element> elems;
index 452fda6c671702c8025f392587f8a35d0a373e8b..2ec5e9c56904abb83a8b052d0795719514f838c0 100644 (file)
@@ -11,6 +11,7 @@
 /*
   CLEAN ME UP.
  */
+
 #include <ctype.h>
 #include "bar.hh"
 #include "clef-engraver.hh"
index 32a7d932739da3f72ac4ae5478bd42f60fed661a..838d06a808009c198c04437315f1b7422227c49a 100644 (file)
@@ -15,6 +15,7 @@
 #include "text-item.hh"
 #include "paper-score.hh"
 #include "dimension-cache.hh"
+#include "staff-side.hh"
 
 void
 Clef_item::do_pre_processing()
@@ -30,7 +31,7 @@ Clef_item::do_pre_processing()
   if (style == "transparent")
     {
       set_elt_property ("transparent", SCM_BOOL_T);
-      set_empty (true, X_AXIS);
+      set_empty (X_AXIS);
     }
 }
 
@@ -53,22 +54,21 @@ Clef_item::do_add_processing ()
       Text_item *g =0;
 
       SCM octave_dir = remove_elt_property ("octave-dir");
-      if (octave_dir != SCM_UNDEFINED)
+      if (isdir_b (octave_dir))
        {
-         Direction d = Direction (gh_scm2int (octave_dir));
          g = new Text_item;
+         Side_position_interface spi (g);
+         spi.set_axis (Y_AXIS);
+         
          pscore_l_->typeset_element (g);
       
          g->text_str_ = "8";
          g->set_elt_property ("style", gh_str02scm ("italic"));
          g->set_parent (this, Y_AXIS);
          g->set_parent (this, X_AXIS);   
-
+         g->set_elt_property ("direction", octave_dir);
+         
          add_dependency (g);   // just to be sure.
-
-         Real r = do_height ()[d] - g->extent (Y_AXIS)[-d];
-         g->dim_cache_[Y_AXIS]->set_offset (r);
-
          SCM my_vis = get_elt_property ("visibility-lambda");
          if (my_vis != SCM_UNDEFINED)
            g->set_elt_property ("visibility-lambda", my_vis);
index 47300e660ddf5b997ab27fa36030e4601aff4087..ca44c30e9d19c35a9c6f765b477a2a840b2debd7 100644 (file)
@@ -8,7 +8,7 @@ Real
 calc_interstaff_dist (Item const *item, Spanner const *span)
 {
   Real interstaff = 0.0; 
-  Graphical_element *common = item->common_refpoint (span, Y_AXIS);
+  Score_element *common = item->common_refpoint (span, Y_AXIS);
   Align_element * align = dynamic_cast<Align_element*> (common);
   if (align && align->axis() == Y_AXIS)
     {
@@ -18,18 +18,18 @@ calc_interstaff_dist (Item const *item, Spanner const *span)
 
       interstaff = align->threshold_interval_[MIN];
 
-      Graphical_element const * span_refpoint = span;
+      Score_element const * span_refpoint = span;
       while (span_refpoint->parent_l  (Y_AXIS) != common)
        span_refpoint = span_refpoint->parent_l (Y_AXIS);
 
-      Graphical_element const * note_refpoint = item;
+      Score_element const * note_refpoint = item;
       while (note_refpoint->parent_l (Y_AXIS) != common)
        note_refpoint = note_refpoint->parent_l (Y_AXIS);
 
       int span_prio =
-       align->get_priority ((Score_element*) dynamic_cast<Score_element const*> (span_refpoint));
+       align->get_count ((Score_element*) dynamic_cast<Score_element const*> (span_refpoint));
       int item_prio =
-       align->get_priority ((Score_element*) dynamic_cast<Score_element  const *> (note_refpoint));
+       align->get_count ((Score_element*) dynamic_cast<Score_element  const *> (note_refpoint));
 
       /*
        our staff is lower -> interstaff *= -1
index b7cf04207ab51be2a3d77eaf46161421b7608f9a..aacf58aadc0cc5ed7b115a1ba268968e814c89e8 100644 (file)
@@ -8,17 +8,18 @@
 
 #include "dimension-cache.hh"
 #include "parray.hh"
-#include "graphical-element.hh"
+#include "score-element.hh"
+
 
 Dimension_cache::Dimension_cache (Dimension_cache const &d)
 {
   init();
   callback_l_ = d.callback_l_;
-  empty_b_ = d.empty_b_;
   basic_offset_ = d.basic_offset_;
   extra_offset_ = d.extra_offset_;
   off_valid_b_ = d.off_valid_b_;
   off_callbacks_ = d.off_callbacks_;
+  parent_l_ = d.parent_l_;  
 }
 
 Dimension_cache::Dimension_cache ()
@@ -38,7 +39,6 @@ Dimension_cache::init()
   dim_.set_empty ();
   parent_l_ =0;
   valid_b_ = false;
-  empty_b_ = false;
   off_valid_b_ = false;
 }
 
@@ -127,38 +127,29 @@ Dimension_cache::common_refpoint (Dimension_cache const* s) const
   return (Dimension_cache*) common;
 }
 
-
-
-void
-Dimension_cache::set_empty (bool b)
+Interval
+Dimension_cache::point_dimension_callback (Dimension_cache const* )
 {
-  if (empty_b_ != b)
-    {
-      empty_b_ = b;
-      if (!empty_b_)
-       invalidate ();
-    }
-}  
+  return Interval (0,0);
+}
 
 Interval
 Dimension_cache::get_dim () const
 {
   Interval r;
-  if (empty_b_)
+  Dimension_cache *nc = ((Dimension_cache*)this);
+  if (!callback_l_)
     {
-      r.set_empty ();
-      return r;
+      nc->dim_.set_empty ();
     }
-      
-  if (!valid_b_)
+  else if (!valid_b_)
     {
-      Dimension_cache *nc = ((Dimension_cache*)this);
+
       nc->dim_= (*callback_l_ ) (nc);
       nc->valid_b_ = true;
     }
 
   r=dim_;
-
   return r;
 }
 
index 1ef4574bd9536a0f3be262159150b4029b71dec7..eb6b471fc6abd0ed1d79d0f207f7377e5aae3289 100644 (file)
@@ -1,4 +1,5 @@
 #include "directional-spanner.hh"
+#include "offset.hh"
 
 Direction
 Directional_spanner::get_default_dir() const
@@ -13,7 +14,7 @@ Directional_spanner::do_pre_processing()
     set_direction (get_default_dir());
 }
 
-
+#if 0
 Offset
 Directional_spanner::center () const
 {
@@ -21,3 +22,4 @@ Directional_spanner::center () const
   Offset o (w/2, 0);  
   return o;
 }
+#endif
index 8eda51a6d2fbea9720a1a57cda547e9c78e92430..6fc996328c41064c9939b7f6b543612ef7368ef0 100644 (file)
@@ -22,7 +22,8 @@ Dots::do_post_processing ()
   if (!dots_i_)
     {
       set_elt_property ("transparent", SCM_BOOL_T);
-      set_empty (true, X_AXIS, Y_AXIS);
+      set_empty (X_AXIS);
+      set_empty (Y_AXIS);
     }
   else
     {
index 513011d5c000c4dec55a9b47a055df78bd348b68..b9f4f487b5fa04a85fad093e1f723bad9e5ca58e 100644 (file)
@@ -10,7 +10,8 @@
   TODO: too complicated implementation.  Why the dx_drul?.
  */
 
-
+#
+#include "dimension-cache.hh"
 #include "box.hh"
 #include "debug.hh"
 #include "lookup.hh"
@@ -23,16 +24,11 @@ Extender_spanner::Extender_spanner ()
   : Directional_spanner ()
 {
   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
+  dim_cache_[Y_AXIS]->set_callback (Dimension_cache::point_dimension_callback);
 }
 
 
-Offset
-Extender_spanner::center () const
-{
-  Real dx = extent (X_AXIS).length ();
 
-  return Offset (dx / 2, 0);
-}
 
 Molecule*
 Extender_spanner::do_brew_molecule_p () const
@@ -51,11 +47,7 @@ Extender_spanner::do_brew_molecule_p () const
   return mol_p;
 }
 
-Interval
-Extender_spanner::do_height () const
-{
-  return Interval (0,0);
-}
+
 
 void
 Extender_spanner::do_post_processing ()
index 0df1e5085acb07836453f30bc07ee7fb2d64b6ca..9404eb1c691a3e30cab41552891ee57ad046b100 100644 (file)
@@ -3,12 +3,12 @@
 
 // thanks to GDBs wonderful casting abilities, we need these:
 Item*
-to_item (Graphical_element* g)
+to_item (Score_element* g)
 {
   return dynamic_cast<Item*>(g);
 }
 Spanner*
-to_spanner (Graphical_element*g)
+to_spanner (Score_element*g)
 {
   return dynamic_cast<Spanner*>(g);
 }
index d45ea19b34bcc0b36aec2dbc4dfc82ea7ee93091..172f26968f7fc03228a85f11f673ab68f11196e8 100644 (file)
@@ -82,15 +82,15 @@ Grace_position_engraver::do_pre_move_processing ()
   */
   if (align_l_ && !align_l_->supported_b ())
     {
-      Graphical_element * elt = align_l_->parent_l (X_AXIS);
+      Score_element * elt = align_l_->parent_l (X_AXIS);
       if (elt)
        return;
 
       warning (_("Unattached grace notes.  Attaching to last musical column."));
       Axis_group_element * ae = dynamic_cast<Axis_group_element*> (elt);
-      if (ae)
+      /*      if (ae)
        ae->remove_element (align_l_);
-      else if (elt)
+       else if (elt)*/
        align_l_->set_parent (0, X_AXIS);
       last_musical_col_l_->add_element (align_l_);
     }
index e0cfcaf1ef5f7deb2102de7213303bdf5059226a..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,130 +0,0 @@
-/*
-  axis-group.cc -- implement Graphical_axis_group
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "dimension-cache.hh"
-#include "interval.hh"
-#include "graphical-axis-group.hh"
-#include "axis-group-element.hh"
-#include "graphical-element.hh"
-#include "debug.hh"
-
-/** don't copy anything: an element can only be in one
-  Graphical_axis_group at one time. */
-Graphical_axis_group::Graphical_axis_group(Graphical_axis_group const&s)
-{
-  axes_[0] = s.axes_[0];
-  axes_[1] = s.axes_[1];
-  ordered_b_ = s.ordered_b_;
-}
-
-bool 
-Graphical_axis_group::contains_b (Graphical_element const *e) const
-{
-  return elem_l_arr_.find_l (e);
-}
-
-Interval
-Graphical_axis_group::extent (Axis axis) const
-{
-  Interval r;
-  for (int i=0; i < elem_l_arr_.size(); i++)
-    {
-      r.unite (elem_l_arr_[i]->extent (axis)
-              + elem_l_arr_[i]->relative_coordinate (this, axis)
-              );
-    }
-  return r;
-}
-
-void
-Graphical_axis_group::add_element (Graphical_element*e, Axis a1 , Axis a2)
-{
-  used_b_ =true;
-  e->used_b_ = true;
-
-  Axis as[2] = {
-    (a1 == NO_AXES) ? axes_[0] : a1,
-    (a2 == NO_AXES) ? axes_[1] : a2,    
-  };
-
-    
-  
-  for (int i = 0; i < 2; i++)
-    {
-      if (e->parent_l (as[i]))
-       continue;
-      
-      e->set_parent (this, as[i]);
-
-      //      e->dim_cache_[as[i]]->dependencies_l_arr_.push (dim_cache_[as[i]]);
-    }
-  assert (e->parent_l(Y_AXIS) == this || e->parent_l (X_AXIS) == this);
-  elem_l_arr_.push (e);
-}
-
-
-/**
-   ugr. duplication of functionality with remove_all ()
- */
-void
-Graphical_axis_group::remove_element (Graphical_element*e)
-{
-  assert (contains_b (e));
-  if (ordered_b_)
-    elem_l_arr_.substitute (e,0);
-  else
-    elem_l_arr_.unordered_substitute (e,0);
-
-  do_remove (e);
-}
-
-void
-Graphical_axis_group::do_remove (Graphical_element *e)
-{
-  for (int i=0; i<  2; i++)
-    {
-      Axis a=axes_[i];
-      if (e->parent_l (a) != this)
-       continue;
-      e->set_parent (0, a);
-      //      e->dim_cache_[a]->dependencies_l_arr_.clear ();
-    }
-}
-
-void
-Graphical_axis_group::remove_all ()
-{
-  for (int i=0; i < elem_l_arr_.size(); i++) 
-    do_remove (elem_l_arr_[i]);
-
-  elem_l_arr_.clear ();
-}
-
-
-void    
-Graphical_axis_group::do_print() const
-{
-#ifndef NPRINT
-  for (int i=0; i < elem_l_arr_.size(); i++) 
-    DEBUG_OUT << classname(elem_l_arr_[i]) << " ";
-#endif
-}
-
-Graphical_axis_group::Graphical_axis_group ()
-{
-  ordered_b_ = false;
-  axes_[0] = (Axis)-1 ; 
-  axes_[1] = (Axis)-1 ;
-}
-
-void
-Graphical_axis_group::set_axes (Axis a1, Axis a2)
-{
-  axes_[0] = a1 ; 
-  axes_[1] = a2 ;
-}
index 21a256bc3f1c2f22b9cabb27684249b6dd2f648f..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,156 +0,0 @@
-/*
-  graphical-element.cc -- implement Graphical_element
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "dimension-cache.hh"
-#include "graphical-element.hh"
-#include "graphical-axis-group.hh"
-#include "debug.hh"
-
-Graphical_element::Graphical_element ()
-{
-  dim_cache_[X_AXIS] = new Dimension_cache;
-  dim_cache_[Y_AXIS] = new Dimension_cache;
-  used_b_ = false;
-  init ();
-}
-
-Graphical_element::Graphical_element (Graphical_element const &s)
-{
-  dim_cache_[X_AXIS] = new Dimension_cache (*s.dim_cache_[X_AXIS]);
-  dim_cache_[Y_AXIS] = new Dimension_cache (*s.dim_cache_[Y_AXIS]);
-
-  used_b_ = true;
-  init ();
-} 
-
-void
-Graphical_element::init ()
-{
-  dim_cache_[X_AXIS]->elt_l_ = dim_cache_[Y_AXIS]->elt_l_ = this;  
-}
-
-
-void
-Graphical_element::translate_axis (Real y, Axis a)
-{
-  dim_cache_[a]->translate (y);
-}  
-
-Real
-Graphical_element::relative_coordinate (Graphical_element const*e, Axis a) const
-{
-  return dim_cache_[a]->relative_coordinate (e ? e->dim_cache_[a] : 0);
-}
-
-Graphical_element * 
-Graphical_element::common_refpoint (Graphical_element const* s, Axis a) const
-{
-  Dimension_cache *dim = dim_cache_[a]->common_refpoint (s->dim_cache_[a]);
-  if (!dim)
-    programming_error ("No  common reference point");
-  return  dim ? dim->element_l () : 0;
-}
-
-void
-Graphical_element::translate (Offset offset)
-{
-  translate_axis (offset[Y_AXIS], Y_AXIS);
-  translate_axis (offset[X_AXIS], X_AXIS);
-}
-
-
-void
-Graphical_element::set_empty (bool b, Axis a1, Axis a2)
-{
-  if (a1 != NO_AXES)
-    dim_cache_[a1]->set_empty (b);
-  if (a2 != NO_AXES)
-    dim_cache_[a2]->set_empty (b);
-}
-
-/**
-   Return true if empty in both A1  direction and A2 dir.
- */
-bool
-Graphical_element::empty_b (Axis a)
-{
-  return dim_cache_[a]->empty_b ();
-}
-
-Interval
-Graphical_element::extent (Axis a) const
-{
-  Dimension_cache const * d = dim_cache_[a];
-
-  if (d->empty_b ())
-    return Interval ();
-  
-  return d->get_dim ();
-}
-
-
-void
-Graphical_element::do_print () const
-{
-#ifndef NPRINT
-  DEBUG_OUT << '\n';
-#endif
-}
-
-void
-Graphical_element::invalidate_cache (Axis a)
-{
-  dim_cache_[a]->invalidate ();
-}
-
-Graphical_element*
-Graphical_element::parent_l (Axis a) const
-{
-  Dimension_cache*d= dim_cache_[a]->parent_l_;
-  return d ? d->elt_l_ : 0;
-}
-
-Graphical_element::~Graphical_element ()
-{
-  delete dim_cache_[X_AXIS];
-  delete dim_cache_[Y_AXIS];  
-}
-
-Graphical_element *
-Graphical_element::common_refpoint (Link_array<Graphical_element> gs, Axis a) const
-{
-  Dimension_cache * common = dim_cache_[a];
-  for (int i=0; i < gs.size (); i++)
-    {
-      common = common->common_refpoint (gs[i]->dim_cache_[a]);
-    }
-
-  return common->element_l ();
-}
-
-char const *
-Graphical_element::name () const
-{
-  return classname (this);
-}
-
-void
-Graphical_element::print () const
-{
-#ifndef NPRINT
-  DEBUG_OUT << classname (this) << "{\n";
-  do_print ();
-  DEBUG_OUT << "}\n";
-#endif
-}  
-
-void
-Graphical_element::set_parent (Graphical_element *g, Axis a)
-{
-  dim_cache_[a]->parent_l_ = g ? g->dim_cache_[a]: 0;
-}
diff --git a/lily/group-interface.cc b/lily/group-interface.cc
new file mode 100644 (file)
index 0000000..b91d50e
--- /dev/null
@@ -0,0 +1,53 @@
+/*   
+  group-interface.cc --  implement Group_interface
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+#include "group-interface.hh"
+#include "score-element.hh"
+
+Group_interface::Group_interface (Score_element* e)
+{
+  elt_l_ = e;
+  name_ = "elements";
+}
+
+
+Group_interface::Group_interface (Score_element *e, String s)
+{
+  elt_l_ =e;
+  name_ = s;
+} 
+bool
+Group_interface::supports_interface_b () 
+{
+  SCM el = elt_l_->get_elt_property (name_);
+
+  return el == SCM_EOL || gh_pair_p (el);
+}
+
+
+void
+Group_interface::add_element (Score_element*p) 
+{
+  elt_l_->set_elt_property (name_,
+                           gh_cons (p->self_scm_, elt_l_->get_elt_property (name_)));
+}
+
+int
+Group_interface::count ()
+{
+  return scm_ilength (elt_l_->get_elt_property ("name"));
+}
+
+void
+Group_interface::set_interface ()
+{
+  if (!supports_interface_b ())
+    {
+      elt_l_->set_elt_property (name_, SCM_EOL);
+    }
+}
index 9ea5c23de1d5366634f0af97581f3e69396b59bf..99293896dede11aadd21d668849e43e2379950ef 100644 (file)
@@ -14,6 +14,7 @@
 
 Hara_kiri_group_spanner::Hara_kiri_group_spanner()
 {
+  set_elt_property ("items-worth-living", SCM_EOL);
   set_axes(Y_AXIS,Y_AXIS);
 }
 
@@ -21,13 +22,16 @@ void
 Hara_kiri_group_spanner::add_interesting_item (Item* n)
 {
   add_dependency (n);
-  interesting_items_.push (n);
+  set_elt_property ("items-worth-living",
+                   gh_cons (n->self_scm_,
+                            get_elt_property ("items-worth-living")));
 }
 
 void 
 Hara_kiri_group_spanner::do_post_processing ()
 {
-  if (!interesting_items_.empty ())
+  SCM worth = get_elt_property ("items-worth-living");
+  if (worth != SCM_EOL && worth != SCM_UNDEFINED)
     return;
 
   Link_array<Score_element> childs = get_children ();
@@ -38,24 +42,13 @@ Hara_kiri_group_spanner::do_post_processing ()
       if ( line_l () != s->line_l ())
        programming_error ("Killing other children too");
       s->set_elt_property ("transparent", SCM_BOOL_T);
-      s->set_empty (true, X_AXIS, Y_AXIS);
+      s->set_empty (X_AXIS);
+      s->set_empty (Y_AXIS);
 
     }
-  set_empty (true);
-}
-
-void
-Hara_kiri_group_spanner::do_substitute_element_pointer (Score_element*o, Score_element*n)
-{
-  Axis_group_spanner::do_substitute_element_pointer (o,n);
-  if (Item *it = dynamic_cast<Item *> (o))
-    interesting_items_.substitute (it, dynamic_cast<Item *> (n));
+  set_empty (X_AXIS);
+  set_empty (Y_AXIS);  
 }
 
 
-void
-Hara_kiri_group_spanner::do_print () const
-{
-  Axis_group_spanner::do_print ();
-}
 
index 5d2fa9598eac96b925c92cb7521bb843e66edc03..411ab3670d48d366d7b02a80532965cd31d0d08e 100644 (file)
 #include "paper-column.hh"
 #include "paper-def.hh"
 #include "hyphen-spanner.hh"
+#include "dimension-cache.hh"
 
 Hyphen_spanner::Hyphen_spanner ()
   : Directional_spanner ()
 {
   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
-}
-
-// UGH - is this even used?
-Offset
-Hyphen_spanner::center () const
-{
-  Real dx = extent (X_AXIS).length ();
 
-  return Offset (dx / 2, 0);
+  dim_cache_[Y_AXIS]->set_callback (Dimension_cache::point_dimension_callback);
 }
 
 Molecule*
@@ -61,11 +55,6 @@ Hyphen_spanner::do_brew_molecule_p () const
   return mol_p;
 }
 
-Interval
-Hyphen_spanner::do_height () const
-{
-  return Interval (0,0);
-}
 
 void
 Hyphen_spanner::do_post_processing ()
index ff8dddf6f6121704cf406ae1bab1ba2198e3a7ac..f97b7c6162f4b6517445c977106275730eaa357d 100644 (file)
   document usage of this.
  */
 class Align_element : public virtual Axis_group_element {
-
-  /*
-   ugh. JUNKME
-
-  */
-  Hash_table<Score_element*,int> priority_i_hash_;
 public:
   Interval threshold_interval_ ;
 
@@ -49,20 +43,11 @@ public:
   Direction align_dir_;
   
   Axis axis () const;
-  Score_element * center_l_;
   
   Align_element ();
   void set_axis (Axis);
-  void add_element (Score_element*);
-  void add_element_priority (Score_element*, int);
-  bool contains_b (Score_element const*) const;
-
-  Score_element *get_elt_by_priority (int) const;
-  int get_priority (Score_element const*) const;
+  int get_count (Score_element*)const;
 protected:
-  void sort_elements ();
-  virtual void do_print() const;
-  virtual void do_substitute_element_pointer (Score_element*,Score_element*);
   virtual void do_post_processing() ;
   virtual void do_pre_processing ();
   virtual void do_side_processing ();
index ab81872b52b1b56afec7c9a947299e89eea552e4..d2ea0b96ea885cfc22073919e0cbd5d7e02245c2 100644 (file)
 #define AXIS_GROUP_ELEMENT_HH
 
 #include "score-element.hh"
-#include "graphical-axis-group.hh"
+
 
 /** 
   Treat a group of elements a unity in either or both axis sense .
   This is a wrapper around Axis_group_administration
   */
-class Axis_group_element : public virtual Score_element,
-                          public virtual Graphical_axis_group
+class Axis_group_element : public virtual Score_element
 {
   Link_array<Score_element> extra_elems_;
 
-protected:
-  virtual void do_print() const;
-  virtual Link_array<Score_element> get_extra_dependencies() const;
+  /// modify fields of E for removal.
+  void do_remove (Score_element*e);
   void purge_extra ();
 
-  virtual void do_substitute_element_pointer (Score_element*,Score_element*);
+
+
+protected:
+  virtual Link_array<Score_element> get_extra_dependencies() const;
   virtual Link_array<Score_element> elem_l_arr() const;
+  static Interval extent_callback (Dimension_cache const*);
   
-  virtual Interval do_height () const;
-  virtual Interval do_width () const;
 
 
   Interval extra_extent (Axis a) const;
-
 public:
-  /**
-    Override Graphical_axis_group::extent: make sure that
-    Graphical_element::extent() is used as the public entry point.  */
-  Interval extent (Axis a) const;
+  // keep array in order.
+  bool ordered_b_;             
+  Link_array<Score_element> elem_l_arr_;
+  Axis axes_[2];
+    
+  Interval my_extent (Axis) const;
+
+
+
+  bool contains_b (Score_element const *) const;
+  void add_element (Score_element*);
 
   /**
      add an element that only influences size, but does not have  X/Y parent
@@ -51,9 +56,9 @@ public:
 
 
   Axis_group_element ();
-  virtual void set_axes (Axis,Axis);
+  void set_axes (Axis,Axis);
 
-  virtual Link_array<Score_element> get_children ();
+  Link_array<Score_element> get_children ();
 };
 
 #endif // AXIS_GROUP_ELEMENT_HH
index b3701a15348025759f647929fec696386f9a3c88..8f59c298a2b625196d7fd9fb6a818c2dba9e7f1f 100644 (file)
@@ -21,8 +21,6 @@ class Axis_group_item : public virtual Axis_group_element,
                        public virtual Item {
 protected:
   virtual void do_breakable_col_processing();
-  void OK() const;
-  virtual void do_print() const;
 public:
   VIRTUAL_COPY_CONS(Score_element);
 };
index 0de8cc51efb3a6a2eaed60863454b14d2e21eadd..f81b7354c766fb4eded61dfc67dcc26743fd1585 100644 (file)
@@ -22,9 +22,6 @@ class Axis_group_spanner : public virtual Axis_group_element,
   void do_break_processing_if_unbroken();
 protected:
   virtual void do_break_processing();
-  virtual void do_print() const;
-  virtual Interval do_width () const;
-
 public:
   VIRTUAL_COPY_CONS(Score_element);
 };
index de68f6f99ca4936d8d0597da61756bf1e68e22ad..cfcc305e65fb45d43524f9b7d4c82611248d7e0a 100644 (file)
@@ -28,14 +28,10 @@ slope_quantisation: 'none, 'normal or 'traditional
 */
 class Beam : public Directional_spanner  {
 public:
-  /** 
-    The beams should be prevented to conflict with the stafflines, 
-    especially at small slopes.
-    */
-  enum Quantisation { NONE, NORMAL, TRADITIONAL };
-  enum Dir_algorithm { /* DOWN=-1, UP=1, */ MAJORITY=2, MEAN, MEDIAN };
-
-  Link_array<Stem> stems_;
+
+  int stem_count ()const;
+  Stem * stem (int )const;
+
   /**
      the slope of the beam in (staffpositions) per (X-dimension, in PT).
      UGH. standardise this for once and for all.
@@ -61,7 +57,6 @@ public:
   VIRTUAL_COPY_CONS(Score_element);
 
 protected:
-  virtual Interval do_width () const;    
   Offset center () const;
   Direction get_default_dir () const;
   void set_direction (Direction);
@@ -71,7 +66,6 @@ protected:
   
   virtual void do_pre_processing ();
   virtual void do_post_processing ();
-  virtual void do_substitute_element_pointer (Score_element*, Score_element*);
   virtual void do_add_processing ();
   virtual void do_print() const;
   virtual Molecule*do_brew_molecule_p () const;
index 58f7d5fb2cd552888afd5a0d7e3d277c167248dc..da2e7a3f1dde7273dee23b66f49a1bde966d9635 100644 (file)
@@ -33,7 +33,7 @@ protected:
   //  virtual Interval do_width () const;    
   Array<Offset> get_controls () const;
   virtual Array<Offset> get_encompass_offset_arr () const;
-  virtual Interval do_height () const;
+  static Interval dim_callback (Dimension_cache const*);
   Drul_array<Interval> curve_extent_drul () const;
 
   Drul_array<Real> dy_f_drul_;
index fc23932284e3b78a5d001024c8eb2ecb3c84231a..0a61bc2d74a79ddbbcd0eb2ff40356a492ce7723 100644 (file)
@@ -25,10 +25,6 @@ typedef Real (*Offset_cache_callback)(Dimension_cache const *);
 class Dimension_cache
 {
   bool valid_b_;
-  /** Is this element dimensionless?.
-    This is private to guarantee correctness of the cache
-   */
-  bool empty_b_;
   Interval dim_;
   /**
     The offset wrt. to the center of #parent_l_#
@@ -36,18 +32,19 @@ class Dimension_cache
 
   Real extra_offset_;
   Real basic_offset_;
-  
   bool off_valid_b_;
 
-  
-  Graphical_element *elt_l_;
-  Dim_cache_callback callback_l_;
-  friend class Graphical_element;
+  Score_element *elt_l_;
+  friend class Score_element;
 
   void init ();
 public:
   Array<Offset_cache_callback> off_callbacks_;
-  
+  /**
+     What to call to find extent.  Nil means empty. 
+   */
+  Dim_cache_callback callback_l_;
+  static Interval point_dimension_callback (Dimension_cache const* );
   Axis axis () const;
   Real get_offset () const;
   void set_callback (Dim_cache_callback);
@@ -56,7 +53,7 @@ public:
   void set_offset_callback (Offset_cache_callback);
   Dimension_cache * parent_l_;
 
-  Graphical_element *element_l () const { return elt_l_; }
+  Score_element *element_l () const { return elt_l_; }
 
   void invalidate ();
   void invalidate_dependencies ();
@@ -81,7 +78,7 @@ public:
   void set_offset (Real);
 
   bool valid_b () const { return valid_b_; }
-  bool empty_b() const { return empty_b_; }
+  bool empty_b() const;
   Interval get_dim () const;
 };
 
index e268b20b925e79238a8e708b07a62caaf0a5a343..779a5ed9f4eee8572bef6988aaf7405193372379 100644 (file)
@@ -17,7 +17,7 @@
 class Directional_spanner : public Spanner, public Directional_element {
 public:
   /// offset of "center" relative to left-column/0-pos of staff
-  virtual Offset center() const;
+  //  virtual Offset center() const;
   virtual Direction get_default_dir() const;
   VIRTUAL_COPY_CONS(Score_element);
 protected:
index 3da4095ebf88e39b3c4a1051168a75513f587f9d..e0268198e8c6c49b3da2b8e3b6f72cc16efce28f 100644 (file)
 class Extender_spanner : public Directional_spanner
 {
 public:
-Extender_spanner ();
-  Offset center () const;  
+  Extender_spanner ();
   void set_textitem (Direction, Item*);
 
 protected:
   virtual Molecule* do_brew_molecule_p () const;
-  Interval do_height () const;
-
   void do_post_processing ();
  
   VIRTUAL_COPY_CONS (Score_element);
index 539f8d95e48337ded838c0482f44782ba9bfb591..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,46 +0,0 @@
-/*
-  axis-group-administration.hh -- declare Graphical_axis_group
-
-  source file of the GNU LilyPond music typesetter
-
-  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef GRAPHICAL_AXIS_GROUP_HH
-#define GRAPHICAL_AXIS_GROUP_HH
-
-
-#include "parray.hh"
-#include "axes.hh"
-#include "real.hh"
-#include "lily-proto.hh"
-#include "graphical-element.hh"
-
-/**
-  Treat a group of graphical elements as an aggegrate.
- */
-class Graphical_axis_group : public virtual Graphical_element {
-private:
-
-  /// modify fields of E for removal.
-  void do_remove (Graphical_element*e);
-public:
-  // keep array in order.
-  bool ordered_b_;             
-  Link_array<Graphical_element> elem_l_arr_;
-  Axis axes_[2];
-    
-  Interval extent (Axis) const;
-  virtual void do_print() const;
-  Graphical_axis_group(Graphical_axis_group const&s);
-  Graphical_axis_group ();
-  virtual void set_axes (Axis,Axis);
-  void remove_all ();
-
-  bool contains_b (Graphical_element const *) const;
-  void add_element (Graphical_element*, Axis = NO_AXES, Axis = NO_AXES);
-  void remove_element (Graphical_element*);
-};
-
-#endif // Graphical_axis_group_HH
index eeb2582688e929c131373ee4c192b70f2301383f..eab17f40b730726ca6a76d04739b411208ce6211 100644 (file)
 #include "lily-proto.hh"
 #include "interval.hh"
 #include "virtual-methods.hh"
+#error
+
 
 /** The 2d geometric aspects of a score-element.
   */
 class Graphical_element 
 {
-  void init ();
-public:
-  Dimension_cache *dim_cache_[NO_AXES];
-
-  /**
-     Set this if anyone points to me, or if I point to anyone.
-   */
-  bool used_b_;
-  
-  char const * name () const;
-  /**
-     Set empty in direction a1 and a2.  If an argument is NO_AXES, it is ignored.
-   */
-  void set_empty (bool b, Axis a1 = NO_AXES, Axis a2 = NO_AXES);
-  bool empty_b (Axis a1);
-  Graphical_element ();
-  Graphical_element (Graphical_element const&);
-  virtual ~Graphical_element ();
-  
-  void invalidate_cache (Axis);
-  Interval extent (Axis) const;
-  /**
-    translate the symbol.
-    */
-  void translate (Offset);
-  /**
-    translate in one direction
-    */
-    
-  void translate_axis (Real, Axis);
-
-  Real relative_coordinate (Graphical_element const* refp, Axis) const;
-  /**
-    Find the group-element which has both #this# and #s#
-   */
-  Graphical_element*common_refpoint (Graphical_element const* s, Axis a) const;
-  Graphical_element*common_refpoint (Link_array<Graphical_element> elems, Axis a) const;
-
-  /**
-     Set the  parent refpoint of THIS to E
-   */
-  void set_parent (Graphical_element* e, Axis);
-  
-  Graphical_element *parent_l (Axis a) const;
-  
-  virtual void do_print () const;
-  virtual void print () const;  
 };
 
 #endif // GRAPHICAL_ELEMENT_HH
diff --git a/lily/include/group-interface.hh b/lily/include/group-interface.hh
new file mode 100644 (file)
index 0000000..06c20b1
--- /dev/null
@@ -0,0 +1,57 @@
+/*   
+  group-interface.hh -- declare Group_interface
+  
+  source file of the GNU LilyPond music typesetter
+  
+  (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  
+ */
+
+#ifndef GROUP_INTERFACE_HH
+#define GROUP_INTERFACE_HH
+
+#include "lily-proto.hh"
+#include "string.hh"
+#include "lily-guile.hh"
+#include "smobs.hh"
+
+struct Group_interface
+{
+  Score_element * elt_l_;
+  String name_;
+public:
+  Group_interface (Score_element*);
+  Group_interface (Score_element*, String);
+  int count ();
+  bool supports_interface_b ();
+  void set_interface ();
+  void add_element (Score_element*);
+};
+
+/*
+  template<class T>
+  Link_array<T> Group_interface__extract_elements (T *, String name);
+*/
+template<class T>
+Link_array<T>
+Group_interface__extract_elements (Score_element *elt, T *, String name)
+{
+  Link_array<T> arr;
+
+  for (SCM s = elt->get_elt_property (name); gh_pair_p (s); s = gh_cdr (s))
+    {
+      SCM e = gh_car (s);
+      assert (SMOB_IS_TYPE_B(Score_element,e));
+      Score_element* se = SMOB_TO_TYPE(Score_element, e);
+      arr.push (dynamic_cast<T*> (se));
+    }
+
+  arr.reverse ();
+  return arr;
+}
+
+
+
+
+#endif /* GROUP_INTERFACE_HH */
+
index 7479e90b29deb4d2f5f2d1942645e0c1eef32887..a6245449dd4046e4bda8e763244e7acc9638be80 100644 (file)
@@ -25,11 +25,6 @@ public:
   void add_interesting_item (Item* n);
 protected:
   VIRTUAL_COPY_CONS(Score_element);
-
-  virtual void do_substitute_element_pointer (Score_element*, Score_element*);
-  virtual void do_print ()const;
-
-  Link_array<Item> interesting_items_;
 };
 
 
index e1316252c9612d1622dde24dc6dd10f0e114fd2e..d7a15b6c00c11f5795c57a5e8c482d032cb7da7c 100644 (file)
@@ -22,7 +22,6 @@ class Hyphen_spanner : public Directional_spanner
 {
 public:
 Hyphen_spanner ();
-  Offset center () const;  
   void set_textitem (Direction, Item*);
 
 protected:
index be7d981d66c325ef4bf8561152dfddf77b1db7de..1c6135d999cbdbb3ff5fb1b187a18ac4a4893d8c 100644 (file)
@@ -46,6 +46,7 @@ public:
 
   /// I am really to be broken?
   bool breakable_b () const;
+  bool broken_b () const;
   bool broken_original_b () const;
   
   Direction break_status_dir () const;
@@ -65,8 +66,7 @@ public:
 protected:
   virtual void do_breakable_col_processing();
   virtual void handle_prebroken_dependencies();
-  virtual void do_print() const;
-  virtual void handle_prebroken_dependents ();
+  //virtual void handle_prebroken_dependents ();
 
   void copy_breakable_items();
 };
index 0970b575ddbfe86144a212e3dcc475bd53689a00..fae4e4d39827bde6f7f62edec2cf78fe337dd684 100644 (file)
@@ -95,8 +95,6 @@ struct Font_metric;
 struct General_script_def;
 struct Global_translator;
 struct Grace_align_item;
-struct Graphical_axis_group;
-struct Graphical_element;
 struct Hara_kiri_group_spanner;
 struct Hara_kiri_line_group_engraver;
 struct Head_column;
index 6d0bfa66342c6f705fe6ea92118c7f116092a774..a6b937a13fa4c37a562e008d35ae5b766a91dc55 100644 (file)
@@ -15,7 +15,6 @@
 class Line_of_score : public Axis_group_spanner, public Super_element
 {
 public:
-  Link_array<Paper_column> cols_;
   int rank_i_;
   
   Line_of_score();
@@ -23,15 +22,14 @@ public:
   /// is #c# contained in #*this#?
   bool contains_b (Paper_column const *c) const;
     
-  Line_of_score * set_breaking (Array<Column_x_positions> const&, int j);
   static int compare (Line_of_score* const &,Line_of_score* const &);
 
-  void output_all (bool last_line);
+  void break_into_pieces (Array<Column_x_positions> const&);
+  void output_lines ();
+  void output_line (bool last_line);
   void add_column (Paper_column*);
   
 protected:
-  virtual void do_substitute_element_pointer (Score_element*, Score_element*);
-  virtual Link_array<Score_element> get_extra_dependencies () const;
   virtual void do_print() const;
   VIRTUAL_COPY_CONS(Score_element);
 };
index 3becb118748a67fbc305a187bc724a648a4a74fb..308ff1c1eb5a17860a7a8aa0de44a829d1727e96 100644 (file)
@@ -25,7 +25,7 @@ protected:
   Molecule make_molecule () const;
 
   
-  virtual Interval do_width () const;
+  static  Interval dim_callback (Dimension_cache const*);
   virtual void do_pre_processing();
   virtual Molecule* do_brew_molecule_p() const;
 };
index 7fad9b8b3295d2ad7a732e057891c57dbc8b5308..3d33f133bcc633800b5045c5597cf824c1d51a52 100644 (file)
@@ -28,6 +28,9 @@ public:
   Paper_def *paper_l_;
 
   /// the columns, ordered left to right
+  /*
+    UGH. MOVE INTO LINE_OF_SCORE ?!
+   */
   Link_array<Paper_column> col_l_arr_;
 
   Paper_outputter *outputter_l_;  
@@ -35,6 +38,8 @@ public:
   
   Paper_score ();
 
+  void fixup_refpoints ();
+
 
   /// add to bottom of pcols
   void add_column (Paper_column*);
index 2f770ba431dd479eb3abd6fb9f86e9fa93437098..ed4bc4ba8de1bd422b5c6aca39c30864857647d3 100644 (file)
@@ -9,8 +9,8 @@
 
 #include "parray.hh"
 #include "virtual-methods.hh"
-#include "graphical-element.hh"
 #include "lily-guile.hh"
+#include "lily-proto.hh"
 #include "smobs.hh"
 
 typedef void (Score_element::*Score_element_method_pointer) (void);
@@ -34,7 +34,7 @@ Boolean (true iff defined)
  transparent -- do not calc. output
 
 */
-class Score_element : public virtual Graphical_element {
+class Score_element  {
   /**
      properties specific for this element. Destructor will not call
      scm_unprotect, so as to allow more flexible GC arrangements.  The
@@ -116,9 +116,7 @@ protected:
   int dependency_size () const;
   
   virtual void output_processing ();
-  virtual Interval do_height () const;
-  virtual Interval do_width () const;
-
+  static Interval molecule_extent (Dimension_cache const*);
 
   /// do printing of derived info.
   virtual void do_print () const;
@@ -138,37 +136,58 @@ protected:
     
   virtual void do_substitute_element_pointer (Score_element * , Score_element *);
   virtual void do_break_processing ();
-  virtual void handle_broken_dependencies ();
-  virtual void handle_prebroken_dependencies ();
-  virtual void handle_prebroken_dependents ();
-  virtual void handle_broken_dependents ();
+
   virtual Link_array<Score_element> get_extra_dependencies () const;
 
   static Interval dim_cache_callback (Dimension_cache const*);
 public:
+  virtual void handle_broken_dependencies ();
+  virtual void handle_prebroken_dependencies ();
+
 
   DECLARE_SMOBS;
-};
 
+  void init ();
+
+public:
+  Dimension_cache *dim_cache_[NO_AXES];
+
+  /**
+     Set this if anyone points to me, or if I point to anyone.
+   */
+  bool used_b_;
+  
+  char const * name () const;
+  /**
+     Set empty in direction A.
+   */
+  void set_empty (Axis a);
+  bool empty_b (Axis a) const;
+  void invalidate_cache (Axis);
+  Interval extent (Axis) const;
+  /**
+    translate in one direction
+    */
+    
+  void translate_axis (Real, Axis);
+
+  Real relative_coordinate (Score_element const* refp, Axis) const;
+  /**
+    Find the group-element which has both #this# and #s#
+   */
+  Score_element*common_refpoint (Score_element const* s, Axis a) const;
+  Score_element*common_refpoint (Link_array<Score_element> elems, Axis a) const;
+
+  /**
+     Set the  parent refpoint of THIS to E
+   */
+  void set_parent (Score_element* e, Axis);
+  
+  Score_element *parent_l (Axis a) const;
+  void fixup_refpoint ();
+};
 
-template<class T>
-void
-substitute_element_array (Link_array<T> &arr, Line_of_score * to)
-{
-  Link_array<T> newarr;
-  for (int i =0; i < arr.size (); i++)
-    {
-      T * t = arr[i];
-      if (t->line_l () != to)
-       {
-         t = dynamic_cast<T*> (t->find_broken_piece (to));
-       }
-      
-      if (t)
-       newarr.push (t);
-    }
-  arr = newarr;
-}
 
 
 
index 5f4f7e9d020d7c9f4eeeeaaf38040280fa994089..059a3ae7c8c4d1a09b671126b8048de63bca6e91 100644 (file)
 
 #include "spanner.hh"
 
-
 class Separating_group_spanner : public Spanner
 {
-  Link_array<Single_malt_grouping_item> spacing_unit_l_arr_;
 public:
-  /**
-     extra space to add after  postbreak. (FIXME).
-   */
-  Real padding_f_ ;
-  Separating_group_spanner ();
   void add_spacing_unit (Single_malt_grouping_item*);
+  Separating_group_spanner();
 protected:
   VIRTUAL_COPY_CONS(Score_element);
   virtual Array<Rod> get_rods () const;
-  virtual void do_substitute_element_pointer (Score_element*,Score_element*);
 };
 
 #endif /* SEPARATING_GROUP_SPANNER_HH */
index 2eb025b0475fb5f63e6c101e137dce42e9665f0f..27477b05bdbbcd4efd247027db30be980eb0709a 100644 (file)
 class Single_malt_grouping_item : public Item
 {
   VIRTUAL_COPY_CONS(Score_element);
-  Link_array<Item> item_l_arr_;
 public:
   Single_malt_grouping_item ();
   Interval my_width () const;
   void add_item (Item*);
-  
-protected:
-  virtual  void do_substitute_element_pointer (Score_element*, Score_element*);
-  virtual void do_print () const;
 };
 
+
 #endif /* SINGLE_MALT_GROUPING_ITEM_HH */
 
index 0b8b10586acb0c31c5f77151f84a11992697ec76..fb249675c38273ece2d744581e433b4ae9c12b67 100644 (file)
@@ -16,10 +16,10 @@ class Spacing_spanner : public Spanner
 {
 public:
   Spacing_spanner ();
+
   VIRTUAL_COPY_CONS(Score_element);
-  Score_column *scol (int) const;
-  Array<Spring> do_measure (int,int) const;
-  int col_count () const;
+  Array<Spring> do_measure (Link_array<Score_column>) const;
+
 protected:
   virtual  Array<Spring> get_springs () const;
 
index 9290b5ae357088852a4429254286d79f14f392ee..dad0191da4f11cc47845f05dedc32f249407b6c9 100644 (file)
@@ -34,10 +34,11 @@ public:
 protected:
   void evaluate_empty ();
 
-  virtual Interval do_width() const;
+  static Interval width_callback(Dimension_cache const*) ;
+  static Interval height_callback(Dimension_cache const*) ;  
+  
   virtual void do_pre_processing();
   virtual void do_post_processing();
-  virtual Interval do_height () const;
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
   virtual Molecule * do_brew_molecule_p() const;
 };
index 339280466640b8b7953bac84660047402faedd68..08c7f361f32e50d7f65fdc0465e6e36d4b69b1f1 100644 (file)
@@ -44,6 +44,7 @@ public:
   Spanner ();
   Spanner (Spanner const &);
   bool broken_b () const;
+  void do_break ();
 
   static int compare (Spanner * const &,Spanner * const &);
   virtual Array<Rod> get_rods () const;
@@ -62,10 +63,9 @@ protected:
   friend Axis_group_spanner; // UGH
 
   virtual void do_space_processing ();
-  void handle_broken_dependents ();
+  //  void handle_broken_dependents ();
   virtual void do_break_processing ();
-  virtual Interval do_width () const;
-  virtual void do_print () const;
+  Real spanner_length () const;
   virtual Line_of_score*line_l () const;
 };
 #endif
index 690cf1d3bc0e6dc0276dcf1d0f775196f0a64f24..42c1e002894c85eae0790e31748cee89fc0e428d 100644 (file)
@@ -24,8 +24,9 @@ public:
   static Real side_position (Dimension_cache const *);
   static Real self_alignment (Dimension_cache const *);
   static Real aligned_side (Dimension_cache const *);  
-  
+  static Real quantised_position (Dimension_cache const*);
   void set_axis (Axis);
+  void set_quantised (Axis);
   Axis get_axis () const;
   
   bool supported_b () const;
index f90fe8c1e33cf9df15eb1c2425644ff7b2ce66a6..e5f6751a75893eb40f792944cc5a07f06476ebb6 100644 (file)
  */
 class Staff_symbol_referencer : public virtual Score_element
 {
-  Real position_f_;
-  
-protected:
-  Staff_symbol * staff_symbol_l_;
-
 public:
   Staff_symbol_referencer ();
   void set_position (Real);
-  
-  void set_staff_symbol (Staff_symbol*);
+  static Real callback (Dimension_cache const*); 
+
   /**
      Leading are the lead strips between the sticks (lines) of
      typeface. ie. leading is vertical space.
-
    */
   Real staff_line_leading_f () const;
   Staff_symbol * staff_symbol_l () const;
   int lines_i () const;
-  virtual void do_substitute_element_pointer (Score_element*,Score_element*);
-  virtual void do_pre_processing ();
-  virtual Real position_f () const;
-
+  Real position_f () const;
 };
 
 #endif /* STAFF_SYMBOL_REFERENCER_HH */
index c15a1df10b3f9efba83baa358e6c81d6a7c21dc4..afe679d65b70ab1e8f9a5be34fe3bd1886ab579f 100644 (file)
@@ -26,7 +26,6 @@ public:
   int steps_i() const;
 protected:
   VIRTUAL_COPY_CONS(Score_element);
-  virtual Interval do_height () const;
   virtual Molecule* do_brew_molecule_p() const;
   virtual void do_print() const;
 };
index 617f2ed60410f32827cdd853d2329db256eb9f22..ef23aadfde82ec64d910386afabae784676d0471 100644 (file)
 
 
 class Stem_tremolo : public Item {
-  Stem * stem_l_;
 protected:
+  Stem * stem_l () const;
   virtual void do_print () const;
   virtual Molecule *do_brew_molecule_p () const;
-  virtual void do_substitute_element_pointer (Score_element*, Score_element*);
-  virtual Interval do_width () const;
-  virtual void do_pre_processing ();
+
+  static Interval dim_callback (Dimension_cache const*);
 public:
   int abbrev_flags_i_;
   Stem_tremolo ();
index 411848696b843cac8d8ba4db0e8df5da1d59a553..9fad0e51db1af3e1d304d69095682324bd8f14a7 100644 (file)
@@ -63,7 +63,7 @@ public:
     don't print flag when in beam.
     our beam, for aligning abbrev flags
    */
-  Beam* beam_l_;
+  Beam* beam_l () const;
 
   Drul_array<int> beams_i_drul_;
   Stem ();
@@ -100,7 +100,7 @@ protected:
   Molecule flag () const;
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
   virtual void do_pre_processing();
-  virtual Interval do_width() const;
+  static Interval dim_callback (Dimension_cache const*);
   virtual Molecule* do_brew_molecule_p() const;
 
   void set_spacing_hints () ;
index 636acf03bba2557444e2c0955c76de4ee7d76b8c..e3f30af740a1464617a72abba111658de7ae3a25 100644 (file)
@@ -32,7 +32,7 @@ protected:
   VIRTUAL_COPY_CONS (Score_element);
 
   virtual void do_add_processing ();
-  virtual Interval do_height () const;
+  static  Interval dim_callback (Dimension_cache const*);
   virtual void do_post_processing ();
   virtual void do_substitute_element_pointer (Score_element*,Score_element*);
 };
index eba020f52b8440a63922493cdfefac429123b4eb..283010a4bde992141dd54c282aab2d2c64a37ede 100644 (file)
@@ -5,8 +5,8 @@
 
   (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
-#include "dimension-cache.hh"
 
+#include "dimension-cache.hh"
 #include "paper-score.hh"
 #include "debug.hh"
 #include "item.hh"
@@ -29,12 +29,6 @@ Item::breakable_b () const
   return (i) ?  i->breakable_b () : get_elt_property( "breakable") != SCM_UNDEFINED;
 }
 
-void
-Item::do_print() const
-{
-}
-
-
 Real 
 Item::hpos_f() const
 {
@@ -44,7 +38,7 @@ Item::hpos_f() const
 Line_of_score *
 Item::line_l() const
 {
-  Graphical_element *g = parent_l (X_AXIS);
+  Score_element *g = parent_l (X_AXIS);
   if (!g)
     return 0;
   return dynamic_cast<Score_element *> (g)-> line_l ();
@@ -54,10 +48,6 @@ Item::line_l() const
 void
 Item::copy_breakable_items()
 {
-  if (broken_to_drul_[LEFT] || broken_to_drul_[RIGHT]
-      || !breakable_b ())
-    return ;
-
   Drul_array<Item *> new_copies;
   Direction  i=LEFT;
   do 
@@ -76,7 +66,6 @@ Item::copy_breakable_items()
        broken_to_drul_[i]->try_visibility_lambda();
     }
   while (flip(&i) != LEFT);
-  try_visibility_lambda ();
 }
 
 void
@@ -91,32 +80,49 @@ Item::try_visibility_lambda ()
       int empty = gh_scm2bool (gh_cdr (result));
 
       if (empty)
-       set_empty (true, X_AXIS, Y_AXIS);
+       {
+         set_empty (X_AXIS);
+         set_empty ( Y_AXIS);
+       }
       if (trans)
        set_elt_property ("transparent", SCM_BOOL_T);
     }
 }
 
+bool
+Item::broken_b () const
+{
+  return broken_to_drul_[LEFT] || broken_to_drul_[RIGHT];
+}
+
 void
 Item::do_break ()
 {
-  copy_breakable_items();
-  handle_prebroken_dependencies();
+  if (broken_b ())
+    return;
+
+  if (breakable_b ())
+    {
+      copy_breakable_items();
+      handle_prebroken_dependencies();
   
-  /*
+      /*
     Otherwise the broken items won't be pre_process()'ed.
   */
-  add_dependency (broken_to_drul_[LEFT]);
-  add_dependency (broken_to_drul_[RIGHT]);
+  
+      if (broken_to_drul_[LEFT])
+       {
+         add_dependency (broken_to_drul_[LEFT]);
+         add_dependency (broken_to_drul_[RIGHT]);
+       }
+    }
+  try_visibility_lambda ();    // ugh.
 }
 
 void
 Item::do_breakable_col_processing()
 {
-  if (breakable_b ())
-    do_break ();
-  else
-    try_visibility_lambda ();
+  do_break ();
 }
 
 Score_element*
@@ -124,10 +130,14 @@ Item::find_broken_piece (Line_of_score*l) const
 {
   if (line_l() == l) 
     return (Item*)(this);
-  else if (broken_to_drul_[LEFT] && broken_to_drul_[LEFT]->line_l() == l)
-    return broken_to_drul_[LEFT];
-  else if (broken_to_drul_[RIGHT] && broken_to_drul_[RIGHT]->line_l() == l)
-    return broken_to_drul_[RIGHT];
+
+  Direction d = LEFT;
+  do {
+    Score_element *s = find_broken_piece (d);
+    if (s && s->line_l () == l)
+      return s;
+  }
+  while (flip (&d) != LEFT);
 
   return 0;
 }
@@ -135,10 +145,14 @@ Item::find_broken_piece (Line_of_score*l) const
 Item*
 Item::find_broken_piece (Direction d) const
 {
+  Item * me = (Item *) (this); 
   if (!d)
-    return (Item *) (this);    // ugh
-  else
-    return dynamic_cast<Item*> (broken_to_drul_[d]);
+    return me;
+  else 
+    {
+      me->do_break ();
+      return dynamic_cast<Item*> (broken_to_drul_[d]);
+    }
 }
 
 void
@@ -174,7 +188,7 @@ Item::Item (Item const &s)
   broken_to_drul_[LEFT] = broken_to_drul_[RIGHT] =0;
 }
 
-
+#if 0
 void
 Item::handle_prebroken_dependents ()
 {
@@ -213,6 +227,7 @@ Item::handle_prebroken_dependents ()
       while ((flip (&d))!=LEFT);
     }
 }
+#endif
 
 Direction
 Item::break_status_dir () const
index 6e7d4f9eecf242e347a15f69eeef8abf6e2a90cc..20abc957b45668b481d6817892cb44547dfcfc74 100644 (file)
@@ -93,19 +93,10 @@ ly_parse_scm (char const* s, int* n)
 /*
   scm_m_quote doesn't use any env, but needs one for a good signature in GUILE.
 */
-// apparently env arg is ignored.
 SCM
 ly_quote_scm (SCM s)
 {
-#if 0
-  /*
-    This internal quote symbol breaks list->string and display,
-    and thus scm output.
-   */
-  return scm_m_quote (scm_cons2 (SCM_EOL, s, SCM_EOL) ,SCM_EOL);
-#else
   return gh_list (ly_symbol2scm ("quote"), s, SCM_UNDEFINED);
-#endif
 }
 
 
@@ -121,14 +112,6 @@ ly_symbol2string (SCM s)
   return String((Byte*)SCM_CHARS (s), (int) SCM_LENGTH(s));
 }
 
-#if 0
-SCM
-ly_set_x (String name, SCM val)
-{
-  return scm_sysintern ((char*)name.ch_C(), val);
-  
-}
-#endif
 
 /**
    Read a file, and shove it down GUILE.  GUILE also has file read
@@ -288,3 +271,5 @@ to_dir (SCM s)
 {
   return (Direction) gh_scm2int (s);
 }
+
+
index b648ea10c5822d970c494206671ddf54b9ff2e00..8d004831cd95e0da6b9a026dbbf22809cb1aebee 100644 (file)
 #include "paper-column.hh"
 #include "paper-score.hh"
 #include "warn.hh"
+#include "main.hh"
+#include "debug.hh"
 
 Line_of_score::Line_of_score()
 {
   set_axes (Y_AXIS,X_AXIS);
 }
 
-bool
-Line_of_score::contains_b (Paper_column const* c) const
+
+
+void
+Line_of_score::output_lines ()
 {
-  return cols_.find_l ((Paper_column*)(c));
+  for (int i=0; i < broken_into_l_arr_.size (); i++)
+    {
+      Line_of_score *line_l = dynamic_cast<Line_of_score*> (broken_into_l_arr_[i]);
+
+      *mlog << '[' << flush;
+      line_l->post_processing ();
+      *mlog << i << flush;
+      line_l->output_line (i + 1 == broken_into_l_arr_.size ());
+      *mlog << ']' << flush;
+    }
 }
 
 // const?
-Line_of_score*
-Line_of_score::set_breaking (Array<Column_x_positions> const &breaking, int j) 
+void
+Line_of_score::break_into_pieces (Array<Column_x_positions> const &breaking)
 {
-  const Link_array<Paper_column> &curline (breaking[j].cols_);
-  const Array<Real> &config (breaking[j].config_);
-  Line_of_score *line_l=0;
+  for (int i=0; i < breaking.size (); i++)
+    {
+      Line_of_score *line_l = dynamic_cast <Line_of_score*> (clone());
+      line_l->rank_i_ = i;
+      Link_array<Paper_column> c (breaking[i].cols_);
+      pscore_l_->typeset_element (line_l);
+      line_l->set_bounds(LEFT,c[0]);
+      line_l->set_bounds(RIGHT,c.top ());
+      for (int j=0; j < c.size(); j++)
+       {
+         c[i]->translate_axis (breaking[i].config_[j],X_AXIS);
+         c[i]->line_l_ = line_l;
+       }
+      
+      broken_into_l_arr_.push (line_l);
+    }
 
-  line_l = dynamic_cast <Line_of_score*> (clone());
-  line_l->rank_i_ = j;
-  
-  line_l->cols_ = curline;
-  line_l->set_bounds(LEFT,curline[0]);
-  line_l->set_bounds(RIGHT,curline.top());
-       
-  for (int i=0; i < curline.size(); i++)
+  for (int i=0; i < broken_into_l_arr_.size (); i++)
     {
-      curline[i]->translate_axis (config[i],X_AXIS);
-      curline[i]->line_l_ = dynamic_cast<Line_of_score*> (line_l);
+      broken_into_l_arr_[i]->handle_broken_dependencies ();
     }
 
-  broken_into_l_arr_.push (line_l);
-  return line_l;
+  handle_broken_dependencies ();
 }
 
 void
 Line_of_score::add_column (Paper_column*p)
 {
-  cols_.push (p);
+  set_elt_property ("columns",
+                   gh_cons (p->self_scm_, get_elt_property ("columns")));
   add_element (p);
 }
 
@@ -63,28 +81,12 @@ Line_of_score::do_print() const
   Axis_group_spanner::do_print ();
 }
 
-Link_array<Score_element>
-Line_of_score::get_extra_dependencies () const
-{
-  Link_array<Score_element> r (Axis_group_spanner::get_extra_dependencies ());
-  for (int i=0; i < cols_.size (); i++)
-    r.push (cols_[i]);
-  return r;
-}
-
-void
-Line_of_score::do_substitute_element_pointer (Score_element*o, Score_element*n)
-{
-  if (Paper_column *p = dynamic_cast<Paper_column*>(o))
-    cols_.substitute (p, dynamic_cast<Paper_column*>(n));
-}
-
 void
-Line_of_score::output_all (bool last_line)
+Line_of_score::output_line (bool last_line)
 {
   Interval i(extent(Y_AXIS));
   if (i.empty_b())
-    warning (_ ("Huh?  Empty Line_of_score?"));
+    programming_error ("Huh?  Empty Line_of_score?");
   else
     translate_axis (- i[MAX], Y_AXIS);
   
index 0f8bd3bc38b7c6b9414ef94a7dae525b01dc1150..844ad7701ad6e00371ecaf5e80487046c843e630 100644 (file)
@@ -157,13 +157,13 @@ Note_column::do_post_processing ()
   if (!stem_l_ || !rest_b ())
     return;
 
-  Beam * b = stem_l_->beam_l_;
-  if (!b || !b->stems_.size ())
+  Beam * b = stem_l_->beam_l ();
+  if (!b || !b->stem_count ())
     return;
   
   /* ugh. Should be done by beam. */
   Direction d = stem_l_->get_direction ();
-  Real beamy = (stem_l_->hpos_f () - b->stems_[0]->hpos_f ()) * b->slope_f_ + b->left_y_;
+  Real beamy = (stem_l_->hpos_f () - b->stem(0)->hpos_f ()) * b->slope_f_ + b->left_y_;
 
   Real staff_space = rest_l_arr_[0]->staff_line_leading_f ();      
   Real rest_dim = extent (Y_AXIS)[d]*2.0  /staff_space ;
index f8e9195607db8d576ef0cfd11cf07ab1e48c61a9..4a631d05153d78eb10450f47c464c441a9ece1bb 100644 (file)
 #include "molecule.hh"
 #include "musical-request.hh"
 #include "stem.hh"
+#include "dimension-cache.hh"
 
 void
 Note_head::flip_around_stem (Direction d)
 {
-  translate_axis (do_width ().length () * d, X_AXIS);
+  Real l= make_molecule ().dim_[X_AXIS].length ();
+  translate_axis (l * d, X_AXIS);
+}
+
+Interval
+Note_head::dim_callback (Dimension_cache const * c)
+{
+  Note_head* n = dynamic_cast<Note_head*> (c->element_l ());
+  return n->make_molecule ().dim_[X_AXIS];
 }
 
 Note_head::Note_head ()
 {
+  dim_cache_[X_AXIS]->callback_l_ = dim_callback;
 }
 
 void
@@ -56,14 +66,7 @@ Note_head::compare (Note_head *const  &a, Note_head * const &b)
   return sign(a->position_f () - b->position_f ());
 }
 
-/**
- Don't account for ledgerlines in the width.
- */
-Interval
-Note_head::do_width () const
-{
-  return make_molecule ().dim_[X_AXIS];
-}
+
 
 Molecule
 Note_head::make_molecule () const
index 7c5e0c26844884bed8961b33e42414238516ad70..1b2f4caa8f70a4babe2d2243bd3c2fdc84d5fde1 100644 (file)
@@ -132,11 +132,14 @@ Paper_column::column_l () const
 }
 
 /*
-  ugh.
+  ugh. JUNKME
  */
 void
 Paper_column::preprocess ()
 {
+  /*
+    JUNKME
+   */ 
   minimal_dists_arr_drul_[LEFT].sort (Column_rod::compare);
   minimal_dists_arr_drul_[RIGHT].sort (Column_rod::compare);  
   spring_arr_drul_[LEFT].sort (Column_spring::compare);
index e51b01cef39b821803337c41b1a4760dd6d81650..4a78ff3fb358ac223fdba3768a61cfd7c32af234 100644 (file)
@@ -114,13 +114,14 @@ Paper_score::process ()
   print ();
   *mlog << _ ("Preprocessing elements...") << " " << flush;
   line_l_->breakable_col_processing ();
+  fixup_refpoints ();
   line_l_->pre_processing ();
   
   *mlog << '\n' << _ ("Calculating column positions...") << " " << flush;
   line_l_->space_processing ();
 
   Array<Column_x_positions> breaking = calc_breaking ();
-
+  line_l_->break_into_pieces (breaking);
 
   outputter_l_ = new Paper_outputter ;
   outputter_l_->output_header ();
@@ -154,30 +155,10 @@ Paper_score::process ()
    */
   SCM before_output = outputter_l_->last_cons_;
   
-  Link_array<Line_of_score> lines;
-  for (int i=0; i < breaking.size (); i++)
-    {
-      Line_of_score *line_l = line_l_->set_breaking (breaking, i);
-      lines.push (line_l);
-      if (line_l != line_l_)
-       typeset_element (line_l);
-    }
 
+  fixup_refpoints ();
+  line_l_->output_lines ();
 
-  *mlog << "\n";
-  *mlog << _ ("Line ... ");
-  line_l_->break_processing ();
-  for (int i=0; i < lines.size (); i++)
-    {
-      *mlog << '[' << flush;
-      
-      Line_of_score *line_l = lines[i];
-
-      line_l->post_processing ();
-      *mlog << i << flush;
-      line_l->output_all (i + 1 == lines.size ());
-      *mlog << ']' << flush;
-    }
 
   SCM font_names = ly_quote_scm (all_fonts_global_p->font_descriptions ());
   gh_set_cdr_x (before_output,
@@ -222,3 +203,18 @@ Paper_score::broken_col_range (Item const*l, Item const*r) const
 
   return ret;
 }
+
+
+void
+Paper_score::fixup_refpoints ()
+{
+  for (SCM s = element_smob_list_; gh_pair_p (s); s = gh_cdr (s))
+    {
+      SCM e = gh_car (s);
+      if (SMOB_IS_TYPE_B(Score_element, e))
+       {
+         Score_element * se = SMOB_TO_TYPE (Score_element,e );
+         se->fixup_refpoint ();
+       }
+    }
+}
index 52c0149bcee8559fdebc2fa2ea1cb657c87cd3ce..0b065747bb058f301a988e5fc00354e0ddead3f7 100644 (file)
@@ -138,6 +138,7 @@ Rest_collision::do_substitute_element_pointer (Score_element*o,Score_element*n)
 Rest_collision::Rest_collision()
 {
   set_elt_property ("transparent", SCM_BOOL_T);
-  set_empty (true, X_AXIS, Y_AXIS);
+  set_empty (X_AXIS);
+  set_empty (Y_AXIS);
 }
 
index b87027a0c8dc7c08f22a91fbbaa493211172297a..e8b5154c81c7c48ee3eaba945cafd1c9f71e626f 100644 (file)
 #include "paper-outputter.hh"
 #include "dimension-cache.hh"
 #include "staff-side.hh"
-
-Interval
-Score_element::dim_cache_callback (Dimension_cache const*c)
-{
-  Score_element *  e =dynamic_cast<Score_element*> (c->element_l());
-  if(e->dim_cache_[X_AXIS] == c)
-    return e->do_width ();
-  else
-    return e->do_height ();
-}
+#include "item.hh"
 
 
 Score_element::Score_element()
 {
   output_p_ =0;
-  dim_cache_[X_AXIS]->set_callback (dim_cache_callback);
-  dim_cache_[Y_AXIS]->set_callback (dim_cache_callback); 
+  dim_cache_[X_AXIS] = new Dimension_cache;
+  dim_cache_[Y_AXIS] = new Dimension_cache;
+  dim_cache_[X_AXIS]->elt_l_ = dim_cache_[Y_AXIS]->elt_l_ = this;
+  
+  used_b_ = false;
+
+  dim_cache_[X_AXIS]->set_callback (molecule_extent);
+  dim_cache_[Y_AXIS]->set_callback (molecule_extent); 
   used_b_ = false;
   pscore_l_=0;
   lookup_l_ =0;
@@ -53,9 +50,25 @@ Score_element::Score_element()
   smobify_self ();
 }
 
+SCM ly_deep_copy (SCM);
+
+SCM
+ly_deep_copy (SCM l)
+{
+  if (gh_pair_p (l))
+    {
+      return gh_cons (ly_deep_copy (gh_car (l)), ly_deep_copy (gh_cdr (l)));
+    }
+  else
+    return l;
+}
+
+
 Score_element::Score_element (Score_element const&s)
-  : Graphical_element (s)
 {
+  dim_cache_[X_AXIS] = new Dimension_cache (*s.dim_cache_[X_AXIS]);
+  dim_cache_[Y_AXIS] = new Dimension_cache (*s.dim_cache_[Y_AXIS]);
+  dim_cache_[X_AXIS]->elt_l_ = dim_cache_[Y_AXIS]->elt_l_ = this;
   
   self_scm_ = SCM_EOL;
   used_b_ = true;
@@ -64,7 +77,7 @@ Score_element::Score_element (Score_element const&s)
   /*
     should protect because smobify_self () might trigger GC.
    */
-  element_property_alist_ = scm_protect_object (scm_list_copy (s.element_property_alist_));
+  element_property_alist_ = scm_protect_object (ly_deep_copy (s.element_property_alist_));
   dependency_arr_ = s.dependency_arr_;
   output_p_ =0;
   status_i_ = s.status_i_;
@@ -72,6 +85,8 @@ Score_element::Score_element (Score_element const&s)
   pscore_l_ = s.pscore_l_;
 
   smobify_self ();
+
+  
 }
 
 Score_element::~Score_element()
@@ -79,6 +94,9 @@ Score_element::~Score_element()
   assert (!output_p_);
   assert (status_i_ >=0);
   status_i_  = -1;
+
+  delete dim_cache_[X_AXIS];
+  delete dim_cache_[Y_AXIS];  
 }
 
 Score_element*
@@ -139,42 +157,27 @@ Score_element::set_elt_property (String k, SCM v)
 }
 
 Interval
-Score_element::do_width() const 
+Score_element::molecule_extent(Dimension_cache const *c)
 {
-  Interval r;
-
-  Molecule*m = output_p_ ?  output_p_ : do_brew_molecule_p();
-  r = m->extent().x ();
-
-  if (!output_p_)
-    delete m;
-  
-  return r;
+  Score_element *s = dynamic_cast<Score_element*>(c->element_l());
+  Molecule*m = s->do_brew_molecule_p();
+  return  m->extent()[c->axis ()];
 }
 
-Interval
-Score_element::do_height() const 
-{
-  Interval r;
-  Molecule*m = output_p_ ?  output_p_ : do_brew_molecule_p();
-  r = m->extent().y ();
-  if (!output_p_)
-    delete m;
-
-  return r;
-}
 
 void
 Score_element::print() const
 {
 #ifndef NPRINT
   DEBUG_OUT << classname(this) << "{\n";
+  
+  
   if (flower_dstream && !flower_dstream->silent_b ("Score_element"))
     ly_display_scm (element_property_alist_);
+
   DEBUG_OUT << "dependencies: " << dependency_size();
   if (original_l_)
     DEBUG_OUT << "Copy ";
-  Graphical_element::do_print ();
   do_print();
   
   DEBUG_OUT <<  "}\n";
@@ -330,7 +333,9 @@ Score_element::do_substitute_element_pointer (Score_element*,Score_element*)
 Molecule*
 Score_element::do_brew_molecule_p() const
 {
-  Molecule a (lookup_l ()->fill (Box (Interval (0,0), Interval (0,0))));
+  Interval emp;
+  emp.set_empty ();
+  Molecule a (lookup_l ()->fill (Box (emp,emp)));
   return new Molecule (a);
 }
 
@@ -372,7 +377,9 @@ Score_element::handle_broken_smobs (SCM s, SCM criterion)
     {
       Score_element *sc = SMOB_TO_TYPE (Score_element, s);
 
-      if (gh_number_p (criterion))
+      if (criterion == SCM_UNDEFINED)
+       return SCM_UNDEFINED;
+      else if (gh_number_p (criterion))
        {
          Item * i = dynamic_cast<Item*> (sc);
          Direction d = to_dir (criterion);
@@ -387,12 +394,14 @@ Score_element::handle_broken_smobs (SCM s, SCM criterion)
          Score_element * ln = SMOB_TO_TYPE (Score_element, criterion);
          Line_of_score * line = dynamic_cast<Line_of_score*> (ln);
          Score_element * br =0;
-         if (sc->line_l () != line)
+         Line_of_score * dep_line = sc->line_l ();
+         if (dep_line != line)
            {
              br = sc->find_broken_piece (line);
              return  (br) ?  br->self_scm_ : SCM_UNDEFINED;
            }
-
+         if (!dep_line)
+           return SCM_UNDEFINED;
        }
     }
   else if (gh_pair_p (s))
@@ -402,6 +411,9 @@ Score_element::handle_broken_smobs (SCM s, SCM criterion)
       */
       gh_set_car_x (s, handle_broken_smobs (gh_car (s), criterion));
       gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), criterion));
+
+      if (gh_car (s) == SCM_UNDEFINED)
+       return gh_cdr (s);
     }
   return s;
 }
@@ -410,11 +422,11 @@ void
 Score_element::handle_broken_dependencies()
 {
   Line_of_score *line  = line_l();
+  element_property_alist_ = handle_broken_smobs (element_property_alist_,
+                                                line ? line->self_scm_ : SCM_UNDEFINED);
   if (!line)
     return;
 
-  element_property_alist_ = handle_broken_smobs (element_property_alist_,
-                                                line->self_scm_);
 
   Link_array<Score_element> new_deps;
 
@@ -431,7 +443,6 @@ Score_element::handle_broken_dependencies()
        new_deps.push (elt);
     }
   dependency_arr_ = new_deps;
-
 }
 
 
@@ -479,6 +490,7 @@ Score_element::handle_prebroken_dependencies()
       substitute_dependency (old_arr[i], new_arr[i]);
 }
 
+#if 0
 void
 Score_element::handle_prebroken_dependents()
 {
@@ -488,6 +500,7 @@ void
 Score_element::handle_broken_dependents()
 {
 }
+#endif
 
 
 
@@ -509,8 +522,6 @@ Score_element::do_print () const
 {
 }
 
-
-
 Score_element*
 Score_element::find_broken_piece (Line_of_score*) const
 {
@@ -535,8 +546,23 @@ Score_element::print_smob (SCM s, SCM port, scm_print_state *)
      
   scm_puts ("#<Score_element ", port);
   scm_puts ((char *)sc->name (), port);
-  scm_puts ("properties = ", port);
-  scm_display (sc->element_property_alist_, port);
+#if 0
+  for (SCM s = sc->element_property_alist_; gh_pair_p (s); s = gh_cdr (s))
+    {
+      scm_display (gh_caar(s), port);
+      SCM val = gh_cdar(s);
+      if (SMOB_IS_TYPE_B (Score_element, val))
+       {
+         scm_puts ("#<:", port);
+         scm_puts ((SMOB_TO_TYPE(Score_element,val))->name(), port);
+         scm_puts (">", port);
+       }
+      else
+       scm_display (val, port);      
+    }
+#endif
+  // scm_puts (" properties = ", port);
+  // scm_display (sc->element_property_alist_, port);
   scm_puts (" >", port);
   return 1;
 }
@@ -555,3 +581,121 @@ Score_element::equal_p (SCM a, SCM b)
   return SCM_CDR(a) == SCM_CDR(b) ? SCM_BOOL_T : SCM_BOOL_F;
 }
 
+void
+Score_element::translate_axis (Real y, Axis a)
+{
+  dim_cache_[a]->translate (y);
+}  
+
+Real
+Score_element::relative_coordinate (Score_element const*e, Axis a) const
+{
+  return dim_cache_[a]->relative_coordinate (e ? e->dim_cache_[a] : 0);
+}
+
+Score_element * 
+Score_element::common_refpoint (Score_element const* s, Axis a) const
+{
+  Dimension_cache *dim = dim_cache_[a]->common_refpoint (s->dim_cache_[a]);
+  if (!dim)
+    programming_error ("No  common reference point");
+  return  dim ? dim->element_l () : 0;
+}
+
+void
+Score_element::set_empty (Axis a)
+{
+  dim_cache_[a]->callback_l_ =0;
+}
+
+bool
+Score_element::empty_b (Axis a)const
+{
+  return !dim_cache_[a]->callback_l_;
+}
+
+Interval
+Score_element::extent (Axis a) const
+{
+  Dimension_cache const * d = dim_cache_[a];
+
+  return d->get_dim ();
+}
+
+
+
+
+/*
+  JUNKME
+ */
+void
+Score_element::invalidate_cache (Axis a)
+{
+  dim_cache_[a]->invalidate ();
+}
+
+Score_element*
+Score_element::parent_l (Axis a) const
+{
+  Dimension_cache*d= dim_cache_[a]->parent_l_;
+  return d ? d->elt_l_ : 0;
+}
+
+Score_element *
+Score_element::common_refpoint (Link_array<Score_element> gs, Axis a) const
+{
+  Dimension_cache * common = dim_cache_[a];
+  for (int i=0; i < gs.size (); i++)
+    {
+      common = common->common_refpoint (gs[i]->dim_cache_[a]);
+    }
+
+  return common->element_l ();
+}
+
+char const *
+Score_element::name () const
+{
+  return classname (this);
+}
+
+
+void
+Score_element::set_parent (Score_element *g, Axis a)
+{
+  dim_cache_[a]->parent_l_ = g ? g->dim_cache_[a]: 0;
+}
+
+void
+Score_element::fixup_refpoint ()
+{
+  for (int a = X_AXIS; a < NO_AXES; a ++)
+    {
+      Axis ax = (Axis)a;
+      Score_element * par = parent_l (ax);
+
+      if (!par)
+       continue;
+      
+      if (par->line_l () != line_l ())
+       {
+         Score_element * newpar = par->find_broken_piece (line_l ());
+         set_parent (newpar, ax);
+       }
+
+      if (Item * i  = dynamic_cast<Item*> (this))
+       {
+         Item *pari = dynamic_cast<Item*> (par);
+
+         if (pari && i)
+           {
+             Direction  my_dir = i->break_status_dir () ;
+             if (my_dir!= pari->break_status_dir())
+               {
+                 Item *newpar =  pari->find_broken_piece (my_dir);
+                 set_parent (newpar, ax);
+               }
+           }
+       }
+    }
+}
index a959550a7719af26c8f4adbbdac54ccb29a6cf78..cde149793f4e4b721691dd8fdd2c677d5a48a462 100644 (file)
@@ -84,6 +84,9 @@ Script_engraver::do_process_requests()
       if (!follow_staff && ! xaxis)
        p->set_elt_property ("staff-support", SCM_BOOL_T);
 
+      if (!xaxis && follow_staff)
+       stafy.set_quantised (Y_AXIS);
+      
       p->set_elt_property ("script-priority", priority);
   
       script_p_arr_.push (p);
index f523de37bb310d151545aedb4d5bbf50bfc8d997..430b03acfe385711c9486e82106729dc5564982e 100644 (file)
@@ -1,5 +1,5 @@
 /*   
-     script.cc --  implement Script
+  script.cc --  implement Script
   
   source file of the GNU LilyPond music typesetter
   
@@ -44,7 +44,7 @@ Script::do_pre_processing ()
   /*
     center my self on the note head.
    */
-  Graphical_element * e = parent_l(X_AXIS);
+  Score_element * e = parent_l(X_AXIS);
   translate_axis (e->extent (X_AXIS).center (), X_AXIS);
 }
 
index a07381b61526926e87fc9e421215251fd0043ee9..4da73f8dbc9811d6e07a32352aa6f4ad0a5950e3 100644 (file)
@@ -37,20 +37,27 @@ Separating_group_spanner::get_rods () const
 {
   Array<Rod> a;
   
-  for (int i=0; i < spacing_unit_l_arr_.size () -1; i++)
+  for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
     {
-      Single_malt_grouping_item *l =spacing_unit_l_arr_[i];
+      SCM elt = gh_car (s);
+      if (!SMOB_IS_TYPE_B(Score_element, elt))
+       continue;
+
+      SCM next_elt = gh_cadr (s);
+      if (!SMOB_IS_TYPE_B(Score_element, next_elt))
+       continue;
+
+      Single_malt_grouping_item *l = dynamic_cast<Single_malt_grouping_item*> (SMOB_TO_TYPE(Score_element, elt));
       Single_malt_grouping_item *lb
        = dynamic_cast<Single_malt_grouping_item*>(l->find_broken_piece (RIGHT));
-      Single_malt_grouping_item *r = spacing_unit_l_arr_[i+1];
+      Single_malt_grouping_item *r = dynamic_cast<Single_malt_grouping_item*> (SMOB_TO_TYPE(Score_element, next_elt));
       Single_malt_grouping_item *rb
        = dynamic_cast<Single_malt_grouping_item*>(r->find_broken_piece (LEFT));
       
-      a.push (make_rod(spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
+      a.push (make_rod(l,  r));
       if (lb)
        {
          Rod rod(make_rod (lb, r));
-         rod.distance_f_ += padding_f_;
          a.push (rod);
        }
       
@@ -62,7 +69,6 @@ Separating_group_spanner::get_rods () const
       if (lb && rb)
        {
          Rod rod(make_rod (lb, rb));
-         rod.distance_f_ += padding_f_;
          a.push (rod);
        }
     }
@@ -73,22 +79,14 @@ Separating_group_spanner::get_rods () const
 void
 Separating_group_spanner::add_spacing_unit (Single_malt_grouping_item*i)
 {
-  spacing_unit_l_arr_.push (i);
+  set_elt_property ("elements",
+                   gh_cons (i->self_scm_,
+                            get_elt_property ("elements")));
   add_dependency (i);
 }
 
-void
-Separating_group_spanner::do_substitute_element_pointer (Score_element*o,
-                                                        Score_element*n)
-{
-  if (dynamic_cast<Single_malt_grouping_item *> (o))
-    {
-      Single_malt_grouping_item*ns = dynamic_cast<Single_malt_grouping_item *> (n);
-      spacing_unit_l_arr_.substitute (dynamic_cast<Single_malt_grouping_item *> (o), ns);
-    }
-}
 
-Separating_group_spanner::Separating_group_spanner()
+Separating_group_spanner::Separating_group_spanner ()
 {
-  padding_f_ =0.0;
+  set_elt_property ("elements", SCM_EOL);
 }
index b48a0e7689bc840032fa64887522e4d7fbf9dee4..b2ae354ab9752613a3ca22b6d025cb1fc587a7db 100644 (file)
@@ -31,16 +31,6 @@ Separating_line_group_engraver::do_creation_processing ()
 void
 Separating_line_group_engraver::do_removal_processing ()
 {
-  SCM sz (get_property ("postBreakPadding", 0));
-  if (gh_number_p(sz))
-    {
-      sep_span_p_->padding_f_ = Real(sz);
-    }
-  else
-    {
-      sep_span_p_->padding_f_ = paper_l ()->get_realvar (ly_symbol2scm ("postBreakPadding"));
-    }
-
   sep_span_p_->set_bounds (RIGHT, get_staff_info ().command_pcol_l ());
   typeset_element (sep_span_p_);
   sep_span_p_ =0;
index 39fcd793aa376bcef6642627c576b4dc5457f773..4a9a9d929efcb3daf86eaf7f0284b3eeb0eab947 100644 (file)
 Single_malt_grouping_item ::Single_malt_grouping_item()
 {
   set_elt_property ("transparent", SCM_BOOL_T);
+  set_elt_property ("elements", SCM_EOL);
 
   // this is weird! , but needed!
-  set_empty (true, X_AXIS, Y_AXIS);
+  set_empty (X_AXIS);
+  set_empty ( Y_AXIS);
 
 }
 
@@ -24,7 +26,10 @@ void
 Single_malt_grouping_item::add_item (Item* i)
 {
   assert (i);
-  item_l_arr_.push (i);
+  set_elt_property ("elements",
+                   gh_cons (i->self_scm_,
+                            get_elt_property ("elements")));
+
   add_dependency (i);
 }
 
@@ -33,9 +38,16 @@ Single_malt_grouping_item::my_width () const
 {
   Paper_column * pc = column_l ();
   Interval w;
-  for (int i=0; i < item_l_arr_.size (); i++)
+  
+  for (SCM s = get_elt_property ("elements"); gh_pair_p (s); s = gh_cdr (s))
     {
-      Item *il = item_l_arr_[i];
+      SCM elt = gh_car (s);
+      if (!SMOB_IS_TYPE_B(Score_element, elt))
+       continue;
+
+      
+      
+      Item *il = dynamic_cast<Item*> (SMOB_TO_TYPE (Score_element, elt));
       if (pc != il->column_l ())
        {
          /* this shouldn't happen, but let's continue anyway. */
@@ -57,25 +69,3 @@ Single_malt_grouping_item::my_width () const
 
 
 
-void
-Single_malt_grouping_item::do_substitute_element_pointer (Score_element*o,
-                                                         Score_element*n)
-{
-  if (dynamic_cast <Item *> (o))
-    {
-      item_l_arr_.unordered_substitute (dynamic_cast <Item *> (o),
-                                       dynamic_cast <Item *> (n));
-    }
-}
-
-void
-Single_malt_grouping_item::do_print () const
-{
-#ifndef NDEBUG
-  for (int i=0; i < item_l_arr_.size (); i++)
-    {
-      DEBUG_OUT << classname (item_l_arr_[i]) << ", ";
-    }
-#endif
-}
-
index ae96ed9771386fd10b51d5f5d4920e9d31fbc134..45e74b09df9587345dee79abb935b84ddd19d741 100644 (file)
@@ -181,7 +181,7 @@ Slur::do_post_processing ()
          if ((stem_l->extent (Y_AXIS).empty_b ()
               || !((stem_l->get_direction () == get_direction ()) && (get_direction () != d)))
              && !((get_direction () == stem_l->get_direction ())
-                  && stem_l->beam_l_ && (stem_l->beams_i_drul_[-d] >= 1)))
+                  && stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1)))
            {
              dx_f_drul_[d] = spanned_drul_[d]->extent (X_AXIS).length () / 2;
              dx_f_drul_[d] -= d * x_gap_f;
@@ -207,7 +207,7 @@ Slur::do_post_processing ()
              /*
                side attached to beamed stem
               */
-             if (stem_l->beam_l_ && (stem_l->beams_i_drul_[-d] >= 1))
+             if (stem_l->beam_l () && (stem_l->beams_i_drul_[-d] >= 1))
                {
                  dy_f_drul_[d] = stem_l->extent (Y_AXIS)[get_direction ()];
                  dy_f_drul_[d] += get_direction () * 2 * y_gap_f;
@@ -292,7 +292,7 @@ Slur::do_post_processing ()
   Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
   if (!fix_broken_b)
     dy_f -= interstaff_f;
-  Real dx_f = do_width ().length () + dx_f_drul_[RIGHT] - dx_f_drul_[LEFT];
+  Real dx_f = spanner_length ()+ dx_f_drul_[RIGHT] - dx_f_drul_[LEFT];
 
   /*
     Avoid too steep slurs.
@@ -491,7 +491,7 @@ Slur::get_encompass_offset_arr () const
       offset_arr.push (o - origin);
     }
 
-  offset_arr.push (Offset (do_width ().length () + dx_f_drul_[RIGHT],
+  offset_arr.push (Offset (spanner_length ()+  dx_f_drul_[RIGHT],
                           dy_f_drul_[RIGHT]));
 
   return offset_arr;
index ece98451f7f44b7042563aba873d156b6c540c95..69632b2af8b8581d098975efb3a733b79575cf0b 100644 (file)
 
 Spacing_spanner::Spacing_spanner ()
 {
+  set_empty (X_AXIS);
+  set_empty (Y_AXIS);  
   set_elt_property ("transparent", SCM_BOOL_T);
 }
 
-int
-Spacing_spanner::col_count () const
-{
-  return pscore_l_->line_l_->cols_.size ();
-}
-
-Score_column *
-Spacing_spanner::scol (int i)const
-{
-  return dynamic_cast<Score_column*> (pscore_l_->line_l_->cols_[i]);
-}
-
 /*
   cut 'n paste from spring-spacer.cc
 
@@ -48,31 +38,31 @@ Spacing_spanner::scol (int i)const
   
  */
 Array<Spring>
-Spacing_spanner::do_measure (int col1, int col2) const
+Spacing_spanner::do_measure (Link_array<Score_column> cols) const
 {
-  for (int i =col1; i < col2; i++)
+  for (int i =0 ; i < cols.size (); i++)
     {
-      scol (i)->preprocess ();
-      scol (i)->print ();
+      cols[i]->preprocess ();
+      cols[i]->print ();
     }
 
   Moment shortest;
   shortest.set_infinite (1);
-  for (int i =col1; i < col2; i++)
+  for (int i =0 ; i < cols.size (); i++)  
     {
-      if (scol(i)->musical_b ())
+      if (cols[i]->musical_b ())
        {
-         shortest = shortest <? scol(i)->shortest_starter_mom_;
+         shortest = shortest <? cols[i]->shortest_starter_mom_;
        }
     }
 
   Array<Spring> meas_springs;
 
   Real non_musical_space_strength = paper_l ()->get_var ("breakable_column_space_strength");
-  for (int i= col1; i < col2; i++)
+  for (int i= 0; i < cols.size (); i++)
     {
-      Item * l = scol(i);
-      Item * r = scol(i+1);
+      Item * l = cols[i];
+      Item * r = cols[i+1];
       Item * lb = l->find_broken_piece (RIGHT);
       Item * rb = r->find_broken_piece (LEFT);      
 
@@ -99,7 +89,8 @@ Spacing_spanner::do_measure (int col1, int col2) const
            {
              left_distance = gh_scm2double (gh_cdr (hint)); 
            }
-         else if (!lc->musical_b() && i+1 < col_count())
+          // 2nd condition should be (i+1 < col_count()), ie. not the last column in score.  FIXME
+         else if (!lc->musical_b() && i+1 < cols.size ()) 
            {
              left_distance= default_bar_spacing (lc,rc,shortest);
            }
@@ -295,13 +286,20 @@ Array<Spring>
 Spacing_spanner::get_springs () const
 {
   Array<Spring> springs;
-  int last_break =0;
-  for (int i=1; i < col_count (); i++)
+  
+  SCM last_col = pscore_l_->line_l_->get_elt_property ("columns");
+  Link_array<Score_column> measure;
+  for (SCM s = last_col; gh_pair_p (s); s = gh_cdr (s))
     {
-      if (scol (i)->breakable_b ())
+      SCM elt = gh_car (s);
+      Score_column* sc = dynamic_cast<Score_column*> (SMOB_TO_TYPE (Score_column, elt));
+      measure.push (sc);
+      if (sc->breakable_b ())
         {
-          springs.concat (do_measure (last_break, i));
-          last_break  = i;
+         measure.reverse ();
+          springs.concat (do_measure (measure));
+         measure.clear ();
+         measure.push (sc);
         }
     }
   return springs;
index fe85a4e6b65761619778a9606405c3fe8da735de..34c9f39ea1bc1f1da7e28f954fb03a2c33569ffc 100644 (file)
@@ -29,9 +29,10 @@ Span_bar::do_substitute_element_pointer (Score_element*o, Score_element*n)
 
 
 Interval
-Span_bar::do_width () const
+Span_bar::width_callback (Dimension_cache const * c)
 {
-  Molecule m = lookup_l ()->bar (type_str_, 40 PT, paper_l ());
+  Span_bar*  s= dynamic_cast<Span_bar*> (c->element_l ());  
+  Molecule m = s->lookup_l ()->bar (s->type_str_, 40 PT, s->paper_l ());
   
   return m.extent (X_AXIS);
 }
@@ -43,7 +44,7 @@ Span_bar::do_pre_processing ()
   
   evaluate_empty ();
   
-  set_empty (false, Y_AXIS); // a hack to make mark scripts work.
+  //  set_empty (false, Y_AXIS); // a hack to make mark scripts work.
 }
 
 void
@@ -61,13 +62,14 @@ Span_bar::evaluate_empty ()
   if (spanning_l_arr_.size () < 1) 
     {
       set_elt_property ("transparent", SCM_BOOL_T);
-      set_empty (true, X_AXIS, Y_AXIS);   
-
+      set_empty (X_AXIS);
+      set_empty (Y_AXIS);   
     }
   if (type_str_.empty_b ()) 
     {
       set_elt_property ("transparent", SCM_BOOL_T);
-      set_empty (true);
+      set_empty (X_AXIS);
+      set_empty (Y_AXIS);   
     }
   else if (type_str_ == "|:") 
     {
@@ -90,7 +92,7 @@ Span_bar::get_spanned_interval () const
 
   for (int i=0; i < spanning_l_arr_.size (); i++) 
     {
-      Graphical_element*common = common_refpoint (spanning_l_arr_[i], Y_AXIS);
+      Score_element*common = common_refpoint (spanning_l_arr_[i], Y_AXIS);
       Real y = spanning_l_arr_[i]->relative_coordinate (common, Y_AXIS)  
        - relative_coordinate (common, Y_AXIS);
 
@@ -100,9 +102,10 @@ Span_bar::get_spanned_interval () const
 }
 
 Interval
-Span_bar::do_height () const
+Span_bar::height_callback (Dimension_cache const *c) 
 {
-  return get_spanned_interval ();
+  Span_bar * s= dynamic_cast<Span_bar*> (c->element_l ()); 
+  return s->get_spanned_interval ();
 }
 
 Molecule*
@@ -126,5 +129,7 @@ Span_bar::do_brew_molecule_p () const
 Span_bar::Span_bar ()
 {
   type_str_ = "";
+  dim_cache_[X_AXIS]->set_callback (width_callback);
+  dim_cache_[Y_AXIS]->set_callback (height_callback);  
 }
 
index 770aa4c4c5983357a4183f13e7629ffeac7dde30..e4efbe0ec068e1ab2c29d5485ba4cbdccf863e8a 100644 (file)
@@ -32,7 +32,7 @@ Span_bar*
 Piano_bar_engraver::get_span_bar_p () const
 {
   Span_bar *s= new Span_bar;
-  s->set_empty (true, X_AXIS);
+  s->set_empty (X_AXIS);
   s->type_str_ = "brace";
   return s;
 }
@@ -41,7 +41,7 @@ Span_bar*
 Staff_group_bar_engraver::get_span_bar_p () const
 {
   Span_bar *s= new Span_bar;
-  s->set_empty (true, X_AXIS);
+  s->set_empty (X_AXIS);
   s->type_str_ = "bracket";
   return s;
 }
index 5aa48681d4717f8e6860dcb1a924b5fd11e350ff..9aeaaab4075c518db3fdc4d69aed1ca0f2bb86f4 100644 (file)
 #include "score-column.hh"
 #include "line-of-score.hh"
 
-void
-Spanner::do_print() const
-{
-#ifndef NPRINT
-  DEBUG_OUT << "Between " << classname (spanned_drul_[LEFT])
-       << " and " << classname (spanned_drul_[RIGHT]) << '\n';
-
-  if (broken_b ())
-    DEBUG_OUT << "Broken in " << to_str (broken_into_l_arr_.size ()) << " pieces";
-#endif
-}
-
 void
 Spanner::break_into_pieces ()
 {
-  if (broken_b ())
-    return; 
-        
+  if (line_l () || broken_b ())
+    return;
+  
   Item * left = spanned_drul_[LEFT];
   Item * right = spanned_drul_[RIGHT];
 
@@ -80,13 +68,13 @@ Spanner::break_into_pieces ()
 void
 Spanner::set_my_columns()
 {
-  Direction i = (Direction)1;
+  Direction i = (Direction) LEFT;
   do 
     {
       if (!spanned_drul_[i]->line_l())
-       set_bounds(i,spanned_drul_[i]->find_broken_piece((Direction)-i));
+       set_bounds(i,spanned_drul_[i]->find_broken_piece((Direction) -i));
     } 
-  while (flip(&i) != 1);
+  while (flip(&i) != LEFT);
 }       
 
 void
@@ -106,18 +94,18 @@ Spanner::set_bounds(Direction d, Item*i)
       set_parent (i, X_AXIS);
     }
   
-  if  (spanned_drul_[Direction(-d)] == spanned_drul_[d]
+  if (spanned_drul_[Direction(-d)] == spanned_drul_[d]
        && i)
     warning (_f ("Spanner `%s' has equal left and right spanpoints", classname (this)));
 }
 
+
+
 void
 Spanner::do_break_processing()
 {
-  if (!line_l())
-    break_into_pieces ();
-  else 
-    handle_broken_dependencies();
+  break_into_pieces ();
+  handle_broken_dependencies();
 }
 
 Spanner::Spanner ()
@@ -133,8 +121,8 @@ Spanner::Spanner (Spanner const &s)
 }
 
 
-Interval
-Spanner::do_width() const
+Real
+Spanner::spanner_length() const
 {  
   Real l = spanned_drul_[LEFT]->relative_coordinate (0, X_AXIS);
   Real r = spanned_drul_[RIGHT]->relative_coordinate (0, X_AXIS);
@@ -142,7 +130,7 @@ Spanner::do_width() const
   if (r< l)
     warning (_ ("spanner with negative length"));
        
-  return Interval (0, r-l);
+  return r-l;
 }
 
 Line_of_score *
@@ -159,22 +147,17 @@ Spanner::line_l() const
 Score_element*
 Spanner::find_broken_piece (Line_of_score*l) const
 {
+  Spanner* me = (Spanner*) this;
+  break_into_pieces ();
+  
   int idx = binsearch_link_array (broken_into_l_arr_,  (Spanner*)l, Spanner::compare);
+  
   if (idx < 0)
     return 0;
   else
     return broken_into_l_arr_ [idx];
 }
 
-/*
-  for (int i=0; i < broken_into_l_arr_.size (); i++)
-    {
-      if (broken_into_l_arr_[i]->line_l () == l)
-       return broken_into_l_arr_[i];
-    }
-  return 0;
-*/
-
 
 int
 Spanner::compare (Spanner * const &p1, Spanner * const &p2)
@@ -218,6 +201,7 @@ Spanner::do_space_processing ()
     }
 }
 
+#if 0
 /*
   UGH.
  */
@@ -239,6 +223,7 @@ Spanner::handle_broken_dependents ()
        programming_error ("Spanner y -refpoint lost.");
     }
 }
+#endif
 
 /*
   If this is a broken spanner, return the amount the left end is to be
@@ -254,7 +239,8 @@ Spanner::get_broken_left_end_align () const
   Score_column *sc = dynamic_cast<Score_column*> (spanned_drul_[LEFT]->column_l());
 
   // Relevant only if left span point is first column in line
-  if(sc != NULL && sc->line_l ()->cols_.find_i (sc) == 0)
+  if(sc != NULL &&
+     sc->break_status_dir () == RIGHT)
     {
       // We could possibly return the right edge of the whole Score_column here,
       // but we do a full search for the Break_align_item.
index bea519b2dd5d2427d12c0d4d90400ada382bf8d8..20440aa923eb27197df2a5b0467ab9d01314bfc7 100644 (file)
@@ -39,7 +39,7 @@ Side_position_interface::get_direction () const
 
   Direction relative_dir = UP;
   SCM reldir = elt_l_->get_elt_property ("side-relative-direction");   // should use a lambda.
-  if (isdir_b (d))
+  if (isdir_b (reldir))
     {
       relative_dir = to_dir (reldir);
     }
@@ -65,7 +65,7 @@ Side_position_interface::side_position (Dimension_cache const * c)
 
   Interval dim;
   Axis  axis = c->axis ();
-  Graphical_element *common = me->parent_l (axis);
+  Score_element *common = me->parent_l (axis);
   SCM support = me->get_elt_property ("side-support");
   for (SCM s = support; s != SCM_EOL; s = gh_cdr (s))
     {
@@ -135,55 +135,62 @@ Side_position_interface::self_alignment (Dimension_cache const *c)
 
 
 Real
-Side_position_interface::aligned_side (Dimension_cache const *c)
+directed_round (Real f, Direction d )
+{
+  if (d < 0)
+    return floor (f);
+  else
+    return ceil (f);
+}
+
+Real
+Side_position_interface::quantised_position (Dimension_cache const *c)
 {
   Score_element * me = dynamic_cast<Score_element*> (c->element_l ());
   Side_position_interface s(me);
   Direction d = s.get_direction ();
-  Axis ax = c->axis ();
-  Real o = side_position (c);
-
-  Interval iv =  me->extent (ax);
 
-  if (!iv.empty_b ())
+  Staff_symbol_referencer *ref = dynamic_cast<Staff_symbol_referencer*> (me);
+  if (ref)
     {
-      o += - iv[-d];
+      Real p = ref->position_f ();
+      Real rp = directed_round (d, p);
 
-      SCM pad = me->get_elt_property ("padding");
-      if (gh_number_p (pad))
-       o += d *gh_scm2double (pad) ; 
+      int ip = int  (p);
+      if (!(ip % 2))
+       {
+         ip += d;
+         rp += d;
+       }
+
+      return (rp - p) * ref->staff_line_leading_f ();
     }
-  return o;
+  return 0.0;
 }
 
-#if 0
-
-/*
-  need cascading off callbacks for this.
- */
-Side_position_interface::quantised_side (Dimension_cache const *c)
+Real
+Side_position_interface::aligned_side (Dimension_cache const *c)
 {
   Score_element * me = dynamic_cast<Score_element*> (c->element_l ());
   Side_position_interface s(me);
   Direction d = s.get_direction ();
   Axis ax = c->axis ();
   Real o = side_position (c);
-  Staff_symbol_referencer * st = dynamic_cast (me);
 
-  if (st && ax == Y_AXIS)
+  Interval iv =  me->extent (ax);
+
+  if (!iv.empty_b ())
     {
-      st->translate_axis (o, Y_AXIS);
-      st->set_position ();
+      o += - iv[-d];
 
-      st->lines_i ();
-      st->quantise_to_next_line (d);
-      st->translate_axis (o, -Y_AXIS);
+      SCM pad = me->get_elt_property ("padding");
+      if (gh_number_p (pad))
+       o += d *gh_scm2double (pad) ; 
     }
-
   return o;
 }
-#endif
-  
+
+
 
 
 void
@@ -193,11 +200,20 @@ Side_position_interface::set_axis (Axis a)
   if (elt_l_->get_elt_property ("side-support") == SCM_UNDEFINED)
     elt_l_->set_elt_property ("side-support" ,SCM_EOL);
 
-  Axis other = Axis ((a +1)%2);
   elt_l_->dim_cache_[a]->off_callbacks_.push (aligned_side);
 }
 
 
+void
+Side_position_interface::set_quantised (Axis a)
+{
+  Dimension_cache * c = elt_l_->dim_cache_[a];
+  for (int i=0; i <  c->off_callbacks_.size (); i++)
+    if (c->off_callbacks_[i] == aligned_side)
+      c->off_callbacks_[i] = side_position ;
+  c->off_callbacks_.push (quantised_position);
+}
+
 Axis
 Side_position_interface::get_axis () const
 {
index 695d1099997b187860d8478940f1d87cd00ab27d..369df2928f637792af52f1849716c8f7fefd23c1 100644 (file)
@@ -58,11 +58,9 @@ Staff_symbol_engraver::do_removal_processing()
 void
 Staff_symbol_engraver::acknowledge_element (Score_element_info s)
 {
-  if (Staff_symbol_referencer * st = dynamic_cast<Staff_symbol_referencer*> (s.elem_l_))
-    {
-      st->set_staff_symbol (span_p_);      
-    }
-  
+  s.elem_l_->set_elt_property ("staff-symbol", span_p_->self_scm_);
+  s.elem_l_->add_dependency (span_p_); // UGH. UGH. UGH 
+
   SCM ss =s.elem_l_->remove_elt_property ("staff-support");
   if (gh_boolean_p (ss) && gh_scm2bool (ss))
     {
index 7ab14e91ba2c5f23cf9173af6d5cef278aafba7a..2bc87b2321a2c77af1c0753563155fee9aec335f 100644 (file)
@@ -29,18 +29,11 @@ Staff_symbol::do_print() const
 #endif
 }
 
-Interval
-Staff_symbol::do_height() const
-{
-  Interval i =Interval (0, staff_line_leading_f_ * (no_lines_i_-1));
-  i += - i.center ();
-  return i;
-}
 
 Molecule*
 Staff_symbol::do_brew_molecule_p() const
 {
-  Graphical_element * common
+  Score_element * common
     = spanned_drul_[LEFT]->common_refpoint (spanned_drul_[RIGHT], X_AXIS);
 
 #if 0
index 22b29af5397857dab5258a1f9dd9daaf2d13aeb7..d07dbea01aea14a302623a83a50e92e21c406e0b 100644 (file)
 
 Staff_symbol_referencer::Staff_symbol_referencer ()
 {
-  staff_symbol_l_ =0;
-  position_f_ =0;
+  set_elt_property ("staff-position", gh_double2scm (0.0));
+  dim_cache_[Y_AXIS]->off_callbacks_.push (callback);
 }
 
-void
-Staff_symbol_referencer::do_substitute_element_pointer (Score_element *o,
-                                                       Score_element*n)
-{
-  if (staff_symbol_l_ == o)
-    {
-      staff_symbol_l_ = dynamic_cast<Staff_symbol*> (n);
-    }
-}
 
 int
 Staff_symbol_referencer::lines_i () const
 {
-  return (staff_symbol_l_) ?  staff_symbol_l_->no_lines_i_ : 5;
-}
-
-void
-Staff_symbol_referencer::set_staff_symbol (Staff_symbol*s)
-{
-  staff_symbol_l_ =s;
-  add_dependency (s);
+  Staff_symbol *st = staff_symbol_l ();
+  return st  ?  st->no_lines_i_ : 5;
 }
 
 Staff_symbol*
 Staff_symbol_referencer::staff_symbol_l () const
 {
-  return staff_symbol_l_;
+  SCM st = get_elt_property ("staff-symbol");
+  if (SMOB_IS_TYPE_B (Score_element, st))
+    return dynamic_cast<Staff_symbol* > (SMOB_TO_TYPE (Score_element,st));
+  else
+    return 0;
 }
 
 Real
 Staff_symbol_referencer::staff_line_leading_f () const
 {
-  if (staff_symbol_l_)
-    return  staff_symbol_l_->staff_line_leading_f_;
+  Staff_symbol * st = staff_symbol_l ();
+  if (st)
+    return st->staff_line_leading_f_;
   else if (pscore_l_ && paper_l ())
     paper_l ()->get_var ("interline");
  
   return 0.0;
 }
 
+
 Real
 Staff_symbol_referencer::position_f () const
 {
-  Real p = position_f_;
-  if (staff_symbol_l_ )
+  Real p =0.0;
+  SCM pos = get_elt_property ("staff-position");
+  if (gh_number_p (pos))
+    p = gh_scm2double (pos);
+
+  Staff_symbol * st = staff_symbol_l ();
+  if (st)
     {
-      Graphical_element * c = common_refpoint (staff_symbol_l_, Y_AXIS);
-      Real y = relative_coordinate (c, Y_AXIS) - staff_symbol_l_->relative_coordinate (c, Y_AXIS);
+      Score_element * c = common_refpoint (st, Y_AXIS);
+      Real y = relative_coordinate (c, Y_AXIS)
+       - st->relative_coordinate (c, Y_AXIS);
 
       p += 2.0 * y / staff_line_leading_f ();
     }
@@ -78,23 +75,38 @@ Staff_symbol_referencer::position_f () const
 /*
   should use offset callback!
  */
-void
-Staff_symbol_referencer::do_pre_processing ()
+Real
+Staff_symbol_referencer::callback (Dimension_cache const * c)
 {
-  translate_axis (position_f_ * staff_line_leading_f () /2.0, Y_AXIS);
-  position_f_ =0;
+  Score_element * sc = dynamic_cast<Score_element*> (c->element_l ());
+  Staff_symbol_referencer * ref = dynamic_cast<Staff_symbol_referencer*> (sc);
+  SCM pos = sc->get_elt_property ("staff-position");
+  Real off =0.0;
+  if (gh_number_p (pos))
+    {
+      off = gh_scm2double (pos) * ref->staff_line_leading_f () /2.0;
+    }
+  sc->set_elt_property ("staff-position", gh_double2scm (0.0));
+
+  return off;
 }
 
 
 void
 Staff_symbol_referencer::set_position (Real p)
 {
-  Real halfspace =  staff_line_leading_f ()* 0.5;
+  Real halfspace = staff_line_leading_f ()* 0.5;
   
   translate_axis (- halfspace * position_f (), Y_AXIS);
-  if (staff_symbol_l_)
+  Staff_symbol *st = staff_symbol_l ();
+  if (st)
     translate_axis (halfspace * p, Y_AXIS);
   else
-    position_f_ =   p;
+    {
+      //      SCM pos = get_elt_property ("staff-position");
+      set_elt_property ("staff-position",
+                       gh_double2scm (p));
+                       //                      gh_double2scm (p + gh_scm2double (pos)));
+    }
 }
 
index 6269efb796bdac48142c5d8c8fc916cfae42585a..ee0faf9721a4a60516b2d21e82a5444b596b191f 100644 (file)
@@ -29,13 +29,13 @@ Stem_info::Stem_info ()
 
   GURG UGRGINRG INA UG R
 
-  JUNKME -> This should be in Beam
+  JUNKME -> this should set elt properties of STEM.
 */
 Stem_info::Stem_info (Stem*s, int mult)
 {
   mult_i_ =mult;
   stem_l_ = s;
-  Beam* beam_l = stem_l_->beam_l_;
+  Beam* beam_l = stem_l_->beam_l ();
   
   x_ = stem_l_->hpos_f ();
   set_direction (stem_l_->get_direction ());
index bbc4b0b50ad8b887d9fb4ec7411aa4b7ef24ea08..24f1405b5b76e37cadce8a4f40376512c8989055 100644 (file)
 #include "lookup.hh"
 #include "stem.hh"
 #include "offset.hh"
+#include "dimension-cache.hh"
 
 Stem_tremolo::Stem_tremolo ()
 {
-  stem_l_ = 0;
+  set_elt_property ("stem", SCM_EOL);
   abbrev_flags_i_ = 1;
 }
 
@@ -27,31 +28,41 @@ Stem_tremolo::do_print () const
   DEBUG_OUT << "abbrev_flags_i_ " << abbrev_flags_i_;
 }
 
-Interval
-Stem_tremolo::do_width () const
+Stem *
+Stem_tremolo::stem_l ()const
 {
-  Real space = stem_l_->staff_line_leading_f ();
-  return Interval (-space, space);
+  SCM s =   get_elt_property ("stem");
+  if (SMOB_IS_TYPE_B (Score_element, s))
+    {
+      return dynamic_cast<Stem*> (SMOB_TO_TYPE (Score_element,s));
+    }
+  else
+    return 0;
 }
 
-void
-Stem_tremolo::do_pre_processing ()
+Interval
+Stem_tremolo::dim_callback (Dimension_cache const *c) 
 {
+  Stem_tremolo * s = dynamic_cast<Stem_tremolo*> (c->element_l ());
+  Real space = s->stem_l ()->staff_line_leading_f ();
+  return Interval (-space, space);
 }
 
+
 Molecule*
 Stem_tremolo::do_brew_molecule_p () const
 {
+  Stem * st = stem_l ();
   int mult =0;
-  if (Beam * b = stem_l_->beam_l_)
+  if (Beam * b = st->beam_l ())
     {
-      Stem_info i = b->get_stem_info (stem_l_);
+      Stem_info i = b->get_stem_info (st);
       mult = i.mult_i_;
     }
   
   Real interbeam_f = paper_l ()->interbeam_f (mult);
   Real w  = gh_scm2double (get_elt_property ("beam-width"));
-  Real space = stem_l_->staff_line_leading_f ();
+  Real space = st->staff_line_leading_f ();
   Real internote_f = space/2;
   
   Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
@@ -59,10 +70,10 @@ Stem_tremolo::do_brew_molecule_p () const
   int beams_i = 0;
   Real slope_f = internote_f / 4 / internote_f;        // HUH?
 
-  if (stem_l_ && stem_l_->beam_l_) {
-    slope_f = stem_l_->beam_l_->slope_f_;
+  if (st && st->beam_l ()) {
+    slope_f = st->beam_l ()->slope_f_;
     // ugh, rather calc from Stem_tremolo_req
-    beams_i = stem_l_->beams_i_drul_[RIGHT] >? stem_l_->beams_i_drul_[LEFT];
+    beams_i = st->beams_i_drul_[RIGHT] >? st->beams_i_drul_[LEFT];
   } 
   Real sl = slope_f * internote_f;
 
@@ -78,35 +89,35 @@ Stem_tremolo::do_brew_molecule_p () const
     }
   beams->translate_axis (-beams->extent ()[Y_AXIS].center (), Y_AXIS);
 
-  if (stem_l_)
+  if (st)
     { 
-      if (stem_l_->beam_l_)
+      if (st->beam_l ())
         {
-         beams->translate (Offset(stem_l_->hpos_f () - hpos_f (),
-           stem_l_->stem_end_f () * internote_f - 
-           stem_l_->beam_l_->get_direction () * beams_i * interbeam_f));
+         beams->translate (Offset(st->hpos_f () - hpos_f (),
+           st->stem_end_f () * internote_f - 
+           st->beam_l ()->get_direction () * beams_i * interbeam_f));
        }
       else
        {  
          /*
            Beams should intersect one beamthickness below staff end
           */
-         Real dy = - beams->extent ()[Y_AXIS].length () / 2 * stem_l_->get_direction ();
+         Real dy = - beams->extent ()[Y_AXIS].length () / 2 * st->get_direction ();
 
          /*
            uhg.  Should use relative coords and placement
          */
-         Real whole_note_correction = (stem_l_ && stem_l_->invisible_b( ))
-           ? -stem_l_->get_direction () * stem_l_->note_delta_f ()/2
+         Real whole_note_correction = (st && st->invisible_b( ))
+           ? -st->get_direction () * st->note_delta_f ()/2
            : 0.0;
 
          /*
            UGH. Internote fudging.
           */
          dy /= internote_f;
-         dy += stem_l_->stem_end_f ();
+         dy += st->stem_end_f ();
          dy *= internote_f;
-         beams->translate (Offset(stem_l_->hpos_f () - hpos_f ()+
+         beams->translate (Offset(st->hpos_f () - hpos_f ()+
                                   whole_note_correction, dy));
        }
 
@@ -119,18 +130,11 @@ Stem_tremolo::do_brew_molecule_p () const
   return beams;
 }
 
-void
-Stem_tremolo::do_substitute_element_pointer (Score_element*o, Score_element*n)
-{
-  if (stem_l_ == o)
-    stem_l_ = dynamic_cast<Stem*> (n);
-}
-
 
 void
 Stem_tremolo::set_stem (Stem *s)
 {
-  stem_l_ = s;
+  set_elt_property ("stem", s->self_scm_);
   add_dependency (s);
 }
 
index 2975f3321afe187b6c8423c9b6297fcb2ad438f9..74ac9349aec235fc5a192121f019db55bc48e095 100644 (file)
@@ -7,7 +7,7 @@
 
   TODO: This is way too hairy
 */
-
+#include "dimension-cache.hh"
 #include "stem.hh"
 #include "debug.hh"
 #include "paper-def.hh"
@@ -24,7 +24,6 @@ Stem::Stem ()
   beams_i_drul_[LEFT] = beams_i_drul_[RIGHT] = -1;
   yextent_drul_[DOWN] = yextent_drul_[UP] = 0;
   flag_i_ = 2;
-  beam_l_ = 0;
 }
 
 Interval_t<int>
@@ -55,8 +54,6 @@ Stem::do_print () const
 {
 #ifndef NPRINT
   DEBUG_OUT << "flag "<< flag_i_;
-  if (beam_l_)
-    DEBUG_OUT << "beamed";
 #endif
 }
 
@@ -238,8 +235,11 @@ Stem::do_pre_processing ()
   if (invisible_b ())
     {
       set_elt_property ("transparent", SCM_BOOL_T);
+      set_empty (Y_AXIS);      
+      set_empty (X_AXIS);      
     }
-  set_empty (invisible_b (), X_AXIS, Y_AXIS);
+
+
   set_spacing_hints ();
 }
 
@@ -290,15 +290,17 @@ Stem::flag () const
 }
 
 Interval
-Stem::do_width () const
+Stem::dim_callback (Dimension_cache const* c) 
 {
+  Stem * s = dynamic_cast<Stem*> (c->element_l ());
+  
   Interval r (0, 0);
-  if (beam_l_ || abs (flag_i_) <= 2)
+  if (s->get_elt_property ("beam") != SCM_UNDEFINED || abs (s->flag_i_) <= 2)
     ;  // TODO!
   else
     {
-      r = flag ().dim_.x ();
-      r += note_delta_f ();
+      r = s->flag ().dim_.x ();
+      r += s->note_delta_f ();
     }
   return r;
 }
@@ -328,7 +330,8 @@ Stem::do_brew_molecule_p () const
       mol_p->add_molecule (ss);
     }
 
-  if (!beam_l_ && abs (flag_i_) > 2)
+  if (get_elt_property ("beam") == SCM_UNDEFINED
+      && abs (flag_i_) > 2)
     {
       Molecule fl = flag ();
       fl.translate_axis(stem_y[get_direction ()]*dy, Y_AXIS);
@@ -373,11 +376,14 @@ Stem::do_substitute_element_pointer (Score_element*o,Score_element*n)
     head_l_arr_.substitute (h, dynamic_cast<Note_head*>(n));
   if (Rest *r=dynamic_cast<Rest*> (o))
     rest_l_arr_.substitute (r, dynamic_cast<Rest*>(n));
-  if (Beam* b = dynamic_cast<Beam*> (o))
-    {
-      if (b == beam_l_) 
-       beam_l_ = dynamic_cast<Beam*> (n);
-    }
-  Staff_symbol_referencer::do_substitute_element_pointer (o,n);
 }
 
+Beam*
+Stem::beam_l ()const
+{
+  SCM b=  get_elt_property ("beam");
+  if (SMOB_IS_TYPE_B(Score_element, b))
+    return dynamic_cast<Beam*> (SMOB_TO_TYPE(Score_element,b));
+  else
+    return 0;
+}
index 90f8d49700ce02fa46f1697485fa4fe084affa52..dee963dedd196381efb0bb04d981e5d88767f01c 100644 (file)
@@ -53,7 +53,7 @@ void
 Super_element::breakable_col_processing ()
 {
   calculate_dependencies (PREBROKEN, PREBROKEN, &Score_element::do_breakable_col_processing);
-  calculate_dependencies (PREBROKEN_SECOND, PREBROKEN_SECOND, &Score_element::handle_prebroken_dependents);
+  //  calculate_dependencies (PREBROKEN_SECOND, PREBROKEN_SECOND, &Score_element::handle_prebroken_dependents);
 }
 
 void
@@ -65,8 +65,8 @@ Super_element::break_processing ()
 void
 Super_element::post_processing ()
 {
-  calculate_dependencies (BROKEN_SECOND, BROKEN_SECOND,
-                         &Score_element::handle_broken_dependents);
+  //  calculate_dependencies (BROKEN_SECOND, BROKEN_SECOND,
+  //             &Score_element::handle_broken_dependents);
   calculate_dependencies (POSTCALCED, POSTCALCING, &Score_element::do_post_processing);
 }
 
index 718845c75577dedb6cdeec3b720f85f76876174a..40646392ed5a4923bacddde0d0207c7fb22052fb 100644 (file)
@@ -104,7 +104,7 @@ Text_engraver::do_process_requests ()
       SCM empty = get_property ("textEmptyDimension", 0);
       if (gh_boolean_p (empty) && gh_scm2bool (empty))
        {
-         text->set_empty (true, X_AXIS);
+         text->set_empty (X_AXIS);
        }
 
       announce_element (Score_element_info (text, r));
index 0c3646f6ff333850ea7757dc38de4ff99f5e531e..7fed879b85e87ced82b247d42e5aeb05c5b91caf 100644 (file)
@@ -21,6 +21,9 @@
 
 Tuplet_spanner::Tuplet_spanner ()
 {
+  /*
+    -> GUILE
+   */
   parallel_beam_b_ = false;
 }
 
index 9e06d74c69b9e15629063487c1bffadcb6078e91..f1e641b78230c07a70105bffbe24fd5d221719fc 100644 (file)
 #include "paper-def.hh"
 #include "volta-spanner.hh"
 #include "stem.hh"
-
+#include "dimension-cache.hh"
 #include "pointer.tcc"
 
 Volta_spanner::Volta_spanner ()
 {
   last_b_ = false;
+  dim_cache_ [Y_AXIS]->set_callback (dim_callback);
 }
 
 Molecule*
@@ -82,11 +83,8 @@ Volta_spanner::do_add_processing ()
       set_bounds (RIGHT, bar_arr_.top ());  
     }
 }
-  
-Interval
-Volta_spanner::do_height () const
-{
-  /*
+
+/*
     Originally the following comment existed here
     "in most cases, it's a lot better not no have height...",
     but problems existed with collision between volta spanner
@@ -94,8 +92,12 @@ Volta_spanner::do_height () const
     height is now being returned. Additional space should still
     be added elsewhere so lyrics from above staff do not sit on
     volta spanner. (Roy R. Rankin)
-  */
-  Real h = paper_l()->get_var ("volta_spanner_height") * 2.;
+*/
+Interval
+Volta_spanner::dim_callback (Dimension_cache const *c)
+{
+  Volta_spanner * v = dynamic_cast<Volta_spanner*> (c->element_l ());
+  Real h = v->paper_l()->get_var ("volta_spanner_height") * 2.;
   return Interval (0., h);
 }
 
index 61ac19f2dc3eb33ba66ac5206c5f2ad08370248a..4e60c76a0119ba2eca671450f09c77f012feedbd 100644 (file)
@@ -96,10 +96,13 @@ grace_forced_stem_shorten3 = \grace_forced_stem_shorten2;
 % * MEDIAN   : mean centre distance weighted per note
 %
 
-#'slope-quantisation = #'normal
 #'beam-dir-algorithm = #'majority      %urg.
 #'Stem_tremolo::beam-width = 1.5 * \quartwidth ; 
 
+% The beams should be prevented to conflict with the stafflines, 
+% especially at small slopes.
+#'slope-quantisation = #'normal
+
 
 
 #'Clef_item::visibility-lambda = #postbreak-only-visibility
index 2c2e0510867cb57e89c360993056be1d6805daf9..8a33b3279c7e33b5cf1310b95c83f9a76992b8e5 100644 (file)
@@ -44,5 +44,5 @@ localinstall:
        $(LN_S) $(TEX_TFMDIR) $(datadir)/cmtfm
 
 local-WWW-clean:
-       $(depth)/buildscripts/out/clean-fonts
+       $(SHELL) $(depth)/buildscripts/clean-fonts.sh
 
index c9e18e1f5dea00f25a5cf8b44125cd5019409ab7..e37947d68b70cce8c0ffc9bd06a74eb7f0c1862b 100644 (file)
@@ -44,7 +44,7 @@ Note: Original key F.
 \version "1.3.4";
 
 vocalVerse = \notes\relative c''{
-       \property Voice.dynamicDirection=1
+       \property Voice.dynamicDirection=\up
        \times 2/3 { [ g8( )as] g } c4. g8 |
        \times 2/3 { [ f8( )g] f } c'4 f,8 r |
        g4.-> f8 \times 2/3 { [ f( )es] d } |
@@ -73,7 +73,7 @@ vocalVerse = \notes\relative c''{
 }
 
 vocalThrough = \notes\relative c{
-       \property Voice.dynamicDirection=1
+       \property Voice.dynamicDirection=\up
        g''8. g16 b8. b16 d8. d16 |
        c4 b r |
        g4. b8 d8. c16 |
@@ -176,7 +176,7 @@ trebleVerseOne = \notes\relative c{
 }
 
 trebleEentje = \notes \relative c'{
-       \context Voice=one \property Voice.verticalDirection = 0
+       \context Voice=one \property Voice.verticalDirection = \center
        <e2 e'> <e4 g>|
        <f2\mf as!(> <as8.->( c> <)f16 )as> |
        <e4. g> <e8-. g-.(> <e-. g-.> <e-. )g-.> |
@@ -190,7 +190,7 @@ trebleEentje = \notes \relative c'{
 }
 
 trebleThrough = \notes \relative c'{
-       \context Voice=one \property Voice.verticalDirection = 0
+       \context Voice=one \property Voice.verticalDirection = \center
        <e2. e'> |
        %61
        R2. |
@@ -348,8 +348,8 @@ lyricStaff = \context Lyrics = lyric<
 vocals = \notes{
        \clef treble;
        % certainly no auto-beaming for vocals
-       \property Voice.noAutoBeaming = "1"
-       \property Staff.automaticMelismata=1
+       \property Voice.noAutoBeaming = ##t
+       \property Staff.automaticMelismata= ##t
 
        \property Voice.dynamicDirection = \up
        \skip 4 * 12; 
@@ -367,7 +367,7 @@ vocalStaff = \context Staff = vocal<
 
 treble = {
        \clef treble;
-       \property Voice.beamAutoBegin=0
+       \property Voice.beamAutoBegin= #(make-moment 0 1)
        \trebleIntro 
        \trebleVerseOne 
        \trebleEentje