2 break-align-item.cc -- implement Break_align_item
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
9 #include "dimension-cache.hh"
10 #include "lily-guile.hh"
11 #include "break-align-item.hh"
12 #include "dimensions.hh"
13 #include "paper-score.hh"
14 #include "paper-def.hh"
15 #include "paper-column.hh"
18 Handle spacing for prefatory matter.
20 TODO: rewrite this. It is kludgy
24 Break_align_item::do_pre_processing()
26 if (break_status_dir() == LEFT
)
33 Real interline
= paper_l ()->get_var ("interline");
35 Link_array
<Score_element
> elems
;
36 Link_array
<Score_element
> all_elems (elem_l_arr ());
38 for (int i
=0; i
< all_elems
.size(); i
++)
40 Interval y
= all_elems
[i
]->extent(axis ());
42 elems
.push (dynamic_cast<Score_element
*> (all_elems
[i
]));
48 SCM symbol_list
= SCM_EOL
;
50 SCM current_origin
= ly_str02scm ("");
51 for (int i
=0; i
<= elems
.size (); i
++)
53 Score_element
*next_elt
= i
< elems
.size ()
61 next_origin
= next_elt
->get_elt_property ("origin");
63 (next_origin
== SCM_UNDEFINED
)
68 next_origin
= ly_str02scm ("begin-of-note");
71 = scm_eval (scm_listify (ly_symbol2scm ("break-align-spacer"),
72 current_origin
, next_origin
, SCM_UNDEFINED
));
73 SCM symbol
= gh_car (extra_space
);
74 Real spc
= gh_scm2double (SCM_CADR(extra_space
));
78 symbol_list
= gh_cons (symbol
, symbol_list
);
79 current_origin
= next_origin
;
83 // skip the first sym.
84 symbol_list
= gh_cdr (scm_reverse (symbol_list
));
85 for (int i
=0; i
<elems
.size()-1; i
++)
87 String sym_str
= ly_symbol2string (gh_car (symbol_list
));
88 elems
[i
]->set_elt_property (sym_str
,
89 scm_cons (gh_double2scm (0),
90 gh_double2scm (dists
[i
+1])));
92 symbol_list
= gh_cdr (symbol_list
);
97 SCM first_pair
= elems
[0]->get_elt_property ("minimum-space");
98 if (gh_pair_p (first_pair
))
99 first_pair
= first_pair
;
101 first_pair
= gh_cons (gh_double2scm (0.0), gh_double2scm (0.0));
103 scm_set_car_x (first_pair
, gh_double2scm (-dists
[0]));
104 elems
[0]->set_elt_property ("minimum-space", first_pair
);
106 Axis_align_item::do_pre_processing();
109 Real pre_space
= elems
[0]->extent (X_AXIS
)[LEFT
]
110 + elems
[0]->relative_coordinate (column_l (), X_AXIS
);
111 Real spring_len
= elems
.top ()->extent (X_AXIS
)[RIGHT
]
112 + elems
.top ()->relative_coordinate (column_l (), X_AXIS
);
114 Real stretch_distance
=0.;
116 if (gh_car (symbol_list
) == ly_symbol2scm ("extra-space"))
118 spring_len
+= dists
.top ();
119 stretch_distance
= dists
.top ();
121 else if (gh_car (symbol_list
) == ly_symbol2scm ("minimum-space"))
123 spring_len
= spring_len
>? dists
.top ();
124 stretch_distance
= spring_len
;
128 Hint the spacing engine how much space to put in.
131 The pairs are in the format of an interval (ie. CAR < CDR).
133 column_l ()->set_elt_property ("extra-space",
134 scm_cons (gh_double2scm (pre_space
),
135 gh_double2scm (spring_len
)));
137 column_l ()->set_elt_property ("stretch-distance",
138 gh_cons (gh_double2scm (-dists
[0]),
139 gh_double2scm (stretch_distance
)));
143 Break_align_item::Break_align_item ()
145 stacking_dir_
= RIGHT
;