void set_empty ();
void set_full ();
+ void unite_disjoint (Interval_t<T> h, T padding, Direction d);
+
bool is_empty () const
{
return at (LEFT) > at (RIGHT);
at (RIGHT) = max (h.at (RIGHT), at (RIGHT));
}
+/* Unites h and this interval, but in such a way
+ that h will lie in a particular direction from this
+ interval, with a minimum amount of space in between.
+ (That is, h will be translated before we unite, if
+ that is necessary to prevent overlap. */
+template<class T>
+void
+Interval_t<T>::unite_disjoint (Interval_t<T> h, T padding, Direction d)
+{
+ T dir = d;
+ T translation = dir * (at (d) + dir * padding - h.at (-d));
+ if (translation > (T) 0)
+ h.translate (translation);
+ unite (h);
+}
+
template<class T>
void
Interval_t<T>::intersect (Interval_t<T> h)
#include "system.hh"
#include "warn.hh"
+
void
Axis_group_interface::add_element (Grob *me, Grob *e)
{
return ext;
}
+
// adjacent-pure-heights is a pair of vectors, each of which has one element
// for every measure in the score. The first vector stores, for each measure,
// the combined height of the elements that are present only when the bar
Grob *me = unsmob_grob (smob);
Grob *common = unsmob_grob (me->get_object ("pure-Y-common"));
- extract_grob_set (me, "pure-relevant-items", items);
- extract_grob_set (me, "pure-relevant-spanners", spanners);
+ extract_grob_set (me, "pure-relevant-grobs", elts);
Paper_score *ps = get_root_system (me)->paper_score ();
- vector<vsize> breaks = ps->get_break_indices ();
- vector<Grob*> cols = ps->get_columns ();
+ vector<vsize> ranks = ps->get_break_ranks ();
- SCM begin_line_heights = scm_c_make_vector (breaks.size () - 1, SCM_EOL);
- SCM mid_line_heights = scm_c_make_vector (breaks.size () - 1, SCM_EOL);
+ vector<Interval> begin_line_heights;
+ vector<Interval> mid_line_heights;
+ begin_line_heights.resize (ranks.size () - 1);
+ mid_line_heights.resize (ranks.size () - 1);
- vsize it_index = 0;
- for (vsize i = 0; i + 1 < breaks.size (); i++)
+ for (vsize i = 0; i < elts.size (); ++i)
{
- int start = Paper_column::get_rank (cols[breaks[i]]);
- int end = Paper_column::get_rank (cols[breaks[i+1]]);
+ Grob *g = elts[i];
- // Take grobs that are visible with respect to a slightly longer line.
- // Otherwise, we will never include grobs at breakpoints which aren't
- // end-of-line-visible.
- int visibility_end = i + 2 < breaks.size () ?
- Paper_column::get_rank (cols[breaks[i+2]]) : end;
+ if (to_boolean (g->get_property ("cross-staff")))
+ continue;
- Interval begin_line_iv;
- Interval mid_line_iv;
+ Interval_t<int> rank_span = g->spanned_rank_interval ();
+ vsize first_break = lower_bound (ranks, (vsize)rank_span[LEFT], less<vsize> ());
+ if (first_break > 0 && ranks[first_break] >= (vsize)rank_span[LEFT])
+ first_break--;
- for (vsize j = it_index; j < items.size (); j++)
+ for (vsize j = first_break; j+1 < ranks.size () && (int)ranks[j] <= rank_span[RIGHT]; ++j)
{
- Item *it = dynamic_cast<Item*> (items[j]);
- int rank = it->get_column ()->get_rank ();
+ int start = ranks[j];
+ int end = ranks[j+1];
- if (rank <= end && it->pure_is_visible (start, visibility_end)
- && !to_boolean (it->get_property ("cross-staff")))
- {
- Interval dims = items[j]->pure_height (common, start, end);
- Interval &target_iv = start == it->get_column ()->get_rank () ? begin_line_iv : mid_line_iv;
-
- if (!dims.is_empty ())
- target_iv.unite (dims);
- }
-
- if (rank < end)
- it_index++;
- else if (rank > end)
- break;
- }
+ // Take grobs that are visible with respect to a slightly longer line.
+ // Otherwise, we will never include grobs at breakpoints which aren't
+ // end-of-line-visible.
+ int visibility_end = j + 2 < ranks.size () ? ranks[j+2] : end;
- for (vsize j = 0; j < spanners.size (); j++)
- {
- Interval_t<int> rank_span = spanners[j]->spanned_rank_interval ();
- if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
- && !to_boolean (spanners[j]->get_property ("cross-staff")))
+ if (g->pure_is_visible (start, visibility_end))
{
- Interval dims = spanners[j]->pure_height (common, start, end);
-
+ Interval dims = g->pure_height (common, start, end);
if (!dims.is_empty ())
{
- mid_line_iv.unite (dims);
if (rank_span[LEFT] <= start)
- begin_line_iv.unite (dims);
+ begin_line_heights[j].unite (dims);
+ if (rank_span[RIGHT] > start)
+ mid_line_heights[j].unite (dims);
}
}
}
+ }
- scm_vector_set_x (begin_line_heights, scm_from_int (i), ly_interval2scm (begin_line_iv));
- scm_vector_set_x (mid_line_heights, scm_from_int (i), ly_interval2scm (mid_line_iv));
+ // Convert begin_line_heights and min_line_heights to SCM.
+ SCM begin_scm = scm_c_make_vector (ranks.size () - 1, SCM_EOL);
+ SCM mid_scm = scm_c_make_vector (ranks.size () - 1, SCM_EOL);
+ for (vsize i = 0; i < begin_line_heights.size (); ++i)
+ {
+ scm_vector_set_x (begin_scm, scm_from_int (i), ly_interval2scm (begin_line_heights[i]));
+ scm_vector_set_x (mid_scm, scm_from_int (i), ly_interval2scm (mid_line_heights[i]));
}
- return scm_cons (begin_line_heights, mid_line_heights);
+
+ return scm_cons (begin_scm, mid_scm);
}
Interval
Unfortunately, it isn't always true, particularly if there is a
VerticalAlignment somewhere in the descendants.
- Apart from PianoStaff, which has a fixed VerticalAlignment so it doesn't
- count, the only VerticalAlignment comes from Score. This makes it
+ Usually, the only VerticalAlignment comes from Score. This makes it
reasonably safe to assume that if our parent is a VerticalAlignment,
we can assume additivity and cache things nicely. */
Grob *p = me->get_parent (Y_AXIS);
return Axis_group_interface::cached_pure_height (me, start, end);
Grob *common = unsmob_grob (me->get_object ("pure-Y-common"));
- extract_grob_set (me, "pure-relevant-items", items);
- extract_grob_set (me, "pure-relevant-spanners", spanners);
+ extract_grob_set (me, "pure-relevant-grobs", elts);
Interval r;
-
- for (vsize i = 0; i < items.size (); i++)
- {
- Item *it = dynamic_cast<Item*> (items[i]);
- int rank = it->get_column ()->get_rank ();
-
- if (rank > end)
- break;
- else if (rank >= start && it->pure_is_visible (start, end)
- && !to_boolean (it->get_property ("cross-staff")))
- {
- Interval dims = it->pure_height (common, start, end);
- if (!dims.is_empty ())
- r.unite (dims);
- }
- }
-
- for (vsize i = 0; i < spanners.size (); i++)
+ for (vsize i = 0; i < elts.size (); i++)
{
- Interval_t<int> rank_span = spanners[i]->spanned_rank_interval ();
+ Grob *g = elts[i];
+ Interval_t<int> rank_span = g->spanned_rank_interval ();
if (rank_span[LEFT] <= end && rank_span[RIGHT] >= start
- && !to_boolean (spanners[i]->get_property ("cross-staff")))
+ && g->pure_is_visible (start, end)
+ && !to_boolean (g->get_property ("cross-staff")))
{
- Interval dims = spanners[i]->pure_height (common, start, end);
+ Interval dims = g->pure_height (common, start, end);
if (!dims.is_empty ())
r.unite (dims);
}
return grobs_scm;
}
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_items, 1);
-SCM
-Axis_group_interface::calc_pure_relevant_items (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
-
- extract_grob_set (me, "pure-relevant-grobs", elts);
-
- vector<Grob*> relevant_items;
- for (vsize i = 0; i < elts.size (); i++)
- if (Item *it = dynamic_cast<Item*> (elts[i]))
- relevant_items.push_back (it);
-
- vector_sort (relevant_items, Item::less);
-
- SCM items_scm = Grob_array::make_array ();
- unsmob_grob_array (items_scm)->set_array (relevant_items);
- return items_scm;
-}
-
-MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_relevant_spanners, 1);
-SCM
-Axis_group_interface::calc_pure_relevant_spanners (SCM smob)
-{
- Grob *me = unsmob_grob (smob);
-
- extract_grob_set (me, "pure-relevant-grobs", elts);
-
- vector<Grob*> relevant_spanners;
- for (vsize i = 0; i < elts.size (); i++)
- if (dynamic_cast<Spanner*> (elts[i]))
- relevant_spanners.push_back (elts[i]);
-
- SCM spanners_scm = Grob_array::make_array ();
- unsmob_grob_array (spanners_scm)->set_array (relevant_spanners);
- return spanners_scm;
-}
-
MAKE_SCHEME_CALLBACK (Axis_group_interface, calc_pure_y_common, 1);
SCM
Axis_group_interface::calc_pure_y_common (SCM smob)
}
}
-bool
+static bool
staff_priority_less (Grob * const &g1, Grob * const &g2)
{
Real priority_1 = robust_scm2double (g1->get_property ("outside-staff-priority"), -infinity_f);
Interval first_line = line_dimensions_int (pscore_->layout (), 0);
Interval other_lines = line_dimensions_int (pscore_->layout (), 1);
/* do all the rod/spring problems */
- breaks_ = pscore_->find_break_indices ();
+ breaks_ = pscore_->get_break_indices ();
all_ = pscore_->root_system ()->used_columns ();
lines_.resize (breaks_.size (), breaks_.size (), Line_details ());
vector<Real> forces = get_line_forces (all_,
return Interval_t<int> (-1, 0);
}
+bool
+Grob::pure_is_visible (int start, int end) const
+{
+ return true;
+}
+
+/* Sort grobs according to their starting column. */
+bool
+Grob::less (Grob *g1, Grob *g2)
+{
+ return g1->spanned_rank_interval ()[LEFT] < g2->spanned_rank_interval ()[LEFT];
+}
+
/****************************************************************
REFPOINTS
****************************************************************/
void fixup_refpoint ();
virtual Interval_t<int> spanned_rank_interval () const;
+ virtual bool pure_is_visible (int start, int end) const;
bool check_cross_staff (Grob *common);
+ static bool less (Grob *g1, Grob *g2);
};
/* smob utilities */
static bool is_non_musical (Grob *);
static bool break_visible(Grob *);
- static bool less (Grob * const&, Grob * const&);
bool is_broken () const;
- bool pure_is_visible (int start, int end) const;
+ virtual bool pure_is_visible (int start, int end) const;
Direction break_status_dir () const;
mutable vector<Grob*> cols_;
mutable vector<vsize> break_indices_;
+ mutable vector<vsize> break_ranks_;
public:
Paper_score (Output_def *);
void typeset_system (System *);
vector<Column_x_positions> calc_breaking ();
- vector<vsize> find_break_indices () const;
vector<vsize> get_break_indices () const;
+ vector<vsize> get_break_ranks () const;
vector<Grob*> get_columns () const;
SCM get_paper_systems ();
protected:
+ void find_break_indices () const;
virtual void process ();
virtual void derived_mark () const;
return cached_pure_height_ + pure_relative_y_coordinate (g, start, end);
}
-bool
-Item::less (Grob * const &g1, Grob * const &g2)
-{
- return dynamic_cast<Item*> (g1)->get_column ()->get_rank () < dynamic_cast<Item*> (g2)->get_column ()->get_rank ();
-}
-
ADD_INTERFACE (Item,
"Grobs can be distinguished in their role in the horizontal"
" spacing. Many grobs define constraints on the spacing by"
system->unprotect ();
}
-
-vector<vsize>
+void
Paper_score::find_break_indices () const
{
- vector<Grob*> all = root_system ()->used_columns ();
- vector<vsize> retval;
+ cols_ = root_system ()->used_columns ();
+ break_indices_.clear ();
+ break_ranks_.clear ();
- for (vsize i = 0; i < all.size (); i++)
+ for (vsize i = 0; i < cols_.size (); i++)
{
- Item *it = dynamic_cast<Item*> (all[i]);
- if (Paper_column::is_breakable (all[i])
+ Item *it = dynamic_cast<Item*> (cols_[i]);
+ if (Paper_column::is_breakable (cols_[i])
&& (i == 0 || it->find_prebroken_piece (LEFT))
- && (i == all.size () - 1 || it->find_prebroken_piece (RIGHT)))
- retval.push_back (i);
+ && (i == cols_.size () - 1 || it->find_prebroken_piece (RIGHT)))
+ {
+ break_indices_.push_back (i);
+ break_ranks_.push_back (it->get_column ()->get_rank ());
+ }
}
-
- cols_ = all;
- break_indices_ = retval;
-
- return retval;
}
vector<vsize>
return cols_;
}
+vector<vsize>
+Paper_score::get_break_ranks () const
+{
+ if (break_ranks_.empty ())
+ find_break_indices ();
+ return break_ranks_;
+}
+
vector<Column_x_positions>
Paper_score::calc_breaking ()
{
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (ambitus-interface
axis-group-interface
break-aligned-interface))))))
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (align-interface
axis-group-interface
bass-figure-alignment-interface))))))
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
side-position-interface))))))
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface))))))
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
dynamic-interface
dynamic-line-spanner-interface
(X-extent . ,ly:axis-group-interface::width)
(meta . ((class . Paper_column)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
font-interface
paper-column-interface
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
note-collision-interface))))))
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
note-column-interface
separation-item-interface))))))
;; (font-size . -6) (font-name . "sans") (Y-extent . #f)
(meta . ((class . Paper_column)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
font-interface
paper-column-interface
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(Y-extent . ,ly:axis-group-interface::height)
(meta . ((class . Item)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (bar-line-interface
font-interface
span-bar-interface))))))
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(Y-extent . ,ly:system::height)
(meta . ((class . System)
(object-callbacks . ((pure-relevant-grobs . ,ly:system::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
(pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
(interfaces . (axis-group-interface
system-interface))))))
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
piano-pedal-interface
side-position-interface))))))
(meta . ((class . Spanner)
(object-callbacks . ((Y-common . ,ly:axis-group-interface::calc-y-common)
(pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)
(pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)))
(interfaces . (align-interface
axis-group-interface))))))
(object-callbacks . (
(X-common . ,ly:axis-group-interface::calc-x-common)
(pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
hara-kiri-group-spanner-interface))))))
(Y-offset . ,ly:side-position-interface::y-aligned-side)
(meta . ((class . Spanner)
(object-callbacks . ((pure-Y-common . ,ly:axis-group-interface::calc-pure-y-common)
- (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)
- (pure-relevant-items . ,ly:axis-group-interface::calc-pure-relevant-items)
- (pure-relevant-spanners . ,ly:axis-group-interface::calc-pure-relevant-spanners)))
+ (pure-relevant-grobs . ,ly:axis-group-interface::calc-pure-relevant-grobs)))
(interfaces . (axis-group-interface
side-position-interface
volta-interface))))))