X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbreak-align-item.cc;h=d8c5f6d2b230a10982e0b7319f37f6df00b8d1ce;hb=7181c77e5d46a271f5f76e99bee7f844611e23e4;hp=6e5722ca1282658e9bf4bb6c39ae18758fd02c5a;hpb=af343e2537468645e4fe97be4c560716be88a354;p=lilypond.git diff --git a/lily/break-align-item.cc b/lily/break-align-item.cc index 6e5722ca12..d8c5f6d2b2 100644 --- a/lily/break-align-item.cc +++ b/lily/break-align-item.cc @@ -1,44 +1,83 @@ /* - break-align-item.cc -- implement Break_align_item + break-align-item.cc -- implement Break_align_interface source file of the GNU LilyPond music typesetter (c) 1997--2000 Han-Wen Nienhuys */ + + #include #include #include "side-position-interface.hh" +#include "axis-group-interface.hh" #include "warn.hh" -#include "dimension-cache.hh" #include "lily-guile.hh" #include "break-align-item.hh" #include "dimensions.hh" -#include "paper-score.hh" #include "paper-def.hh" #include "paper-column.hh" #include "group-interface.hh" #include "align-interface.hh" -void -Break_align_item::before_line_breaking () +MAKE_SCHEME_CALLBACK(Break_align_interface,before_line_breaking); + +SCM +Break_align_interface::before_line_breaking (SCM smob) { - if (break_status_dir() == LEFT) + Score_element* me = unsmob_element (smob); + do_alignment (me); + return SCM_UNSPECIFIED; +} + +Real +Break_align_interface::alignment_callback (Score_element*c, Axis a) +{ + assert (a == X_AXIS); + Score_element *par = c->parent_l (a); + if (par && !to_boolean (par->get_elt_property ("break-alignment-done")))\ { - set_elt_property ("self-alignment-X", gh_int2scm (RIGHT)); + par->set_elt_property ("break-alignment-done", SCM_BOOL_T); + Break_align_interface::do_alignment (par); } - else + + return 0.0; +} + +Real +Break_align_interface::self_align_callback (Score_element *me, Axis a) +{ + assert (a == X_AXIS); + + Item* item = dynamic_cast (me); + Direction bsd = item->break_status_dir(); + if (bsd == LEFT) { - add_offset_callback (Align_interface::center_on_element, X_AXIS); + me->set_elt_property ("self-alignment-X", gh_int2scm (RIGHT)); } - + return Side_position::aligned_on_self (me, a); +} - Real interline= paper_l ()->get_var ("interline"); +void +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_interface::do_alignment (Score_element *me) +{ + Item * item = dynamic_cast (me); + Item *column = item->column_l (); + + Real interline= me->paper_l ()->get_var ("staffspace"); Link_array elems; Link_array all_elems - = Pointer_group_interface__extract_elements (this, (Score_element*)0, - "elements"); + = Pointer_group_interface__extract_elements (me, (Score_element*)0, + "elements"); for (int i=0; i < all_elems.size(); i++) { @@ -65,9 +104,9 @@ Break_align_item::before_line_breaking () { 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"); @@ -75,7 +114,7 @@ Break_align_item::before_line_breaking () SCM e = scm_assoc (scm_listify (current_origin, next_origin, SCM_UNDEFINED), - scm_eval (ly_symbol2scm ("space-alist"))); + scm_eval2 (ly_symbol2scm ("space-alist"), SCM_EOL)); SCM extra_space; if (e != SCM_BOOL_F) @@ -104,8 +143,7 @@ Break_align_item::before_line_breaking () symbol_list = gh_cdr (scm_reverse (symbol_list)); for (int i=0; i set_elt_property (sym_str, + elems[i]->set_elt_property (gh_car (symbol_list), scm_cons (gh_double2scm (0), gh_double2scm (dists[i+1]))); @@ -126,9 +164,10 @@ Break_align_item::before_line_breaking () /* Force callbacks for alignment to be called - */ - Real unused = elems[0]->relative_coordinate (this, X_AXIS); - Real pre_space = elems[0]->relative_coordinate (column_l (), X_AXIS); + */ + Align_interface::do_side_processing (me, X_AXIS); + + Real pre_space = elems[0]->relative_coordinate (column, X_AXIS); Real xl = elems[0]->extent (X_AXIS)[LEFT]; if (!isinf (xl)) @@ -137,7 +176,7 @@ Break_align_item::before_line_breaking () programming_error ("Infinity reached. "); Real xr = elems.top ()->extent (X_AXIS)[RIGHT]; - Real spring_len = elems.top ()->relative_coordinate (column_l (), X_AXIS); + Real spring_len = elems.top ()->relative_coordinate (column, X_AXIS); if (!isinf (xr)) spring_len += xr; else @@ -161,23 +200,23 @@ Break_align_item::before_line_breaking () The pairs are in the format of an interval (ie. CAR < CDR). */ - column_l ()->set_elt_property ("extra-space", - scm_cons (gh_double2scm (pre_space), - gh_double2scm (spring_len))); - - column_l ()->set_elt_property ("stretch-distance", - gh_cons (gh_double2scm (-dists[0]), - gh_double2scm (stretch_distance))); - + column->set_elt_property ("extra-space", + scm_cons (gh_double2scm (pre_space), + gh_double2scm (spring_len))); + + column->set_elt_property ("stretch-distance", + gh_cons (gh_double2scm (-dists[0]), + gh_double2scm (stretch_distance))); + + } -Break_align_item::Break_align_item (SCM s) - : Item (s) -{ - set_elt_property ("stacking-dir" , gh_int2scm (RIGHT)); - Align_interface (this).set_interface (); - Align_interface (this).set_axis (X_AXIS); +void +Break_align_interface::set_interface (Score_element*me) +{ + Align_interface::set_interface (me); + Align_interface::set_axis (me,X_AXIS); - add_offset_callback (Side_position_interface::aligned_on_self, X_AXIS); + me->add_offset_callback (Break_align_interface::self_align_callback, X_AXIS); }