#include "text-interface.hh"
#include "warn.hh"
-using std::string;
-using std::vector;
-
Grob *
Paper_column::clone () const
{
extract_grob_set (me, "elements", elts);
for (vsize i = 0; i < elts.size (); i++)
{
- if (elts[i]->get_property ("break-align-symbol") == align_sym
+ if (scm_is_eq (align_sym, elts[i]->get_property ("break-align-symbol"))
+ // TODO SCM: there must be a simpler way to put this.
&& !elts[i]->extent (elts[i], X_AXIS).is_empty ())
{
align = elts[i];
return align->extent (p, X_AXIS);
}
+LY_DEFINE (ly_paper_column__break_align_width, "ly:paper-column::break-align-width",
+ 2, 0, 0, (SCM col, SCM align_syms),
+ "Determine the extent along the X-axis of a grob used for"
+ " break-alignment organized by column @var{col}. The grob is"
+ " specified by @var{align-syms}, which contains either a"
+ " single @code{break-align-symbol} or a list of such"
+ " symbols.")
+{
+ LY_ASSERT_SMOB (Grob, col, 1);
+ SCM_ASSERT_TYPE (scm_is_symbol (align_syms) || ly_is_list (align_syms),
+ align_syms, SCM_ARG2, __FUNCTION__, "symbol or list");
+
+ Interval ext = Paper_column::break_align_width (unsmob<Grob> (col), align_syms);
+ return ly_interval2scm (ext);
+}
+
/*
Loop through elements of a PaperColumn, find all grobs implementing specified
interface and return their combined extent.
return t.smobbed_copy ();
}
+static bool grob_is_live (const Grob *g)
+{
+ return g && g->is_live ();
+}
+
/*
This is all too hairy. We use bounded-by-me to make sure that some
columns are kept "alive". Unfortunately, when spanners are suicided,
{
Grob *me = unsmob<Grob> (grob);
- SCM bbm = me->get_object ("bounded-by-me");
- Grob_array *ga = unsmob<Grob_array> (bbm);
- if (!ga)
- return SCM_UNSPECIFIED;
-
- vector<Grob *> &array (ga->array_reference ());
-
- for (vsize i = array.size (); i--;)
- {
- Grob *g = array[i];
-
- if (!g || !g->is_live ())
- /* UGH . potentially quadratic. */
- array.erase (array.begin () + i);
- }
+ if (Grob_array *ga = unsmob<Grob_array> (me->get_object ("bounded-by-me")))
+ ga->filter (grob_is_live);
return SCM_UNSPECIFIED;
}