]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/side-position-interface.cc
doc fixes, rune pats
[lilypond.git] / lily / side-position-interface.cc
index 701e415feef054c06d0f821cde6341706f90860d..b1d5c190e1c0524dd58f35af4f21e143ae464041 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1998--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1998--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 #include <math.h>              // ceil.
   
  */
 #include <math.h>              // ceil.
@@ -19,7 +19,7 @@
 void
 Side_position_interface::add_support (Grob*me, Grob*e)
 {
 void
 Side_position_interface::add_support (Grob*me, Grob*e)
 {
-  Pointer_group_interface::add_element (me, "side-support-elements",e);
+  Pointer_group_interface::add_grob (me, ly_symbol2scm ("side-support-elements"), e);
 }
 
 
 }
 
 
@@ -28,28 +28,28 @@ Direction
 Side_position_interface::get_direction (Grob*me)
 {
   SCM d = me->get_grob_property ("direction");
 Side_position_interface::get_direction (Grob*me)
 {
   SCM d = me->get_grob_property ("direction");
-  if (isdir_b (d) && to_dir (d))
+  if (ly_dir_p (d) && to_dir (d))
     return to_dir (d);
 
   Direction relative_dir = Direction (1);
   SCM reldir = me->get_grob_property ("side-relative-direction");      // should use a lambda.
     return to_dir (d);
 
   Direction relative_dir = Direction (1);
   SCM reldir = me->get_grob_property ("side-relative-direction");      // should use a lambda.
-  if (isdir_b (reldir))
+  if (ly_dir_p (reldir))
     {
       relative_dir = to_dir (reldir);
     }
   
   SCM other_elt = me->get_grob_property ("direction-source");
     {
       relative_dir = to_dir (reldir);
     }
   
   SCM other_elt = me->get_grob_property ("direction-source");
-  Grob * e = unsmob_grob(other_elt);
+  Grob * e = unsmob_grob (other_elt);
   if (e)
     {
   if (e)
     {
-      return (Direction)(relative_dir * Directional_element_interface::get (e));
+      return (Direction) (relative_dir * Directional_element_interface::get (e));
     }
   
   return CENTER;
 }
   
 
     }
   
   return CENTER;
 }
   
 
-MAKE_SCHEME_CALLBACK(Side_position_interface,aligned_on_support_extents, 2);
+MAKE_SCHEME_CALLBACK (Side_position_interface,aligned_on_support_extents, 2);
 SCM
 Side_position_interface::aligned_on_support_extents (SCM element_smob, SCM axis)
 {
 SCM
 Side_position_interface::aligned_on_support_extents (SCM element_smob, SCM axis)
 {
@@ -67,19 +67,24 @@ Side_position_interface::aligned_on_support_extents (SCM element_smob, SCM axis)
 SCM
 Side_position_interface::general_side_position (Grob * me, Axis a, bool use_extents)
 {
 SCM
 Side_position_interface::general_side_position (Grob * me, Axis a, bool use_extents)
 {
-  Grob *common = me->parent_l (a);
+
+
+  /*
+    As this is only used as a callback, this is called only once. We
+    could wipe SIDE-SUPPORT-ELEMENTS after we retrieve it to conserve
+    memory; however -- we should look more into benefits of such actions?
+
+    The benefit is small, it seems: total GC times taken don't
+    differ. Would this also hamper Generational GC ?
+    
+  */
   SCM support = me->get_grob_property ("side-support-elements");
   SCM support = me->get_grob_property ("side-support-elements");
-  for (SCM s = support; s != SCM_EOL; s = gh_cdr (s))
-    {
-      Grob * e  = unsmob_grob (gh_car (s));
-      if (e)
-       common = common->common_refpoint (e, a);
-    }
+  Grob *common = common_refpoint_of_list (support, me->get_parent (a), a);
   
   Interval dim;
   
   Interval dim;
-  for (SCM s = support; s != SCM_EOL; s = gh_cdr (s))
+  for (SCM s = support; s != SCM_EOL; s = ly_cdr (s))
     {
     {
-      Grob * e  = unsmob_grob ( gh_car (s));
+      Grob * e  = unsmob_grob (ly_car (s));
       if (e)
        if (use_extents)
          dim.unite (e->extent (common, a));
       if (e)
        if (use_extents)
          dim.unite (e->extent (common, a));
@@ -92,12 +97,12 @@ Side_position_interface::general_side_position (Grob * me, Axis a, bool use_exte
 
   if (dim.empty_b ())
     {
 
   if (dim.empty_b ())
     {
-      dim = Interval(0,0);
+      dim = Interval (0,0);
     }
 
   Direction dir = Side_position_interface::get_direction (me);
     
     }
 
   Direction dir = Side_position_interface::get_direction (me);
     
-  Real off =  me->parent_l (a)->relative_coordinate (common, a);
+  Real off =  me->get_parent (a)->relative_coordinate (common, a);
   SCM minimum = me->remove_grob_property ("minimum-space");
 
   Real total_off = dim.linear_combination (dir) + off;
   SCM minimum = me->remove_grob_property ("minimum-space");
 
   Real total_off = dim.linear_combination (dir) + off;
@@ -123,7 +128,7 @@ Side_position_interface::general_side_position (Grob * me, Axis a, bool use_exte
 /*
   Cut & paste (ugh.)
  */
 /*
   Cut & paste (ugh.)
  */
-MAKE_SCHEME_CALLBACK(Side_position_interface,aligned_on_support_refpoints,2);
+MAKE_SCHEME_CALLBACK (Side_position_interface,aligned_on_support_refpoints,2);
 SCM
 Side_position_interface::aligned_on_support_refpoints (SCM smob, SCM axis)
 {
 SCM
 Side_position_interface::aligned_on_support_refpoints (SCM smob, SCM axis)
 {
@@ -134,41 +139,6 @@ Side_position_interface::aligned_on_support_refpoints (SCM smob, SCM axis)
 }
 
 
 }
 
 
-/**
-  callback that centers the element on itself
- */
-MAKE_SCHEME_CALLBACK(Side_position_interface,aligned_on_self,2);
-SCM
-Side_position_interface::aligned_on_self (SCM element_smob, SCM axis)
-{
-  Grob *me = unsmob_grob (element_smob);
-  Axis a = (Axis) gh_scm2int (axis);
-  String s ("self-alignment-");
-
-  s +=  (a == X_AXIS) ? "X" : "Y";
-
-  SCM align (me->get_grob_property (s.ch_C()));
-  if (gh_number_p (align))
-    {
-      Interval ext(me->extent (me,a));
-
-      if (ext.empty_b ())
-       {
-         programming_error ("I'm empty. Can't align on self");
-         return gh_double2scm (0.0);
-       }
-      else
-       {
-         return gh_double2scm (- ext.linear_combination (gh_scm2double (align)));
-       }
-    }
-  else if (unsmob_grob (align))
-    {
-      return gh_double2scm (- unsmob_grob (align)->relative_coordinate (me,  a));
-    }
-    return gh_double2scm (0.0);
-}
-
 
 
 Real
 
 
 Real
@@ -185,10 +155,10 @@ directed_round (Real f, Direction d)
   of the elements "direction" elt property.
 
   Only rounds when we're inside the staff, as determined by
   of the elements "direction" elt property.
 
   Only rounds when we're inside the staff, as determined by
-  Staff_symbol_referencer::staff_radius() */
-MAKE_SCHEME_CALLBACK(Side_position_interface,quantised_position,2);
+  Staff_symbol_referencer::staff_radius () */
+MAKE_SCHEME_CALLBACK (Side_position_interface,quantised_position,2);
 SCM
 SCM
-Side_position_interface::quantised_position (SCM element_smob, SCM )
+Side_position_interface::quantised_position (SCM element_smob, SCM)
 {
   Grob *me = unsmob_grob (element_smob);
   
 {
   Grob *me = unsmob_grob (element_smob);
   
@@ -200,7 +170,7 @@ Side_position_interface::quantised_position (SCM element_smob, SCM )
       Real p = Staff_symbol_referencer::position_f (me);
       Real rp = directed_round (p, d);
       Real rad = Staff_symbol_referencer::staff_radius (me) *2 ;
       Real p = Staff_symbol_referencer::position_f (me);
       Real rp = directed_round (p, d);
       Real rad = Staff_symbol_referencer::staff_radius (me) *2 ;
-      int ip = int  (rp);
+      int ip = int (rp);
 
       if (abs (ip) <= rad && Staff_symbol_referencer::on_staffline (me,ip))
        {
 
       if (abs (ip) <= rad && Staff_symbol_referencer::on_staffline (me,ip))
        {
@@ -216,7 +186,7 @@ Side_position_interface::quantised_position (SCM element_smob, SCM )
 /*
   Position next to support, taking into account my own dimensions and padding.
  */
 /*
   Position next to support, taking into account my own dimensions and padding.
  */
-MAKE_SCHEME_CALLBACK(Side_position_interface,aligned_side,2);
+MAKE_SCHEME_CALLBACK (Side_position_interface,aligned_side,2);
 SCM
 Side_position_interface::aligned_side (SCM element_smob, SCM axis)
 {
 SCM
 Side_position_interface::aligned_side (SCM element_smob, SCM axis)
 {
@@ -224,12 +194,18 @@ Side_position_interface::aligned_side (SCM element_smob, SCM axis)
   Axis a = (Axis) gh_scm2int (axis);
   
   Direction d = Side_position_interface::get_direction (me);
   Axis a = (Axis) gh_scm2int (axis);
   
   Direction d = Side_position_interface::get_direction (me);
+  
   Real o = gh_scm2double (aligned_on_support_extents (element_smob,axis));
 
   Interval iv =  me->extent (me, a);
 
   if (!iv.empty_b ())
     {
   Real o = gh_scm2double (aligned_on_support_extents (element_smob,axis));
 
   Interval iv =  me->extent (me, a);
 
   if (!iv.empty_b ())
     {
+      if (!d)
+       {
+         programming_error ("Direction unknown, but aligned-side wanted.");
+         d = DOWN;
+       }
       o += - iv[-d];
 
       SCM pad = me->get_grob_property ("padding");
       o += - iv[-d];
 
       SCM pad = me->get_grob_property ("padding");
@@ -239,26 +215,11 @@ Side_position_interface::aligned_side (SCM element_smob, SCM axis)
   return gh_double2scm (o);
 }
 
   return gh_double2scm (o);
 }
 
-/*
-  Position centered on parent.
- */
-MAKE_SCHEME_CALLBACK(Side_position_interface,centered_on_parent,2);
-SCM
-Side_position_interface::centered_on_parent (SCM element_smob, SCM axis)
-{
-  Grob *me = unsmob_grob (element_smob);
-  Axis a = (Axis) gh_scm2int (axis);
-  Grob *him = me->parent_l (a);
-
-  return gh_double2scm (him->extent (him,a).center ());  
-}
-
-
 void
 Side_position_interface::add_staff_support (Grob*me)
 {
   Grob* st = Staff_symbol_referencer::staff_symbol_l (me);
 void
 Side_position_interface::add_staff_support (Grob*me)
 {
   Grob* st = Staff_symbol_referencer::staff_symbol_l (me);
-  if (st)
+  if (st && get_axis (me) == Y_AXIS)
     {
       add_support (me,st);
     }
     {
       add_support (me,st);
     }
@@ -302,17 +263,20 @@ Side_position_interface::set_padding (Grob*me, Real p)
   me->set_grob_property ("padding", gh_double2scm (p));
 }
 
   me->set_grob_property ("padding", gh_double2scm (p));
 }
 
-bool
-Side_position_interface::has_interface (Grob*me) 
-{
-  return me->has_interface (ly_symbol2scm ("side-position-interface"));
-}
 
 bool
 Side_position_interface::supported_b (Grob*me) 
 {
 
 bool
 Side_position_interface::supported_b (Grob*me) 
 {
-  SCM s = me->get_grob_property  ("side-support-elements"); 
-  return gh_pair_p(s);
+  SCM s = me->get_grob_property ("side-support-elements"); 
+  return gh_pair_p (s);
 }
 
 
 }
 
 
+
+
+ADD_INTERFACE (Side_position_interface,"side-position-interface",
+  "Position a victim object (this one) next to other objects (the
+support).  In this case, the direction signifies where to put the
+victim object relative to the support (left or right, up or down?)
+",
+  "side-support-elements direction-source direction side-relative-direction minimum-space padding");