source file of the GNU LilyPond music typesetter
- (c) 1997--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include <math.h>
#include <libc-extension.hh> // isinf
+#include "self-alignment-interface.hh"
#include "side-position-interface.hh"
#include "axis-group-interface.hh"
#include "warn.hh"
Break_align_interface::do_alignment (Grob *me)
{
Item * item = dynamic_cast<Item*> (me);
-
+ int rank = Paper_column::get_rank (item->get_column ());
Link_array<Grob> elems
= Pointer_group_interface__extract_grobs (me, (Grob*)0,
"elements");
Array<Interval> extents;
-
+
+ int last_nonempty = -1;
for (int i=0; i < elems.size (); i++)
{
Interval y = elems[i]->extent (elems[i], X_AXIS);
extents.push (y);
+ if (!y.empty_b())
+ last_nonempty = i;
}
-
int idx = 0;
while (idx < extents.size () && extents[idx].empty_b ())
idx++;
offsets[i] = 0.0;
+ Real extra_right_space = 0.0;
int edge_idx = -1;
while (idx < elems.size())
{
int next_idx = idx+1;
- while ( next_idx < elems.size() && extents[next_idx].empty_b())
+ while (next_idx < elems.size() &&
+ extents[next_idx].empty_b()
+ )
next_idx++;
-
- if (next_idx == elems.size())
- break;
Grob *l = elems[idx];
- Grob *r = elems[next_idx];
+ Grob *r = 0;
+
+ if (next_idx < elems.size())
+ r = elems[next_idx];
SCM alist = SCM_EOL;
+
+ /*
+ Find the first grob with a space-alist entry.
+ */
for (SCM s= l->get_grob_property ("elements");
gh_pair_p (s) ; s = gh_cdr (s))
{
Grob *elt = unsmob_grob (gh_car (s));
if (edge_idx < 0
- && elt->get_grob_property ("break-align-symbol") == ly_symbol2scm( "left-edge"))
+ && elt->get_grob_property ("break-align-symbol")
+ == ly_symbol2scm( "left-edge"))
edge_idx = idx;
SCM l =elt->get_grob_property ("space-alist");
}
}
- SCM rsym = SCM_EOL;
+ SCM rsym = r ? SCM_EOL : ly_symbol2scm ("right-edge");
/*
We used to use #'cause to find out the symbol and the spacing
table, but that gets icky when that grob is suicided for some
reason.
*/
- for (SCM s = r->get_grob_property ("elements");
- gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = r ? r->get_grob_property ("elements") : SCM_EOL;
+ !gh_symbol_p (rsym) && gh_pair_p (s); s = gh_cdr (s))
{
Grob * elt =unsmob_grob(gh_car (s));
- SCM sym = elt->get_grob_property ("break-align-symbol");
- if (gh_symbol_p (sym))
- {
- rsym = sym;
- break;
- }
+ rsym = elt->get_grob_property ("break-align-symbol");
}
+
if (rsym == ly_symbol2scm("left-edge"))
edge_idx = next_idx;
type = gh_car (entry) ;
}
- if (type == ly_symbol2scm ("extra-space"))
- offsets[next_idx] = extents[idx][RIGHT] + distance;
- else if (type == ly_symbol2scm("minimum-space"))
- offsets[next_idx] = extents[idx][RIGHT] >? distance;
-
+ if (r)
+ {
+ if (type == ly_symbol2scm ("extra-space"))
+ offsets[next_idx] = extents[idx][RIGHT] + distance;
+ else if (type == ly_symbol2scm("minimum-space"))
+ offsets[next_idx] = extents[idx][RIGHT] >? distance;
+ }
+ else
+ {
+ extra_right_space = distance;
+ }
+
idx = next_idx;
}
-
Real here = 0.0;
Interval total_extent;
if (item->break_status_dir () == LEFT)
- alignment_off = -total_extent[RIGHT];
+ {
+ alignment_off = - total_extent[RIGHT] - extra_right_space;
+ }
else if (edge_idx < 0)
alignment_off = -total_extent[LEFT];
ADD_INTERFACE (Break_aligned_interface, "break-aligned-interface",
- "Items that are aligned in prefatory matter.
-
-The spacing of these items is controlled by the space-alist
-property. It contains a list break-align-symbols with a specification
-of the associated space. The space definition is either (extra-space
-. @var{number}), which adds space after the symbol, (minimum-space
-. @var{ms}), which pads the space until it it is @var{ms}.
-
-
-Special keys for the alist are 'first-note and 'next-note, signifyign
-the first note on a line, and the next note halfway a line.
-
-Rules for this spacing are much more complicated than this.
-See [Wanske] page 126 -- 134, [Ross] pg 143 -- 147
-
-
-",
+ //
+"Items that are aligned in prefatory matter.\n"
+"\n"
+"The spacing of these items is controlled by the space-alist\n"
+"property. It contains a list break-align-symbols with a specification\n"
+"of the associated space. The space definition is either (extra-space\n"
+". @var{number}), which adds space after the symbol, (minimum-space\n"
+". @var{ms}), which pads the space until it it is @var{ms}.\n"
+"\n"
+"\n"
+"Special keys for the alist are 'first-note and 'next-note, signifyign\n"
+"the first note on a line, and the next note halfway a line.\n"
+"\n"
+"Rules for this spacing are much more complicated than this. \n"
+"See [Wanske] page 126 -- 134, [Ross] pg 143 -- 147\n",
"break-align-symbol break-alignment-done space-alist");
ADD_INTERFACE (Break_align_interface, "break-alignment-interface",