]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.3.96
authorfred <fred>
Tue, 26 Mar 2002 23:57:14 +0000 (23:57 +0000)
committerfred <fred>
Tue, 26 Mar 2002 23:57:14 +0000 (23:57 +0000)
25 files changed:
lily/arpeggio-engraver.cc
lily/axis-group-interface.cc
lily/beam.cc
lily/dot-column.cc
lily/group-interface.cc
lily/hara-kiri-group-spanner.cc
lily/include/group-interface.hh
lily/line-of-score.cc
lily/multi-measure-rest.cc
lily/note-column.cc
lily/pointer-group-interface.cc
lily/rest-collision.cc
lily/score-element.cc
lily/script-column.cc
lily/separating-group-spanner.cc
lily/separation-item.cc
lily/side-position-interface.cc
lily/slur.cc
lily/span-bar.cc
lily/spanner.cc
lily/stem.cc
lily/system-start-delimiter-engraver.cc
lily/tie-column.cc
lily/tuplet-spanner.cc
lily/volta-spanner.cc

index 3c9504512ef84492d0eaf3c33329ba0b9954b379..5a95deecdc545c817945a1b4c7d232d29cfb1629 100644 (file)
@@ -65,7 +65,13 @@ Arpeggio_engraver::acknowledge_element (Score_element_info info)
        {
          stems_.push (info.elem_l_);
        }
-      else if (Rhythmic_head::has_interface (info.elem_l_)
+      
+      else
+
+  /*
+    We can't catch local key items from Voice context, but let's leave
+    it here in case someone moves this stuff around.  */
+       if (Rhythmic_head::has_interface (info.elem_l_)
               || Local_key_item::has_interface (info.elem_l_))
        {
          supports_.push (info.elem_l_);
@@ -80,17 +86,17 @@ Arpeggio_engraver::process_acknowledged ()
     {
       arpeggio_ = new Item (get_property ("Arpeggio"));
       arpeggio_->set_parent (stems_[0], Y_AXIS);
-      Side_position::set_axis (arpeggio_, X_AXIS);
-      Side_position::set_direction (arpeggio_, LEFT);
-      Pointer_group_interface pgi (arpeggio_, "stems");
+      
+      //      Staff_symbol_referencer::set_interface (arpeggio_);
+
       for (int i = 0; i < stems_.size (); i++)
        {
-         pgi.add_element (stems_[i]);
-         Side_position::add_support (arpeggio_, stems_[i]);
+         Pointer_group_interface::add_element (arpeggio_, "stems", stems_[i]);
+         //Side_position::add_support (arpeggio_, stems_[i]);
        }
       for (int i = 0; i < supports_.size (); i++)
        {
-         Side_position::add_support (arpeggio_, supports_[i]);
+         ;//Side_position::add_support (arpeggio_, supports_[i]);
        }
       announce_element (arpeggio_, arpeggio_req_);
     }
index f7e8c22bf166e60e022a7ff8694a63a0fdbdbf89..dcfc553fa4fb5e1be17964141b3cfdebfb741720 100644 (file)
@@ -21,7 +21,7 @@ Axis_group_interface::add_element (Score_element*me,Score_element *e)
        e->set_parent (me, a);
     }
 
-  Pointer_group_interface (me).add_element (e);
+  Pointer_group_interface::add_element (me, "elements", e);
   me->add_dependency (e);
 }
 
@@ -44,9 +44,9 @@ Axis_group_interface::relative_group_extent (Axis a, Score_element *common, SCM
   for (SCM s = elts; gh_pair_p (s); s = gh_cdr (s))
     {
       Score_element * se = unsmob_element (gh_car (s));
-      Interval dims = se->extent (a);
+      Interval dims = se->extent (common, a);
       if (!dims.empty_b ())
-       r.unite (dims + se->relative_coordinate (common, a));
+       r.unite (dims);
     }
   return r;
 }
index 7def162133006882622d4d1f055b6525b13d98cb..c4013abfcf5b02505fbebd1b7ced280b79040e0b 100644 (file)
@@ -39,8 +39,7 @@
 void
 Beam::add_stem (Score_element*me, Score_element*s)
 {
-  Pointer_group_interface gi (me, "stems");
-  gi.add_element (s);
+  Pointer_group_interface:: add_element(me, "stems", s);
   
   s->add_dependency (me);
 
@@ -931,7 +930,9 @@ Beam::rest_collision_callback (SCM element_smob, SCM axis)
   Real beamy = (stem->relative_coordinate (0, X_AXIS) - x0) * dydx + beam_y;
 
   Real staff_space =   Staff_symbol_referencer::staff_space (rest);
-  Real rest_dim = rest->extent (Y_AXIS)[d]*2.0 / staff_space ;
+
+  
+  Real rest_dim = rest->extent (rest, Y_AXIS)[d]*2.0 / staff_space ; // refp??
 
   Real minimum_dist
     = gh_scm2double (rest->get_elt_property ("minimum-beam-collision-distance"));
index d91e1b9de43f4365b3d0550d0f38d5ec4fa8955b..a9838ae13b25609a68a41bbdde03ab62c0443896 100644 (file)
@@ -126,9 +126,7 @@ Dot_column::add_head (Score_element * me, Score_element *rh)
     {
       Side_position::add_support (me,rh);
 
-      Pointer_group_interface gi (me, "dots");
-      gi.add_element (d);
-      
+      Pointer_group_interface ::add_element (me, "dots",d);
       d->add_offset_callback (Dot_column::force_shift_callback_proc , Y_AXIS);
       Axis_group_interface::add_element (me, d);
     }
index a64ba4592591502c63fb7f9c5168c72680ee4fa4..f7ec3d8fd66636a4a9d9a45a7506da318b55c8a1 100644 (file)
@@ -9,44 +9,24 @@
 #include "group-interface.hh"
 #include "score-element.hh"
 
-/*
-  ugh: clean me, junk elt_l_ field
- */
-Group_interface::Group_interface (Score_element * e)
-{
-  elt_l_ = (Score_element*)e;
-  name_ = "elements";
-}
-
-
-Group_interface::Group_interface (Score_element  *e, String s)
-{
-  elt_l_ =(Score_element*)e;
-  name_ = s;
-} 
-bool
-Group_interface::has_interface () 
-{
-  SCM el = elt_l_->get_elt_property (name_.ch_C());
-
-  return el == SCM_EOL || gh_pair_p (el);
-}
-
-
 
 void
-Group_interface::add_thing (SCM s)
+Group_interface::add_thing (Score_element*me, String name, SCM s)
 {
-  elt_l_->set_elt_property (name_.ch_C (),
-                           gh_cons (s, elt_l_->get_elt_property (name_.ch_C())));
+  me->set_elt_property (name.ch_C (),
+                           gh_cons (s, me->get_elt_property (name.ch_C())));
 }
 
 
 int
-Group_interface::count ()
+Group_interface::count (Score_element *me, String name)
 {
-  return scm_ilength (elt_l_->get_elt_property (name_.ch_C()));
+  return scm_ilength (me->get_elt_property (name.ch_C()));
 }
 
 
-
+void
+Pointer_group_interface::add_element (Score_element*me, String name, Score_element*p) 
+{
+  Group_interface::add_thing (me, name, p->self_scm());
+}
index 66bd0389ad0fcf0d9f7fe342c88713566b301d43..2db1040937ed45671922e093d7176341b0a48423 100644 (file)
@@ -99,5 +99,5 @@ void
 Hara_kiri_group_spanner::add_interesting_item (Score_element* me,Score_element* n)
 {
   me->add_dependency (n);
-  Pointer_group_interface (me, "items-worth-living").add_element (n);
+  Pointer_group_interface::add_element (me, "items-worth-living",n);
 }
index 81ee3e4ccf1841dcdf89e99a1e235fdc30142cad..fb19eec2fc8633be0e48cbecf50cbfc5cd19a22b 100644 (file)
 
 struct Group_interface
 {
-  Score_element * elt_l_;
-  String name_;
 public:
-  Group_interface (Score_element *);
-  Group_interface (Score_element *, String);
-  int count ();
-  void add_thing (SCM);
-  bool has_interface ();
-
+  static int count (Score_element*  , String);
+  static void add_thing (Score_element*, String nm, SCM);
 };
 
-struct Pointer_group_interface {
-  Score_element * elt_l_;
-  String name_;
+struct Pointer_group_interface : public Group_interface {
 public:
-  Pointer_group_interface (Score_element*);
-  Pointer_group_interface (Score_element*, String);
-  int count ();
-
-  static bool has_interface (Score_element*);
-  bool has_interface ();
-  void add_element (Score_element*);
+  static void add_element (Score_element*, String nm, Score_element*e);
 };
 /** 
   Put all score elements of ELT's property called NAME into an array,
index bc70174dbce6fb8c07add3353799a4b9dfcf605f..91045bc1f905be4134415ef0622f33980748ad8c 100644 (file)
@@ -51,7 +51,7 @@ void
 Line_of_score::typeset_element (Score_element * elem_p)
 {
   elem_p->pscore_l_ = pscore_l_;
-  Pointer_group_interface (this, "all-elements").add_element (elem_p);
+  Pointer_group_interface::add_element (this, "all-elements",elem_p);
   scm_unprotect_object (elem_p->self_scm ());
 }
 
@@ -287,7 +287,7 @@ Line_of_score::post_processing (bool last_line)
                                  ly_symbol2scm ("after-line-breaking-callback"));
     }
 
-  Interval i(extent(Y_AXIS));
+  Interval i(extent(this, Y_AXIS));
   if (i.empty_b())
     programming_error ("Huh?  Empty Line_of_score?");
   else
index e414c09bf64c3538ae34fab29f8a8f8ef706c9eb..fbe8996a31c5529c18a05991b01104c15d00f0a6 100644 (file)
@@ -49,8 +49,7 @@ Multi_measure_rest::brew_molecule (SCM smob)
     {
       Item * col = sp->get_bound (d)->column_l ();
 
-      Interval coldim = col->extent (X_AXIS)
-       + col->relative_coordinate (0, X_AXIS);
+      Interval coldim = col->extent (0, X_AXIS);
 
       sp_iv[d] = coldim[-d]  ;
     }
@@ -146,8 +145,7 @@ Multi_measure_rest::brew_molecule (SCM smob)
 void
 Multi_measure_rest::add_column (Score_element*me,Item* c)
 {
-  Pointer_group_interface gi (me, "columns");
-  gi.add_element (c);
+  Pointer_group_interface::add_element (me, "columns",c);
 
   add_bound_item (dynamic_cast<Spanner*> (me),c);
 }
@@ -189,7 +187,7 @@ Multi_measure_rest::set_spacing_rods (SCM smob)
        /*
          should do something more advanced.
         */
-      rod.distance_f_ = l->extent (X_AXIS)[BIGGER] - r->extent (X_AXIS)[SMALLER]
+      rod.distance_f_ = l->extent (l, X_AXIS)[BIGGER] - r->extent (r, X_AXIS)[SMALLER]
        + gh_scm2double (me->get_elt_property ("minimum-width")) * staff_space;
   
       rod.add_to_cols ();
index f9711fc9549ca057bb6cb013cb3e66f258a604ac..dde7969295f8716cea2934f8411a4405e1e1d92c 100644 (file)
@@ -100,8 +100,7 @@ Note_column::add_head (Score_element*me,Score_element *h)
     }
   else if (Note_head::has_interface (h))
     {
-      Pointer_group_interface gi (me, "note-heads");
-      gi.add_element (h);
+      Pointer_group_interface::add_element (me, "note-heads",h);
     }
   Axis_group_interface::add_element (me, h);
 }
@@ -132,7 +131,7 @@ Interval
 Note_column::rest_dim (Score_element*me) 
 {
   Score_element * r = unsmob_element (me->get_elt_property ("rest"));
-  return r->extent (Y_AXIS);
+  return r->extent (r, Y_AXIS);        // ??
 }
 
 Score_element*
index 66b327959a5dc19ae10a5d9340de9307efd6ae93..7804d4fcbf80610870183df1b6e77341f0e476c5 100644 (file)
@@ -9,46 +9,7 @@
 #include "group-interface.hh"
 #include "score-element.hh"
 
-/*
-  UGH clean me . 
- */
-Pointer_group_interface::Pointer_group_interface (Score_element * e)
-{
-  elt_l_ = e;
-  name_ = "elements";
-}
-
-
-Pointer_group_interface::Pointer_group_interface (Score_element  *e, String s)
-{
-  elt_l_ =(Score_element*)e;
-  name_ = s;
-} 
-
-/*
-  duh.
- */
-bool
-Pointer_group_interface::has_interface () 
-{
-  SCM el = elt_l_->get_elt_property (name_.ch_C());
-
-  return el == SCM_EOL || gh_pair_p (el);
-}
-
 
-void
-Pointer_group_interface::add_element (Score_element*p) 
-{
-  elt_l_->set_elt_property (name_.ch_C(),
-                          gh_cons (p->self_scm (),
-                                   elt_l_->get_elt_property (name_.ch_C())));
-}
 
-int
-Pointer_group_interface::count ()
-{
-  return scm_ilength (elt_l_->get_elt_property (name_.ch_C()));
-}
 
 
index dad5f9cea40493ad3206eb48028cc4a389ebcac4..b09bf842585def0e1d08f0eda3798e86383b38b7 100644 (file)
@@ -47,8 +47,7 @@ void
 Rest_collision::add_column (Score_element*me,Score_element *p)
 {
   me->add_dependency (p);
-  Pointer_group_interface gi (me);  
-  gi.add_element (p);
+  Pointer_group_interface::add_element (me, "elements", p);
 
   p->add_offset_callback (Rest_collision::force_shift_callback_proc, Y_AXIS);
   p->set_elt_property ("rest-collision", me->self_scm ());
@@ -203,7 +202,7 @@ Rest_collision::do_shift (Score_element *me, SCM elts)
       Interval notedim;
       for (int i = 0; i < notes.size(); i++) 
        {
-         notedim.unite (notes[i]->extent (Y_AXIS));
+         notedim.unite (notes[i]->extent (notes[i],Y_AXIS)); // refp?
        }
 
       Interval inter (notedim);
index 39405a43242dfaf84288fd5d41c950e1a4605ba1..a19df5c7d0807c352af97dfb4b63b27c1a6c0daf 100644 (file)
@@ -48,8 +48,6 @@ Score_element::Score_element(SCM basicprops)
   /*
     fixme: default should be no callback.
    */
-  set_extent_callback (molecule_extent_proc, X_AXIS);
-  set_extent_callback (molecule_extent_proc, Y_AXIS) ;   
 
   pscore_l_=0;
   lookup_l_ =0;
@@ -60,21 +58,32 @@ Score_element::Score_element(SCM basicprops)
 
   smobify_self ();
 
-  dim_cache_[X_AXIS].offset_callbacks_
-    = get_elt_property ("X-offset-callbacks");
-  dim_cache_[Y_AXIS].offset_callbacks_
-    = get_elt_property ("Y-offset-callbacks");
-
-  dim_cache_[X_AXIS].offsets_left_ = scm_ilength (dim_cache_[X_AXIS].offset_callbacks_);
-  dim_cache_[Y_AXIS].offsets_left_ = scm_ilength (dim_cache_[Y_AXIS].offset_callbacks_);  
-
-  SCM cb = get_elt_property ("X-extent-callback");
-  if (cb !=  SCM_EOL)
-    dim_cache_[X_AXIS].dimension_ = cb;
-
-  cb = get_elt_property ("Y-extent-callback");  
-  if (cb != SCM_EOL)
-    dim_cache_[Y_AXIS].dimension_ = cb;
+  char const*onames[] = {"X-offset-callbacks", "Y-offset-callbacks"};
+  char const*enames[] = {"X-extent-callback", "Y-extent-callback"};
+  
+  for (int a = X_AXIS; a <= Y_AXIS; a++){
+    SCM l = get_elt_property (onames[a]);
+
+    if (scm_ilength (l) >=0)
+      {
+       dim_cache_[a].offset_callbacks_ = l;
+       dim_cache_[a].offsets_left_ = scm_ilength (l);
+      }
+    else
+      {
+       programming_error ("[XY]-offset-callbacks must be a list");
+      }
+
+    SCM cb = get_elt_property (enames[a]);
+
+    /*
+      Should change default to be empty? 
+     */
+    if (!gh_procedure_p (cb) && !gh_pair_p (cb))
+      cb = molecule_extent_proc;
+    
+    dim_cache_[a].dimension_ = cb;
+  }
 }
 
 
@@ -338,8 +347,8 @@ Score_element::add_dependency (Score_element*e)
 {
   if (e)
     {
-      Pointer_group_interface gi (this, "dependencies");
-      gi.add_element (e);
+      Pointer_group_interface ::add_element (this, "dependencies",e);
+
     }
   else
     programming_error ("Null dependency added");
@@ -569,9 +578,19 @@ Score_element::empty_b (Axis a)const
            gh_procedure_p (dim_cache_[a].dimension_ ));
 }
 
+/*
+  TODO: add
+
+    Score_element *refpoint
+
+  to arguments?
+ */
 Interval
-Score_element::extent (Axis a) const
+Score_element::extent (Score_element * refp, Axis a) const
 {
+  Real x = relative_coordinate (refp, a);
+
+  
   Dimension_cache * d = (Dimension_cache *)&dim_cache_[a];
   Interval ext ;   
   if (gh_pair_p (d->dimension_))
@@ -610,6 +629,8 @@ Score_element::extent (Axis a) const
       ext.unite (Interval (s * gh_scm2double (gh_car (extra)),
                           s * gh_scm2double (gh_cdr (extra))));
     }
+
+  ext.translate (x);
   
   return ext;
 }
index e4a1989c6919e87ddde0d147db8aebd739386b63..6247c6a9109f1876c5805a9e1df4facab0d0ae79 100644 (file)
@@ -18,8 +18,7 @@ Script_column::add_staff_sided (Score_element *me, Item *i)
   if (!gh_number_p (p))
     return;
 
-  Pointer_group_interface gi (me, "scripts");
-  gi.add_element (i);
+  Pointer_group_interface::add_element (me, "scripts",i);
   
   me->add_dependency (i);
 }
index 644366f5a9917a01065329a68bc7834f0295bbd4..6c9c628e997c2981b8055f938f4f8bcbf9bc70da 100644 (file)
@@ -98,7 +98,7 @@ Separating_group_spanner::set_spacing_rods (SCM smob)
 void
 Separating_group_spanner::add_spacing_unit (Score_element* me ,Item*i)
 {
-  Pointer_group_interface (me, "elements").add_element (i);
+  Pointer_group_interface::add_element (me, "elements",i);
   me->add_dependency (i);
 }
 
index fa73f2f4bd6f142a8ab4dcbf2369b1706b2bf115..ce426d8dcfd70bf14eb7904a436fbf691ccf8f59 100644 (file)
@@ -23,7 +23,7 @@ void
 Separation_item::add_item (Score_element*s,Item* i)
 {
   assert (i);
-  Pointer_group_interface (s).add_element (i);
+  Pointer_group_interface::add_element (s,"elements",i);
   s->add_dependency (i);
 }
 
@@ -53,11 +53,10 @@ Separation_item::my_width (Score_element *me)
          continue;
        }
 
-      Interval iv (il->extent (X_AXIS));
+      Interval iv (il->extent (pc, X_AXIS));
       if (!iv.empty_b ())
        {
-         Real off = il->relative_coordinate (pc, X_AXIS);
-         w.unite  (iv + off);
+         w.unite  (iv);
        }
     }
 
index 9ad3f6f3c4e0a2499245fd959f10196bbf0571a9..756993387e61f3c3f4f175f5c2f1a4c9de09c8a4 100644 (file)
@@ -18,7 +18,7 @@
 void
 Side_position::add_support (Score_element*me, Score_element*e)
 {
-  Pointer_group_interface (me, "side-support-elements").add_element (e);
+  Pointer_group_interface::add_element (me, "side-support-elements",e);
 }
 
 
@@ -74,9 +74,7 @@ Side_position::side_position (SCM element_smob, SCM axis)
       Score_element * e  = unsmob_element ( gh_car (s));
       if (e)
        {
-         Real coord = e->relative_coordinate (common, a);
-
-         dim.unite (coord + e->extent (a));
+         dim.unite (e->extent (common, a));
        }
     }
 
@@ -122,7 +120,7 @@ Side_position::aligned_on_self (SCM element_smob, SCM axis)
   SCM align (me->get_elt_property (s.ch_C()));
   if (gh_number_p (align))
     {
-      Interval ext(me->extent (a));
+      Interval ext(me->extent (me,a));
 
       if (ext.empty_b ())
        {
@@ -199,7 +197,7 @@ Side_position::aligned_side (SCM element_smob, SCM axis)
   Direction d = Side_position::get_direction (me);
   Real o = gh_scm2double (side_position (element_smob,axis));
 
-  Interval iv =  me->extent (a);
+  Interval iv =  me->extent (me, a);
 
   if (!iv.empty_b ())
     {
@@ -223,7 +221,7 @@ Side_position::centered_on_parent (SCM element_smob, SCM axis)
   Axis a = (Axis) gh_scm2int (axis);
   Score_element *him = me->parent_l (a);
 
-  return gh_double2scm (him->extent (a).center ());  
+  return gh_double2scm (him->extent (him,a).center ());  
 }
 
 
index 4a86f7c96f17285f536cebe84ac19d6a97a4795c..38d163fde7e562c2c1fcc9e313cb53fb02743cb0 100644 (file)
@@ -48,7 +48,7 @@ Slur::add_column (Score_element*me, Score_element*n)
     warning (_ ("Putting slur over rest.  Ignoring."));
   else
     {
-      Pointer_group_interface (me, "note-columns").add_element (n);
+      Pointer_group_interface::add_element (me, "note-columns",n);
       me->add_dependency (n);
     }
 
@@ -238,7 +238,7 @@ Slur::get_attachment (Score_element*me,Direction dir,
              /*
                Default position is centered in X, on outer side of head Y
               */
-             o += Offset (0.5 * n->extent (X_AXIS).length (),
+             o += Offset (0.5 * n->extent (n,X_AXIS).length (),
                           0.5 * ss * Directional_element_interface::get (me));
            }
          else if (str == "alongside-stem")
@@ -247,7 +247,7 @@ Slur::get_attachment (Score_element*me,Direction dir,
              /*
                Default position is on stem X, on outer side of head Y
               */
-             o += Offset (n->extent (X_AXIS).length ()
+             o += Offset (n->extent (n,X_AXIS).length ()
                           * (1 + Stem::get_direction (stem)),
                           0.5 * ss * Directional_element_interface::get (me));
            }
@@ -258,8 +258,8 @@ Slur::get_attachment (Score_element*me,Direction dir,
                Default position is on stem X, at stem end Y
               */
              o += Offset (0.5 *
-                          (n->extent (X_AXIS).length ()
-                           - stem->extent (X_AXIS).length ())
+                          (n->extent (n,X_AXIS).length ()
+                           - stem->extent (stem,X_AXIS).length ())
                            * (1 + Stem::get_direction (stem)),
                            0);
            }
@@ -335,18 +335,16 @@ Slur::encompass_offset (Score_element*me,
     Simply set x to middle of notehead
    */
 
-  o[X_AXIS] -= 0.5 * stem_dir * col->extent (X_AXIS).length ();
+  o[X_AXIS] -= 0.5 * stem_dir * col->extent (col,X_AXIS).length ();
 
   if ((stem_dir == dir)
-      && !stem_l->extent (Y_AXIS).empty_b ())
+      && !stem_l->extent (stem_l, Y_AXIS).empty_b ())
     {
-      o[Y_AXIS] = stem_l->relative_coordinate (common[Y_AXIS], Y_AXIS); // iuhg
-      o[Y_AXIS] += stem_l->extent (Y_AXIS)[dir];
+      o[Y_AXIS] = stem_l->extent (common[Y_AXIS], Y_AXIS)[dir];
     }
   else
     {
-      o[Y_AXIS] = col->relative_coordinate (common[Y_AXIS], Y_AXIS);   // ugh
-      o[Y_AXIS] += col->extent (Y_AXIS)[dir];
+      o[Y_AXIS] = col->extent (common[Y_AXIS], Y_AXIS)[dir];
     }
 
   /*
@@ -465,6 +463,10 @@ Slur::brew_molecule (SCM smob)
     gh_scm2double (me->get_elt_property ("thickness"));
   Bezier one = get_curve (me);
 
+  // get_curve may suicide
+  if (!scm_ilength (me->get_elt_property ("note-columns")))
+    return SCM_EOL;
+
   Molecule a;
   SCM d =  me->get_elt_property ("dashed");
   if (gh_number_p (d))
@@ -532,7 +534,10 @@ Slur::set_control_points (Score_element*me)
        All these null control-points, where do they all come from?
       */
       if (i && b.control_[i][X_AXIS] == 0)
-       me->suicide ();
+       {
+         me->suicide ();
+         return;
+       }
     }
 
   me->set_elt_property ("control-points", controls);
@@ -545,12 +550,17 @@ Slur::get_curve (Score_element*me)
   int i = 0;
 
   if (!Directional_element_interface::get (me)
-      || ! gh_symbol_p (index_cell (me->get_elt_property ("attachment"), LEFT)))
+      || ! gh_symbol_p (index_cell (me->get_elt_property ("attachment"), LEFT))
+      || ! gh_symbol_p (index_cell (me->get_elt_property ("attachment"), RIGHT)))
     set_extremities (me);
   
   if (!gh_pair_p (me->get_elt_property ("control-points")))
     set_control_points (me);
 
+  // set_control_points may suicide
+  if (!scm_ilength (me->get_elt_property ("note-columns")))
+    return b;
+
   for (SCM s= me->get_elt_property ("control-points"); s != SCM_EOL; s = gh_cdr (s))
     {
       b.control_[i] = ly_scm2offset (gh_car (s));
index 189b54ff999e7cb2943a5ed74b4914dd54fa0670..533bf5298a050343bde4923d0f778a3d40158df5 100644 (file)
@@ -20,8 +20,7 @@
 void
 Span_bar::add_bar (Score_element*me, Score_element*b)
 {
-  Pointer_group_interface gi (me);
-  gi.add_element (b);
+  Pointer_group_interface::add_element (me,"elements", b);
 
   me->add_dependency (b);
 }
index 184c253b9ca6dd38e6ec480c727098297491c452..40d6710d026f9f1430625d7c1cdd207fe344547d 100644 (file)
@@ -198,7 +198,7 @@ Spanner::set_bound(Direction d, Score_element*s)
   */
   if (dynamic_cast<Paper_column*> (i))
     {
-      Pointer_group_interface (i, "bounded-by-me").add_element (this);  
+      Pointer_group_interface::add_element (i, "bounded-by-me",this);  
     }
 }
 
@@ -286,7 +286,7 @@ Spanner::get_broken_left_end_align () const
        But that doesn't make a difference, since the Paper_column
        is likely to contain only a Break_align_item.
       */
-      return sc->extent (X_AXIS)[RIGHT];
+      return sc->extent (sc, X_AXIS)[RIGHT];
     }
 
   return 0.0;
index 58fd950b6779e087f65c5e63c6321d0a02b0245d..a7fe2500b3880625a2255b113cc89edcacf9a020 100644 (file)
@@ -150,8 +150,7 @@ Stem::support_head (Score_element*me)
 int
 Stem::heads_i (Score_element*me)
 {
-  Pointer_group_interface gi (me, "heads");
-  return gi.count ();
+  return  Pointer_group_interface::count (me, "heads");
 }
 
 /*
@@ -205,7 +204,7 @@ Stem::add_head (Score_element*me, Score_element *n)
 
   if (Note_head::has_interface (n))
     {
-      Pointer_group_interface (me, "heads").add_element (n);
+      Pointer_group_interface::add_element (me, "heads",n);
     }
   else
     {
@@ -334,10 +333,11 @@ Stem::position_noteheads (Score_element*me)
     heads.reverse ();
 
 
-  Real w = support_head (me)->extent (X_AXIS)[dir];
+  Score_element *hed = support_head (me);
+  Real w = hed->extent (hed, X_AXIS)[dir];
   for (int i=0; i < heads.size (); i++)
     {
-      heads[i]->translate_axis (w - heads[i]->extent (X_AXIS)[dir], X_AXIS);
+      heads[i]->translate_axis (w - heads[i]->extent (heads[i], X_AXIS)[dir], X_AXIS);
     }
   
   bool parity= true;           // todo: make me settable.
@@ -351,7 +351,7 @@ Stem::position_noteheads (Score_element*me)
        {
          if (parity)
            {
-             Real l  = heads[i]->extent (X_AXIS).length ();
+             Real l = heads[i]->extent (heads[i], X_AXIS).length ();
              heads[i]->translate_axis (l * get_direction (me), X_AXIS);
            }
          parity = !parity;
@@ -400,10 +400,7 @@ Stem::set_spacing_hints (Score_element*me)
       Item* item = dynamic_cast<Item*> (me);
       Item * col =  item->column_l ();
       SCM dirlist =col->get_elt_property ("dir-list");
-      if (dirlist == SCM_UNDEFINED)
-       dirlist = SCM_EOL;
-
-      if (scm_sloppy_memq (scmdir, dirlist) == SCM_EOL)
+      if (scm_sloppy_memq (scmdir, dirlist) == SCM_BOOL_F)
        {
          dirlist = gh_cons (scmdir, dirlist);
          col->set_elt_property ("dir-list", dirlist);
@@ -466,8 +463,9 @@ Stem::brew_molecule (SCM smob)
 
   Real dy = Staff_symbol_referencer::staff_space (me)/2.0;
   Real head_wid = 0;
-  if (support_head (me))
-    head_wid = support_head (me)->extent (X_AXIS).length ();
+  
+  if (Score_element *hed = support_head (me))
+    head_wid = hed->extent (hed,X_AXIS).length ();
   stem_y[Direction(-d)] += d * head_wid * tan(ANGLE)/(2*dy);
   
   if (!invisible_b (me))
@@ -490,14 +488,14 @@ Stem::brew_molecule (SCM smob)
 
 MAKE_SCHEME_CALLBACK(Stem,off_callback,2);
 SCM
-Stem::off_callback (SCM element_smob, SCM axis)
+Stem::off_callback (SCM element_smob, SCM )
 {
   Score_element *me = unsmob_element (element_smob);
-
+  
   Real r=0;
   if (Score_element * f = first_head (me))
     {
-      Interval head_wid(0, f->extent (X_AXIS).length ());
+      Interval head_wid(0, f->extent (f,X_AXIS).length ());
 
       if (to_boolean (me->get_elt_property ("stem-centered")))
        return gh_double2scm ( head_wid.center ());
index 0a89d2edc45d225acd732b8c6f802f69fe858536..a6955147cbadc6e8af2ec8092ab860210025f295 100644 (file)
@@ -40,7 +40,7 @@ System_start_delimiter_engraver::acknowledge_element (Score_element_info inf)
        don't add as Axis_group_interface::add_element (delim_, ),
        because that would set the parent as well */
          
-      Pointer_group_interface (delim_).add_element (inf.elem_l_);
+      Pointer_group_interface::add_element (delim_, "elements", inf.elem_l_);
     }
   else if (System_start_delimiter::has_interface (inf.elem_l_))
     {
index 32d6f4a1add79311731ee8bc9b9dc6aced65de3e..4d68c240747982d982756037a5c306f6135b2f79 100644 (file)
@@ -33,14 +33,14 @@ Tie_column::has_interface (Score_element*me)
 void
 Tie_column::add_tie (Score_element*me,Score_element *s)
 {
-  Pointer_group_interface g (me, "ties");
-  if (!g.count ())
+
+  if (!  Pointer_group_interface ::count (me, "ties"))
     {
       dynamic_cast<Spanner*> (me)->set_bound (LEFT, Tie::head (s,LEFT));
       dynamic_cast<Spanner*> (me)->set_bound (RIGHT, Tie::head (s,RIGHT));
     }
   
-  Pointer_group_interface (me, "ties").add_element (s);
+  Pointer_group_interface::add_element (me, "ties",s);
   s->add_dependency (me);
 }
 
index 9a2e596b7c606e9aa160a5860c066021c3a4fd2f..b35fb98b65af18a751447c15e392855b2e02c13a 100644 (file)
@@ -66,7 +66,7 @@ Tuplet_spanner::brew_molecule (SCM smob)
       Link_array<Score_element> column_arr=
        Pointer_group_interface__extract_elements (me, (Score_element*)0, "columns");
        
-      Real ncw = column_arr.top ()->extent(X_AXIS).length ();
+      Real ncw = column_arr.top ()->extent(column_arr.top (), X_AXIS).length ();
       Real w = dynamic_cast<Spanner*>(me)->spanner_length () + ncw;
 
       Real staff_space = me->paper_l ()->get_var ("staffspace");
@@ -143,8 +143,8 @@ Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real *
   
   if (l < r)
     {
-      *dy = column_arr[r]->extent (Y_AXIS) [d] + column_arr[r]->relative_coordinate (commony, Y_AXIS)
-       - column_arr[l]->extent (Y_AXIS) [d] - column_arr[l]->relative_coordinate (commony, Y_AXIS);
+      *dy = column_arr[r]->extent (commony, Y_AXIS) [d]
+       - column_arr[l]->extent (commony, Y_AXIS) [d] ;
     }
   else
     * dy = 0;
@@ -162,8 +162,7 @@ Tuplet_spanner::calc_position_and_height (Score_element*me,Real *offset, Real *
   
   for (int i = 0; i < column_arr.size ();  i++)
     {
-      Real notey = column_arr[i]->extent (Y_AXIS)[d] 
-       + column_arr[i]->relative_coordinate (commony, Y_AXIS)
+      Real notey = column_arr[i]->extent (commony, Y_AXIS)[d] 
        - me->relative_coordinate (commony, Y_AXIS);
 
       Real x = column_arr[i]->relative_coordinate (commonx, X_AXIS) - x0;
@@ -182,10 +181,13 @@ Tuplet_spanner::calc_dy (Score_element*me,Real * dy)
 {
   Link_array<Score_element> column_arr=
     Pointer_group_interface__extract_elements (me, (Score_element*)0, "columns");
+
+  /*
+    ugh. refps.
+   */
   Direction d = Directional_element_interface::get (me);
-  *dy = column_arr.top ()->extent (Y_AXIS) [d]
-    - column_arr[0]->extent (Y_AXIS) [d];
+  *dy = column_arr.top ()->extent (column_arr.top (), Y_AXIS) [d]
+    - column_arr[0]->extent (column_arr[0], Y_AXIS) [d];
 }
 MAKE_SCHEME_CALLBACK(Tuplet_spanner,after_line_breaking,1);
 
@@ -263,15 +265,13 @@ void
 Tuplet_spanner::add_beam (Score_element*me, Score_element *b)
 {
   me->add_dependency (b);
-  Pointer_group_interface gi (me, "beams");
-  gi.add_element (b);
+  Pointer_group_interface::add_element (me, "beams",b);
 }
 
 void
 Tuplet_spanner::add_column (Score_element*me, Item*n)
 {
-  Pointer_group_interface gi (me, "columns");
-  gi.add_element (n);
+  Pointer_group_interface::add_element (me, "columns",n);
   me->add_dependency (n);
 
   add_bound_item (dynamic_cast<Spanner*> (me), n);
index 7467464a63a67284923773ec5bb78af5bac9f979..b2b42ac4f5dc479c27231d6d5be6c6d0f64d085b 100644 (file)
@@ -103,9 +103,7 @@ Volta_spanner::brew_molecule (SCM smob)
 void
 Volta_spanner::add_bar  (Score_element *me, Item* b)
 {
-  Pointer_group_interface gi(me, "bars");
-  gi.add_element (b);
-
+  Pointer_group_interface::add_element(me, "bars",b);
   Side_position::add_support (me,b);
   add_bound_item (dynamic_cast<Spanner*>(me), b); 
 }