From: Han-Wen Nienhuys Date: Wed, 29 Nov 2006 20:32:59 +0000 (+0100) Subject: calc skyline properties for separation items. X-Git-Tag: release/2.11.1-1~34 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=e230429843a4d3d5c434e0266f12f90d2a30528f;p=lilypond.git calc skyline properties for separation items. --- diff --git a/lily/include/separation-item.hh b/lily/include/separation-item.hh index c5d7c7106a..1c2ae7ef95 100644 --- a/lily/include/separation-item.hh +++ b/lily/include/separation-item.hh @@ -16,6 +16,9 @@ struct Separation_item { DECLARE_GROB_INTERFACE(); + DECLARE_SCHEME_CALLBACK(calc_skylines, (SCM)); + + static vector boxes (Grob *me); static Interval conditional_width (Grob *, Grob *); static Interval width (Grob *); static Interval relative_width (Grob *, Grob *); diff --git a/lily/separation-item.cc b/lily/separation-item.cc index c9d6739799..535edcac67 100644 --- a/lily/separation-item.cc +++ b/lily/separation-item.cc @@ -8,6 +8,7 @@ #include "separation-item.hh" +#include "skyline.hh" #include "paper-column.hh" #include "warn.hh" #include "pointer-group-interface.hh" @@ -62,6 +63,58 @@ Separation_item::conditional_width (Grob *me, Grob *left) return w; } + +MAKE_SCHEME_CALLBACK(Separation_item,calc_skylines,1); +SCM +Separation_item::calc_skylines (SCM smob) +{ + Item *me = unsmob_item (smob); + SCM lines = scm_cons (SCM_BOOL_F,SCM_BOOL_F); + + Direction d = LEFT; + do + { + Skyline l (boxes (me), X_AXIS, d); + index_set_cell (lines, d, ly_offsets2scm (l.to_points ())); + } + while (flip (&d) != LEFT); + + return lines; +} + + +vector +Separation_item::boxes (Grob *me) +{ + Item *item = dynamic_cast (me); + + int very_large = INT_MAX; + Paper_column *pc = item->get_column (); + vector out; + extract_grob_set (me, "elements", elts); + + Grob *ycommon = common_refpoint_of_array (elts, me, Y_AXIS); + + for (vsize i = 0; i < elts.size (); i++) + { + Item *il = dynamic_cast (elts[i]); + if (pc != il->get_column ()) + { + continue; + } + + if (to_boolean (il->get_property ("no-spacing-rods"))) + continue; + + Box b (il->extent (pc, X_AXIS), + il->pure_height (ycommon, 0, very_large)); + + out.push_back (b); + } + + return out; +} + Interval Separation_item::width (Grob *me) {