]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/break-align-item.cc
patch::: 1.3.96.jcn9
[lilypond.git] / lily / break-align-item.cc
index 53b6eaa23233e37aac26c9bed67ec4b2ae4e3290..1ffdb1325c7fab7e08d9a14ce46d6705c111237b 100644 (file)
@@ -1,5 +1,5 @@
 /*
-  break-align-item.cc -- implement Break_align_item
+  break-align-item.cc -- implement Break_align_interface
 
   source file of the GNU LilyPond music typesetter
 
 #include "group-interface.hh"
 #include "align-interface.hh"
 
-MAKE_SCHEME_CALLBACK(Break_align_item,before_line_breaking);
+MAKE_SCHEME_CALLBACK(Break_align_interface,before_line_breaking,1);
 
 SCM
-Break_align_item::before_line_breaking (SCM smob)
+Break_align_interface::before_line_breaking (SCM smob)
 {
   Score_element* me = unsmob_element (smob);
   do_alignment (me);
-  return SCM_UNDEFINED;
+  return SCM_UNSPECIFIED;
 }
+MAKE_SCHEME_CALLBACK(Break_align_interface,alignment_callback,2);
 
-Real
-Break_align_item::alignment_callback (Score_element*c, Axis a)
+SCM
+Break_align_interface::alignment_callback (SCM element_smob, SCM axis)
 {
+  Score_element *me = unsmob_element (element_smob);
+  Axis a = (Axis) gh_scm2int (axis);
+
   assert (a == X_AXIS);
-  Score_element *par = c->parent_l (a);
+  Score_element *par = me->parent_l (a);
   if (par && !to_boolean (par->get_elt_property ("break-alignment-done")))\
     {
       par->set_elt_property ("break-alignment-done", SCM_BOOL_T);
-      Break_align_item::do_alignment (par);
+      Break_align_interface::do_alignment (par);
     }
     
-  return 0.0;
+  return gh_double2scm (0);
+}
+
+MAKE_SCHEME_CALLBACK(Break_align_interface,self_align_callback,2);
+SCM
+Break_align_interface::self_align_callback (SCM element_smob, SCM axis)
+{
+  Score_element *me = unsmob_element (element_smob);
+  Axis a = (Axis) gh_scm2int (axis);
+  assert (a == X_AXIS);
+  
+  Item* item = dynamic_cast<Item*> (me);
+  Direction bsd = item->break_status_dir();
+  if (bsd == LEFT)
+    {
+      me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT));
+    }
+
+  return Side_position::aligned_on_self (element_smob, axis);  
 }
 
 void
-Break_align_item::add_element (Score_element*me, Score_element *toadd)
+Break_align_interface::add_element (Score_element*me, Score_element *toadd)
 {
-  toadd->add_offset_callback (alignment_callback, X_AXIS);
   Axis_group_interface::add_element (me, toadd);
 }
 
 void
-Break_align_item::do_alignment (Score_element *me)
+Break_align_interface::do_alignment (Score_element *me)
 {
   Item * item = dynamic_cast<Item*> (me);
   Item *column = item->column_l ();
-  if (item->break_status_dir() == LEFT)
-    {
-      me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT));
-    }
-  else
-    {
-      me->add_offset_callback (Align_interface::center_on_element, X_AXIS);
-    }
 
-  Real interline= me->paper_l ()->get_var ("interline");       
+  Real interline= me->paper_l ()->get_var ("staffspace");      
   Link_array<Score_element> elems;
   Link_array<Score_element> all_elems
     = Pointer_group_interface__extract_elements (me, (Score_element*)0,
@@ -74,7 +87,7 @@ Break_align_item::do_alignment (Score_element *me)
   
   for (int i=0; i < all_elems.size(); i++) 
     {
-      Interval y = all_elems[i]->extent(X_AXIS);
+      Interval y = all_elems[i]->extent(all_elems[i], X_AXIS);
       if (!y.empty_b())
        elems.push (dynamic_cast<Score_element*> (all_elems[i]));
     }
@@ -97,18 +110,18 @@ Break_align_item::do_alignment (Score_element *me)
        {
          next_origin = next_elt->get_elt_property ("break-align-symbol");
          next_origin =
-           (next_origin == SCM_UNDEFINED)
-           ? ly_symbol2scm ("none")
-           : next_origin;
+           gh_symbol_p (next_origin)? 
+           next_origin : ly_symbol2scm ("none")
+;
        }
       else
        next_origin = ly_symbol2scm ("begin-of-note");
-      
+
+      SCM alist = me->get_elt_property ("space-alist");
       SCM e = scm_assoc (scm_listify (current_origin,
                                      next_origin,
-                                     SCM_UNDEFINED),
-                        scm_eval (ly_symbol2scm ("space-alist")));
-      
+                                     SCM_UNDEFINED), alist);
+          
       SCM extra_space;
       if (e != SCM_BOOL_F)
        {
@@ -162,13 +175,13 @@ Break_align_item::do_alignment (Score_element *me)
 
   Real pre_space = elems[0]->relative_coordinate (column, X_AXIS);
 
-  Real xl = elems[0]->extent (X_AXIS)[LEFT];
+  Real xl = elems[0]->extent (elems[0],X_AXIS)[LEFT];
   if (!isinf (xl))
     pre_space += xl;
   else
     programming_error ("Infinity reached. ");
 
-  Real xr = elems.top ()->extent (X_AXIS)[RIGHT];
+  Real xr = elems.top ()->extent (elems.top (), X_AXIS)[RIGHT];
   Real spring_len = elems.top ()->relative_coordinate (column, X_AXIS);
   if (!isinf (xr))
     spring_len += xr;
@@ -206,10 +219,10 @@ Break_align_item::do_alignment (Score_element *me)
 
 
 void
-Break_align_item::set_interface (Score_element*me)
+Break_align_interface::set_interface (Score_element*me)
 {
   Align_interface::set_interface (me); 
   Align_interface::set_axis (me,X_AXIS);
 
-  me->add_offset_callback (Side_position::aligned_on_self, X_AXIS);
+
 }